diff --git a/.circleci/config.yml b/.circleci/config.yml index 3178a687a617..552aa3305509 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,7 +15,7 @@ executors: NODE_OPTIONS: --max_old_space_size=3072 node-linux-medium: machine: - image: ubuntu-2404:current + image: ubuntu-2404:2024.05.1 resource_class: medium #// linux medium: 2 CPUs, 7.5 GB RAM, 10 credits/min environment: NODE_OPTIONS: --max_old_space_size=6144 @@ -45,11 +45,11 @@ rc_branch_only: &rc_branch_only only: - /^Version-v(\d+)[.](\d+)[.](\d+)/ -develop_master_rc_only: &develop_master_rc_only +main_master_rc_only: &main_master_rc_only filters: branches: only: - - develop + - main - master - /^Version-v(\d+)[.](\d+)[.](\d+)/ @@ -107,7 +107,9 @@ workflows: - matches: pattern: /^l10n_crowdin_action$/ value: << pipeline.git.branch >> - - equal: [rerun-from-failed, << pipeline.schedule.name >>] + - matches: + pattern: /^rerun-from-failed.*/ + value: << pipeline.schedule.name >> jobs: - create_release_pull_request: <<: *rc_branch_only @@ -123,6 +125,8 @@ workflows: branches: ignore: - master + requires: + - prep-deps - test-deps-audit: requires: - prep-deps @@ -172,7 +176,7 @@ workflows: requires: - prep-deps - prep-build-test-flask-mv2: - <<: *develop_master_rc_only + <<: *main_master_rc_only requires: - prep-deps - prep-build-test-mmi: @@ -200,7 +204,7 @@ workflows: requires: - prep-deps - test-e2e-chrome-webpack: - <<: *develop_master_rc_only + <<: *main_master_rc_only requires: - prep-build-test-webpack - get-changed-files-with-git-diff @@ -209,7 +213,7 @@ workflows: - prep-build-test - get-changed-files-with-git-diff - test-e2e-firefox: - <<: *develop_master_rc_only + <<: *main_master_rc_only requires: - prep-build-test-mv2 - get-changed-files-with-git-diff @@ -220,6 +224,7 @@ workflows: - test-api-specs: requires: - prep-build-test + - get-changed-files-with-git-diff - test-e2e-chrome-multiple-providers: requires: - prep-build-test @@ -229,7 +234,7 @@ workflows: - prep-build-test-flask - get-changed-files-with-git-diff - test-e2e-firefox-flask: - <<: *develop_master_rc_only + <<: *main_master_rc_only requires: - prep-build-test-flask-mv2 - test-e2e-chrome-mmi: @@ -250,7 +255,7 @@ workflows: filters: branches: only: - - develop + - main - /^Version-v(\d+)[.](\d+)[.](\d+)/ requires: - prep-build @@ -349,25 +354,27 @@ workflows: - job-publish-storybook: filters: branches: - only: develop + only: main requires: - prep-build-storybook - job-publish-ts-migration-dashboard: filters: branches: - only: develop + only: main requires: - prep-build-ts-migration-dashboard rerun-from-failed: when: - equal: [rerun-from-failed, << pipeline.schedule.name >>] + matches: + pattern: /^rerun-from-failed.*/ + value: << pipeline.schedule.name >> jobs: - prep-deps - rerun-workflows-from-failed: filters: branches: - only: develop + only: main requires: - prep-deps @@ -477,7 +484,7 @@ jobs: # This job is used for the e2e quality gate. # It must be run before any job which uses the run-all.js script. - # The job is skipped in develop, master or RC branches. + # The job is skipped in main, master or RC branches. get-changed-files-with-git-diff: executor: node-browsers-small steps: @@ -487,7 +494,7 @@ jobs: at: . - run: name: Get changed files with git diff - command: npx tsx .circleci/scripts/git-diff-develop.ts + command: yarn git-diff-default-branch - persist_to_workspace: root: . paths: @@ -1335,7 +1342,7 @@ jobs: template: basic_fail_1 channel: C01LUJL3T98 - slack/notify: - branch_pattern: develop + branch_pattern: main event: fail mentions: <@antonio.regadas>, @ramon.acitores134 template: basic_fail_1 @@ -1745,7 +1752,7 @@ jobs: command: echo 'whew - everything passed!' check-mmi-trigger: - executor: node-browsers-medium + executor: node-browsers-small steps: - checkout - run: diff --git a/.circleci/scripts/bundle-stats-commit.sh b/.circleci/scripts/bundle-stats-commit.sh index 14b3604d82ec..1c9f4380f694 100755 --- a/.circleci/scripts/bundle-stats-commit.sh +++ b/.circleci/scripts/bundle-stats-commit.sh @@ -16,9 +16,9 @@ then exit 1 fi -if [[ "${CIRCLE_BRANCH}" != "develop" ]] +if [[ "${CIRCLE_BRANCH}" != "main" ]] then - printf 'This is not develop branch' + printf 'This is not main branch' exit 0 fi diff --git a/.circleci/scripts/check_mmi_trigger.sh b/.circleci/scripts/check_mmi_trigger.sh index c8d6fc44523b..b2a5ca13734d 100755 --- a/.circleci/scripts/check_mmi_trigger.sh +++ b/.circleci/scripts/check_mmi_trigger.sh @@ -9,7 +9,7 @@ if [ -z "$CIRCLE_PULL_REQUEST" ] || [ -z "$GITHUB_TOKEN" ]; then exit 0 fi -if [[ $CIRCLE_BRANCH = 'develop' || $CIRCLE_BRANCH = 'master' || $CIRCLE_BRANCH =~ ^Version-v[0-9.]* ]]; then +if [[ $CIRCLE_BRANCH = 'main' || $CIRCLE_BRANCH = 'master' || $CIRCLE_BRANCH =~ ^Version-v[0-9.]* ]]; then echo "Long-running branch detected, running MMI tests." echo "run_mmi_tests=true" > mmi_trigger.env exit 0 diff --git a/.circleci/scripts/git-diff-develop.ts b/.circleci/scripts/git-diff-default-branch.ts similarity index 89% rename from .circleci/scripts/git-diff-develop.ts rename to .circleci/scripts/git-diff-default-branch.ts index f4437d6154db..269de912dafd 100644 --- a/.circleci/scripts/git-diff-develop.ts +++ b/.circleci/scripts/git-diff-default-branch.ts @@ -10,7 +10,7 @@ const PR_NUMBER = process.env.CIRCLE_PR_NUMBER || process.env.CIRCLE_PULL_REQUEST?.split('/').pop(); -const MAIN_BRANCH = 'develop'; +const GITHUB_DEFAULT_BRANCH = 'main'; const SOURCE_BRANCH = `refs/pull/${PR_NUMBER}/head`; const CHANGED_FILES_DIR = 'changed-files'; @@ -48,7 +48,7 @@ async function getPrInfo(): Promise { */ async function fetchWithDepth(depth: number): Promise { try { - await exec(`git fetch --depth ${depth} origin "${MAIN_BRANCH}"`); + await exec(`git fetch --depth ${depth} origin "${GITHUB_DEFAULT_BRANCH}"`); await exec( `git fetch --depth ${depth} origin "${SOURCE_BRANCH}:${SOURCE_BRANCH}"`, ); @@ -84,7 +84,7 @@ async function fetchUntilMergeBaseFound() { } } } - await exec(`git fetch --unshallow origin "${MAIN_BRANCH}"`); + await exec(`git fetch --unshallow origin "${GITHUB_DEFAULT_BRANCH}"`); } /** @@ -123,9 +123,7 @@ async function storeGitDiffOutputAndPrBody() { // even if we want to skip this step. fs.mkdirSync(CHANGED_FILES_DIR, { recursive: true }); - console.log( - `Determining whether to run git diff...`, - ); + console.log(`Determining whether to run git diff...`); if (!PR_NUMBER) { console.log('Not a PR, skipping git diff'); return; @@ -137,11 +135,13 @@ async function storeGitDiffOutputAndPrBody() { if (!baseRef) { console.log('Not a PR, skipping git diff'); return; - } else if (baseRef !== MAIN_BRANCH) { + } else if (baseRef !== GITHUB_DEFAULT_BRANCH) { console.log(`This is for a PR targeting '${baseRef}', skipping git diff`); writePrBodyToFile(prInfo.body); return; - } else if (prInfo.labels.some(label => label.name === 'skip-e2e-quality-gate')) { + } else if ( + prInfo.labels.some((label) => label.name === 'skip-e2e-quality-gate') + ) { console.log('PR has the skip-e2e-quality-gate label, skipping git diff'); return; } @@ -164,4 +164,7 @@ async function storeGitDiffOutputAndPrBody() { } } -storeGitDiffOutputAndPrBody(); +// If main module (i.e. this is the TS file that was run directly) +if (require.main === module) { + storeGitDiffOutputAndPrBody(); +} diff --git a/.circleci/scripts/rerun-ci-workflow-from-failed.ts b/.circleci/scripts/rerun-ci-workflow-from-failed.ts index 84827f11fd13..3c1826a4971e 100644 --- a/.circleci/scripts/rerun-ci-workflow-from-failed.ts +++ b/.circleci/scripts/rerun-ci-workflow-from-failed.ts @@ -1,4 +1,5 @@ const CIRCLE_TOKEN = process.env.API_V2_TOKEN; +const GITHUB_DEFAULT_BRANCH = 'main'; interface Actor { login: string; @@ -59,7 +60,7 @@ interface WorkflowStatusResponse { * Note: the API returns the first 20 workflows by default. * If we wanted to get older workflows, we would need to use the 'page-token' we would get in the first response * and perform a subsequent request with the 'page-token' parameter. - * This seems unnecessary as of today, as the amount of daily PRs merged to develop is not that high. + * This seems unnecessary as of today, as the amount of daily PRs merged to main is not that high. * * @returns {Promise} A promise that resolves to an array of workflow items. * @throws Will throw an error if the CircleCI token is not defined or if the HTTP request fails. @@ -177,7 +178,7 @@ async function rerunWorkflowById(workflowId: string) { } /** - * Re-runs failed CircleCI workflows from develop branch. + * Re-runs failed CircleCI workflows from default branch. * The workflow will only be re-runed if: * 1. It has the status of 'failed' * 2. It has only been run once @@ -186,9 +187,9 @@ async function rerunWorkflowById(workflowId: string) { * * @throws Will throw an error if fetching the workflows or re-running a workflow fails. */ -async function rerunFailedWorkflowsFromDevelop() { - console.log('Getting Circle Ci workflows from develop branch...'); - const workflows = await getCircleCiWorkflowsByBranch('develop'); +async function rerunFailedWorkflowsFromDefaultBranch() { + console.log('Getting Circle Ci workflows from main branch...'); + const workflows = await getCircleCiWorkflowsByBranch(GITHUB_DEFAULT_BRANCH); console.log('Assessing if any of the workflows needs to be rerun...'); for (const item of workflows) { @@ -204,7 +205,7 @@ async function rerunFailedWorkflowsFromDevelop() { console.log('Task completed successfully!'); } -rerunFailedWorkflowsFromDevelop() +rerunFailedWorkflowsFromDefaultBranch() .catch((error) => { console.error(error); process.exitCode = 1; diff --git a/.circleci/scripts/test-run-e2e-timeout-minutes.ts b/.circleci/scripts/test-run-e2e-timeout-minutes.ts index c539133b0c60..c486224139c3 100644 --- a/.circleci/scripts/test-run-e2e-timeout-minutes.ts +++ b/.circleci/scripts/test-run-e2e-timeout-minutes.ts @@ -1,8 +1,23 @@ +import { fetchManifestFlagsFromPRAndGit } from '../../development/lib/get-manifest-flag'; import { filterE2eChangedFiles } from '../../test/e2e/changedFilesUtil'; -const changedOrNewTests = filterE2eChangedFiles(); +fetchManifestFlagsFromPRAndGit().then((manifestFlags) => { + let timeout; -// 20 minutes, plus 3 minutes for every changed file, up to a maximum of 30 minutes -const extraTime = Math.min(20 + changedOrNewTests.length * 3, 30); + if (manifestFlags.circleci?.timeoutMinutes) { + timeout = manifestFlags.circleci?.timeoutMinutes; + } else { + const changedOrNewTests = filterE2eChangedFiles(); -console.log(extraTime); + // 20 minutes, plus 3 minutes for every changed file, up to a maximum of 30 minutes + timeout = Math.min(20 + changedOrNewTests.length * 3, 30); + } + + // If this is the Merge Queue, add 10 minutes + if (process.env.CIRCLE_BRANCH?.startsWith('gh-readonly-queue')) { + timeout += 10; + } + + // This is an essential log, that feeds into a bash script + console.log(timeout); +}); diff --git a/.devcontainer/download-builds.ts b/.devcontainer/download-builds.ts index 83e1822379a1..5408bba8d69f 100644 --- a/.devcontainer/download-builds.ts +++ b/.devcontainer/download-builds.ts @@ -7,7 +7,7 @@ function getGitBranch() { const gitOutput = execSync('git status').toString(); const branchRegex = /On branch (?.*)\n/; - return gitOutput.match(branchRegex)?.groups?.branch || 'develop'; + return gitOutput.match(branchRegex)?.groups?.branch || 'main'; } async function getCircleJobs(branch: string) { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f37a101e6cb2..ad36b9b96efd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,6 @@ # Lines starting with '#' are comments. + +# GUIDELINES: # Each line is a file pattern followed by one or more owners. # Owners bear a responsibility to the organization and the users of this # application. Repository administrators have the ability to merge pull @@ -7,8 +9,10 @@ # follows all policies or without full understanding of the impact of # those changes on build, release and publishing outcomes. -* @MetaMask/extension-devs -development/ @MetaMask/extension-devs @kumavis +# LavaMoat policy changes can highlight security risks. Teams are encouraged to +# audit these changes on their own, and leave their analysis in a comment. +# These codeowners will review this analysis, and review the policy changes in +# further detail if warranted. lavamoat/ @MetaMask/extension-devs @MetaMask/supply-chain # The offscreen.ts script file that is included in the offscreen document html @@ -28,7 +32,7 @@ offscreen/scripts/offscreen.ts @MetaMask/snaps-devs # empower our CI steps. ANY addition of orbs to our CircleCI config # should be brought to the attention of engineering leadership for # discussion -.circleci/ @MetaMask/library-admins @kumavis +.circleci/ @MetaMask/extension-security-team # The privacy-snapshot.json file includes a list of all hosts that the # extension communicates with during the E2E test suite runs. It is not a @@ -45,11 +49,11 @@ privacy-snapshot.json @MetaMask/extension-privacy-reviewers # of contributors. Modifications to this file result in a modification of # that agreement and can only be approved by those with the knowledge # and responsibility to publish libraries under the MetaMask name. -.github/CODEOWNERS @MetaMask/library-admins @kumavis +.github/CODEOWNERS @MetaMask/extension-security-team # For now, restricting approvals inside the .devcontainer folder to devs # who were involved with the Codespaces project. -.devcontainer/ @MetaMask/library-admins @HowardBraham @plasmacorral +.devcontainer/ @MetaMask/extension-security-team @HowardBraham # Confirmations team to own code for confirmations on UI. app/scripts/lib/ppom @MetaMask/confirmations @@ -69,14 +73,11 @@ ui/selectors/institutional @MetaMask/mmi # Slack handle: @metamask-design-system-team | Slack channel: #metamask-design-system ui/components/component-library @MetaMask/design-system-engineers -# The Notifications team is responsible for code related to notifications, -# authentication, and profile syncing inside the Extension. +# The Notifications team is responsible for code related to notifications # Controllers -**/controllers/authentication/** @MetaMask/notifications **/controllers/metamask-notifications/** @MetaMask/notifications **/controllers/push-platform-notifications/** @MetaMask/notifications -**/controllers/user-storage/** @MetaMask/notifications # UI **/metamask-notifications/** @MetaMask/notifications @@ -84,15 +85,28 @@ ui/components/component-library @MetaMask/design-system-engineers **/pages/notification*/** @MetaMask/notifications **/utils/notification.util.ts @MetaMask/notifications +# Identity team is responsible for authentication and profile syncing inside the Extension. +# Slack handle: @identity_team | Slack channel: #metamask-identity +**/identity/** @MetaMask/identity +ui/pages/settings/security-tab/profile-sync-toggle @MetaMask/identity + + # Accounts team is responsible for code related with snap management accounts # Slack handle: @accounts-team-devs | Slack channel: #metamask-accounts-team app/scripts/lib/snap-keyring @MetaMask/accounts-engineers -# Swaps team to own code for the swaps folder +# Swaps-Bridge team to own code for the swaps folder ui/pages/swaps @MetaMask/swaps-engineers app/scripts/controllers/swaps @MetaMask/swaps-engineers +# Swaps-Bridge team to own code for the bridge folder +**/bridge/** @MetaMask/swaps-engineers +**/bridge-status/** @MetaMask/swaps-engineers + +# Ramps team to own code for the ramps folder +**/ramps/** @MetaMask/ramp + # Snaps **/snaps/** @MetaMask/snaps-devs shared/constants/permissions.ts @MetaMask/snaps-devs diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 894c13b90238..41d6433db7d7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -13,14 +13,14 @@ If you're picking up a bounty or an existing issue, feel free to ask clarifying ### 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-extension/blob/develop/.github/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. +- [ ] **Make sure you followed our [`coding guidelines`](https://github.com/MetaMask/metamask-extension/blob/main/.github/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. - [ ] **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, fill out the "Related issues" section with `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 `develop`**: Submit your PR against the `develop` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production. If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging. +- [ ] **PR against `main`**: Submit your PR against the `main` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production. If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging. - [ ] **Get reviewed by MetaMask Internal Developers**: All PRs require 2 approvals from MetaMask Internal Developers before merging. -- [ ] **Ensure the PR is correctly labeled.**: More detail about PR labels can be found [here](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md). +- [ ] **Ensure the PR is correctly labeled.**: More detail about PR labels can be found [here](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md). - [ ] **PR Titles**: Must adhere to the [Conventional Commits specification](https://www.conventionalcommits.org) - `[optional scope]: ` - Example: `feat(parser): add ability to parse arrays` diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 2b72c66524bd..a914f61ef82b 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -57,7 +57,8 @@ body: - In production (default) - In beta - During release testing - - On the development branch + - On main branch + - On a feature branch validations: required: true - type: input diff --git a/.github/guidelines/LABELING_GUIDELINES.md b/.github/guidelines/LABELING_GUIDELINES.md index 02081367bb5e..86affe59b646 100644 --- a/.github/guidelines/LABELING_GUIDELINES.md +++ b/.github/guidelines/LABELING_GUIDELINES.md @@ -14,7 +14,8 @@ It's essential to ensure that PRs have the appropriate labels before they are co - **regression-RC-x.y.z**: This label is manually added to a bug report issue by release engineers when a bug is found during release regerssion testing phase. The `x.y.z` in the label represents the release candidate (RC) version in which the bug's been discovered. ### Optional labels: -- **regression-develop**: This label can manually be added to a bug report issue at the time of its creation if the bug is present on the development branch, i.e., `develop`, but is not yet released in production. +- **regression-main**: This label can manually be added to a bug report issue at the time of its creation if the bug is present on the development branch, i.e., `main`, but is not yet released in production. +- **feature-branch-bug**: This label can manually be added to a bug report issue at the time of its creation if the bug is present on a feature branch, i.e., before merging to `main`. - **needs-qa**: If the PR includes a new features, complex testing steps, or large refactors, this label must be added to indicated PR requires a full manual QA prior being merged and added to a release. ### Labels prohibited when PR needs to be merged: diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md index 59232248ef51..044f83571fc6 100644 --- a/.github/pull-request-template.md +++ b/.github/pull-request-template.md @@ -38,11 +38,11 @@ Fixes: ## **Pre-merge author checklist** -- [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). +- [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable -- [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. +- [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** diff --git a/.github/scripts/check-pr-has-required-labels.ts b/.github/scripts/check-pr-has-required-labels.ts index 354dc2c2aa7d..fcce4dd23a82 100644 --- a/.github/scripts/check-pr-has-required-labels.ts +++ b/.github/scripts/check-pr-has-required-labels.ts @@ -73,7 +73,7 @@ async function main(): Promise { if (!hasTeamLabel) { errorMessage += 'No team labels found on the PR. '; } - errorMessage += `Please make sure the PR is appropriately labeled before merging it.\n\nSee labeling guidelines for more detail: https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md`; + errorMessage += `Please make sure the PR is appropriately labeled before merging it.\n\nSee labeling guidelines for more detail: https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md`; core.setFailed(errorMessage); process.exit(1); } diff --git a/.github/scripts/check-template-and-add-labels.ts b/.github/scripts/check-template-and-add-labels.ts index ed22e98dc9a1..25cce0998fa7 100644 --- a/.github/scripts/check-template-and-add-labels.ts +++ b/.github/scripts/check-template-and-add-labels.ts @@ -22,7 +22,8 @@ import { TemplateType, templates } from './shared/template'; import { retrievePullRequest } from './shared/pull-request'; enum RegressionStage { - Development, + DevelopmentFeature, + DevelopmentMain, Testing, Beta, Production @@ -132,7 +133,7 @@ async function main(): Promise { } else { const errorMessage = - "Issue body does not match any of expected templates ('general-issue.yml' or 'bug-report.yml').\n\nMake sure issue's body includes all section titles.\n\nSections titles are listed here: https://github.com/MetaMask/metamask-extension/blob/develop/.github/scripts/shared/template.ts#L14-L37"; + "Issue body does not match any of expected templates ('general-issue.yml' or 'bug-report.yml').\n\nMake sure issue's body includes all section titles.\n\nSections titles are listed here: https://github.com/MetaMask/metamask-extension/blob/main/.github/scripts/shared/template.ts#L14-L37"; console.log(errorMessage); // Add label to indicate issue doesn't match any template @@ -152,7 +153,7 @@ async function main(): Promise { ); } else { const errorMessage = - `PR body does not match template ('pull-request-template.md').\n\nMake sure PR's body includes all section titles.\n\nSections titles are listed here: https://github.com/MetaMask/metamask-extension/blob/develop/.github/scripts/shared/template.ts#L40-L47`; + `PR body does not match template ('pull-request-template.md').\n\nMake sure PR's body includes all section titles.\n\nSections titles are listed here: https://github.com/MetaMask/metamask-extension/blob/main/.github/scripts/shared/template.ts#L40-L47`; console.log(errorMessage); // Add label to indicate PR body doesn't match template @@ -217,8 +218,10 @@ function extractRegressionStageFromBugReportIssueBody( const extractedAnswer = match ? match[1].trim() : undefined; switch (extractedAnswer) { - case 'On the development branch': - return RegressionStage.Development; + case 'On a feature branch': + return RegressionStage.DevelopmentFeature; + case 'On main branch': + return RegressionStage.DevelopmentMain; case 'During release testing': return RegressionStage.Testing; case 'In beta': @@ -332,11 +335,18 @@ async function userBelongsToMetaMaskOrg( // This function crafts appropriate label, corresponding to regression stage and release version. function craftRegressionLabel(regressionStage: RegressionStage | undefined, releaseVersion: string | undefined): Label { switch (regressionStage) { - case RegressionStage.Development: + case RegressionStage.DevelopmentFeature: return { - name: `regression-develop`, + name: `feature-branch-bug`, color: '5319E7', // violet - description: `Regression bug that was found on development branch, but not yet present in production`, + description: `bug that was found on a feature branch, but not yet merged in main branch`, + }; + + case RegressionStage.DevelopmentMain: + return { + name: `regression-main`, + color: '5319E7', // violet + description: `Regression bug that was found on main branch, but not yet present in production`, }; case RegressionStage.Testing: @@ -364,7 +374,7 @@ function craftRegressionLabel(regressionStage: RegressionStage | undefined, rele return { name: `regression-*`, color: 'EDEDED', // grey - description: `TODO: Unknown regression stage. Please replace with correct regression label: 'regression-develop', 'regression-RC-x.y.z', or 'regression-prod-x.y.z' label, where 'x.y.z' is the number of the release where bug was found.`, + description: `TODO: Unknown regression stage. Please replace with correct regression label: 'regression-main', 'regression-RC-x.y.z', or 'regression-prod-x.y.z' label, where 'x.y.z' is the number of the release where bug was found.`, }; } } diff --git a/.github/workflows/add-mmi-reviewer-and-notify.yml b/.github/workflows/add-mmi-reviewer-and-notify.yml index 8821ccbd36e9..8372217bce70 100644 --- a/.github/workflows/add-mmi-reviewer-and-notify.yml +++ b/.github/workflows/add-mmi-reviewer-and-notify.yml @@ -3,7 +3,7 @@ name: Notify MMI team via Slack on: pull_request_target: branches: - - develop + - main types: - opened - reopened @@ -45,4 +45,4 @@ jobs: ] } env: - SLACK_WEBHOOK_URL: ${{ secrets.MMI_LABEL_SLACK_WEBHOOK_URL }} \ No newline at end of file + SLACK_WEBHOOK_URL: ${{ secrets.MMI_LABEL_SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/add-release-label.yml b/.github/workflows/add-release-label.yml index 94ba76fcefa0..2e34ad491b44 100644 --- a/.github/workflows/add-release-label.yml +++ b/.github/workflows/add-release-label.yml @@ -3,7 +3,7 @@ name: Add release label to PR and linked issues when PR gets merged on: pull_request: branches: - - develop + - main types: - closed diff --git a/.github/workflows/check-attributions.yml b/.github/workflows/check-attributions.yml index 4880cc65ebe8..cadaf0d1141b 100644 --- a/.github/workflows/check-attributions.yml +++ b/.github/workflows/check-attributions.yml @@ -3,13 +3,6 @@ name: Check Attributions on: push: branches: Version-v* - pull_request: - branches: Version-v* - types: - - opened - - reopened - - synchronize - - ready_for_review jobs: check-attributions: diff --git a/.github/workflows/check-pr-labels.yml b/.github/workflows/check-pr-labels.yml index 19c0576feaae..cc492c09319e 100644 --- a/.github/workflows/check-pr-labels.yml +++ b/.github/workflows/check-pr-labels.yml @@ -2,7 +2,7 @@ name: Check PR has required labels on: pull_request: branches: - - develop + - main types: - opened - reopened diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 73670c46d75d..a4b5bef7c9e7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,10 +13,10 @@ name: "CodeQL" on: push: - branches: [ develop, Version-v*, cla-signatures, master, snaps ] + branches: [ main, Version-v*, cla-signatures, master, snaps ] pull_request: # The branches below must be a subset of the branches above - branches: [ develop ] + branches: [ main ] schedule: - cron: '28 12 * * 0' diff --git a/.github/workflows/codespaces.yml b/.github/workflows/codespaces.yml index 3455e2db54d4..5d37ba2d3dc3 100644 --- a/.github/workflows/codespaces.yml +++ b/.github/workflows/codespaces.yml @@ -4,7 +4,7 @@ on: push: branches: - 'codespaces**' - - 'develop' + - 'main' paths: - '**/yarn.lock' diff --git a/.github/workflows/crowdin-action.yml b/.github/workflows/crowdin-action.yml index 94bd8016cd4f..1a902087ad61 100644 --- a/.github/workflows/crowdin-action.yml +++ b/.github/workflows/crowdin-action.yml @@ -7,7 +7,7 @@ permissions: on: push: branches: - - develop + - main schedule: - cron: "0 */12 * * *" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f3cc68bebcec..c7907455701d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,7 +3,7 @@ name: Main on: push: branches: - - develop + - main - master pull_request: types: @@ -32,12 +32,17 @@ jobs: name: Run tests uses: ./.github/workflows/run-tests.yml + wait-for-circleci-workflow-status: + name: Wait for CircleCI workflow status + uses: ./.github/workflows/wait-for-circleci-workflow-status.yml + all-jobs-completed: name: All jobs completed runs-on: ubuntu-latest needs: - check-workflows - run-tests + - wait-for-circleci-workflow-status outputs: PASSED: ${{ steps.set-output.outputs.PASSED }} steps: @@ -58,3 +63,16 @@ jobs: if [[ $passed != "true" ]]; then exit 1 fi + + log-merge-group-failure: + name: Log merge group failure + # Only run this job if the merge group event fails, skip on forks + if: ${{ github.event_name == 'merge_group' && failure() && !github.event.repository.fork }} + needs: + - all-jobs-pass + uses: metamask/github-tools/.github/workflows/log-merge-group-failure.yml@6bbad335a01fce1a9ec1eabd9515542c225d46c0 + secrets: + GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} + GOOGLE_SERVICE_ACCOUNT: ${{ secrets.GOOGLE_SERVICE_ACCOUNT }} + SPREADSHEET_ID: ${{ secrets.GOOGLE_MERGE_QUEUE_SPREADSHEET_ID }} + SHEET_NAME: ${{ secrets.GOOGLE_MERGE_QUEUE_SHEET_NAME }} diff --git a/.github/workflows/security-code-scanner.yml b/.github/workflows/security-code-scanner.yml index 7da1773d666c..cf0b60cf84ac 100644 --- a/.github/workflows/security-code-scanner.yml +++ b/.github/workflows/security-code-scanner.yml @@ -2,9 +2,9 @@ name: "MetaMask Security Code Scanner" on: push: - branches: [ 'develop' ] + branches: [ 'main' ] pull_request: - branches: [ 'develop' ] + branches: [ 'main' ] jobs: run-security-scan: diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 8b12876de1cd..9c8681bc8824 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -3,6 +3,9 @@ # actions that may result in code from that branch being executed # such as installing dependencies or running build scripts. +# For security reasons, this file always uses the latest version from the default branch. +# Changes made in feature branches or forks will not take effect until they are merged. + name: SonarCloud on: @@ -17,9 +20,9 @@ permissions: jobs: sonarcloud: - # Only scan code from non-forked repositories that have passed the tests + # Only scan code from non-forked repositories that have completed successfully using the push and pull_request events # This will skip scanning the code for forks, but will run for the main repository on PRs from forks - if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.repository.fork == false }} + if: ${{ github.event.workflow_run.conclusion == 'success' && contains(fromJSON('["push", "pull_request"]'), github.event.workflow_run.event) && !github.event.workflow_run.repository.fork }} name: SonarCloud runs-on: ubuntu-latest steps: @@ -50,6 +53,23 @@ jobs: fi echo "$sonar_project_properties" > sonar-project.properties + - name: Update sonar-project.properties with branch information + env: + EVENT: ${{ github.event.workflow_run.event }} + HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }} + BASE_BRANCH: ${{ github.event.workflow_run.pull_requests[0].base.ref || '' }} + PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number || '' }} + run: | + if [ "$EVENT" == "pull_request" ]; then + { + echo "sonar.pullrequest.branch=$HEAD_BRANCH" + echo "sonar.pullrequest.base=$BASE_BRANCH" + echo "sonar.pullrequest.key=$PR_NUMBER" + } >> sonar-project.properties + else + echo "sonar.branch.name=$HEAD_BRANCH" >> sonar-project.properties + fi + - name: SonarCloud Scan # This is SonarSource/sonarcloud-github-action@v2.0.0 uses: SonarSource/sonarcloud-github-action@4b4d7634dab97dcee0b75763a54a6dc92a9e6bc1 diff --git a/.github/workflows/update-coverage.yml b/.github/workflows/update-coverage.yml index fd1b0d5134e3..e65cdcbe978b 100644 --- a/.github/workflows/update-coverage.yml +++ b/.github/workflows/update-coverage.yml @@ -43,4 +43,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.LAVAMOAT_UPDATE_TOKEN }} run: | - gh pr create --title "chore: Update coverage.json" --body "This PR is automatically opened to update the coverage.json file when test coverage increases. Coverage increased from $STORED_COVERAGE% to $CURRENT_COVERAGE%." --base develop --head metamaskbot/update-coverage || gh pr edit --body "This PR is automatically opened to update the coverage.json file when test coverage increases. Coverage increased from $STORED_COVERAGE% to $CURRENT_COVERAGE%." + gh pr create --title "chore: Update coverage.json" --body "This PR is automatically opened to update the coverage.json file when test coverage increases. Coverage increased from $STORED_COVERAGE% to $CURRENT_COVERAGE%." --base main --head metamaskbot/update-coverage || gh pr edit --body "This PR is automatically opened to update the coverage.json file when test coverage increases. Coverage increased from $STORED_COVERAGE% to $CURRENT_COVERAGE%." diff --git a/.github/workflows/validate-conventional-commits.yml b/.github/workflows/validate-conventional-commits.yml index 8cb416844339..b8b5c56eabb6 100644 --- a/.github/workflows/validate-conventional-commits.yml +++ b/.github/workflows/validate-conventional-commits.yml @@ -2,7 +2,7 @@ name: Validate Conventional Commit Title on: pull_request: branches: - - develop + - main types: [opened, edited, reopened, synchronize] jobs: diff --git a/.github/workflows/wait-for-circleci-workflow-status.yml b/.github/workflows/wait-for-circleci-workflow-status.yml new file mode 100644 index 000000000000..18e5ef7825d5 --- /dev/null +++ b/.github/workflows/wait-for-circleci-workflow-status.yml @@ -0,0 +1,30 @@ +name: Wait for CircleCI workflow status + +on: + workflow_call: + +jobs: + wait-for-circleci-workflow-status: + name: Wait for CircleCI workflow status + runs-on: ubuntu-latest + steps: + - name: Wait for CircleCI workflow status + env: + OWNER: ${{ github.repository_owner }} + REPOSITORY: ${{ github.event.repository.name }} + BRANCH: ${{ github.head_ref || github.ref_name }} + run: | + pipeline_id=$(curl --silent "https://circleci.com/api/v2/project/gh/$OWNER/$REPOSITORY/pipeline?branch=$BRANCH" | jq -r ".items[0].id") + workflow_status=$(curl --silent "https://circleci.com/api/v2/pipeline/$pipeline_id/workflow" | jq -r ".items[0].status") + + if [ "$workflow_status" == "running" ]; then + while [ "$workflow_status" == "running" ]; do + sleep 30 + workflow_status=$(curl --silent "https://circleci.com/api/v2/pipeline/$pipeline_id/workflow" | jq -r ".items[0].status") + done + fi + + if [ "$workflow_status" != "success" ]; then + echo "::error::Workflow status is '$workflow_status'. Exiting with error." + exit 1 + fi diff --git a/.gitignore b/.gitignore index 074f4076a7cc..6ee150dd8653 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.yalc +yalc.lock + npm-debug.log yarn-error.log node_modules diff --git a/.storybook/index.css b/.storybook/index.css new file mode 100644 index 000000000000..48ebae78fe46 --- /dev/null +++ b/.storybook/index.css @@ -0,0 +1,18 @@ +/* Fixes for any styles that are not compatible with Storybook */ + +.create-snap-account-page, .remove-snap-account-page, .snap-ui-renderer { + width: 100% !important; +} + +.snap-ui-renderer__footer-centered { + position: initial !important; + margin-top: auto !important; +} + +.snap-ui-renderer__container { + padding-bottom: 0 !important; +} + +.snap-ui-renderer__panel { + overflow-y: auto !important; +} diff --git a/.storybook/preview.js b/.storybook/preview.js index 525c364f2072..fc23daec5533 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -21,6 +21,7 @@ import { metamaskStorybookTheme } from './metamask-storybook-theme'; import { DocsContainer } from '@storybook/addon-docs'; import { themes } from '@storybook/theming'; import { AlertMetricsProvider } from '../ui/components/app/alert-system/contexts/alertMetricsContext'; +import './index.css'; // eslint-disable-next-line /* @ts-expect-error: Avoids error from window property not existing */ @@ -185,7 +186,6 @@ const withColorScheme = (Story, context) => {
- - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/app/images/avax-token.svg b/app/images/avax-token.svg index 55473a0f2400..ea08a9c1a0ee 100644 --- a/app/images/avax-token.svg +++ b/app/images/avax-token.svg @@ -1,4 +1,5 @@ - - - + + + + diff --git a/app/images/b3.svg b/app/images/b3.svg new file mode 100644 index 000000000000..eb2c4dcfd9d2 --- /dev/null +++ b/app/images/b3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/images/base.svg b/app/images/base.svg index 22d89358f633..114aeb900f1b 100644 --- a/app/images/base.svg +++ b/app/images/base.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/app/images/bnb.svg b/app/images/bnb.svg index b1f1841b84e0..e2ba1e86cea1 100644 --- a/app/images/bnb.svg +++ b/app/images/bnb.svg @@ -1,3 +1,7 @@ - - + + + + + + diff --git a/app/images/eth_logo.svg b/app/images/eth_logo.svg index 5bffa07d0ff5..0b1e0ed3ad77 100644 --- a/app/images/eth_logo.svg +++ b/app/images/eth_logo.svg @@ -1,9 +1,17 @@ - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/app/images/hollow-circle.svg b/app/images/hollow-circle.svg new file mode 100644 index 000000000000..3490e8439b5e --- /dev/null +++ b/app/images/hollow-circle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/images/linea-logo-mainnet.svg b/app/images/linea-logo-mainnet.svg index bb56377bd349..c92953d73938 100644 --- a/app/images/linea-logo-mainnet.svg +++ b/app/images/linea-logo-mainnet.svg @@ -1,11 +1,11 @@ - - - - + + + + - + diff --git a/app/images/optimism.svg b/app/images/optimism.svg index 2e5ce3103d08..6ee446335bb2 100644 --- a/app/images/optimism.svg +++ b/app/images/optimism.svg @@ -1,5 +1,13 @@ - - - - + + + + + + + + + + + + diff --git a/app/images/pol-token.svg b/app/images/pol-token.svg index 10b192a9fa15..5c750420f80c 100644 --- a/app/images/pol-token.svg +++ b/app/images/pol-token.svg @@ -1,21 +1,4 @@ - - - - - - - - - - - - + + + diff --git a/app/images/slide-bridge-icon.svg b/app/images/slide-bridge-icon.svg new file mode 100644 index 000000000000..de2be9745504 --- /dev/null +++ b/app/images/slide-bridge-icon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/app/images/slide-card-icon.svg b/app/images/slide-card-icon.svg new file mode 100644 index 000000000000..32dd386ea6ce --- /dev/null +++ b/app/images/slide-card-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/app/images/slide-fund-icon.svg b/app/images/slide-fund-icon.svg new file mode 100644 index 000000000000..80f8e3b42e79 --- /dev/null +++ b/app/images/slide-fund-icon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/app/images/slide-sell-icon.svg b/app/images/slide-sell-icon.svg new file mode 100644 index 000000000000..daed4190a05a --- /dev/null +++ b/app/images/slide-sell-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/app/images/zk-sync.svg b/app/images/zk-sync.svg index 55021930f1da..ea60764b484c 100644 --- a/app/images/zk-sync.svg +++ b/app/images/zk-sync.svg @@ -1,14 +1,5 @@ - - - - - - - - - + + + + diff --git a/app/scripts/background.js b/app/scripts/background.js index 938cac879f25..c6a3bccd46aa 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -15,11 +15,7 @@ import log from 'loglevel'; import browser from 'webextension-polyfill'; import { storeAsStream } from '@metamask/obs-store'; import { isObject } from '@metamask/utils'; -import { ApprovalType } from '@metamask/controller-utils'; import PortStream from 'extension-port-stream'; - -import { providerErrors } from '@metamask/rpc-errors'; -import { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods'; import { NotificationServicesController } from '@metamask/notification-services-controller'; import { @@ -29,9 +25,6 @@ import { EXTENSION_MESSAGES, PLATFORM_FIREFOX, MESSAGE_TYPE, - ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) - SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES, - ///: END:ONLY_INCLUDE_IF } from '../../shared/constants/app'; import { REJECT_NOTIFICATION_CLOSE, @@ -747,6 +740,49 @@ function trackDappView(remotePort) { } } +/** + * Emit App Opened event + */ +function emitAppOpenedMetricEvent() { + const { metaMetricsId, participateInMetaMetrics } = + controller.metaMetricsController.state; + + // Skip if user hasn't opted into metrics + if (metaMetricsId === null && !participateInMetaMetrics) { + return; + } + + controller.metaMetricsController.trackEvent({ + event: MetaMetricsEventName.AppOpened, + category: MetaMetricsEventCategory.App, + }); +} + +/** + * This function checks if the app is being opened + * and emits an event only if no other UI instances are currently open. + * + * @param {string} environment - The environment type where the app is opening + */ +function trackAppOpened(environment) { + // List of valid environment types to track + const environmentTypeList = [ + ENVIRONMENT_TYPE_POPUP, + ENVIRONMENT_TYPE_NOTIFICATION, + ENVIRONMENT_TYPE_FULLSCREEN, + ]; + + // Check if any UI instances are currently open + const isFullscreenOpen = Object.values(openMetamaskTabsIDs).some(Boolean); + const isAlreadyOpen = + isFullscreenOpen || notificationIsOpen || openPopupCount > 0; + + // Only emit event if no UI is open and environment is valid + if (!isAlreadyOpen && environmentTypeList.includes(environment)) { + emitAppOpenedMetricEvent(); + } +} + /** * Initializes the MetaMask Controller with any initial state and default language. * Configures platform-specific error reporting strategy. @@ -771,7 +807,6 @@ export function setupController( // // MetaMask Controller // - controller = new MetamaskController({ infuraProjectId: process.env.INFURA_PROJECT_ID, // User confirmation callbacks: @@ -890,6 +925,9 @@ export function setupController( // communication with popup controller.isClientOpen = true; controller.setupTrustedCommunication(portStream, remotePort.sender); + trackAppOpened(processName); + + initializeRemoteFeatureFlags(); if (processName === ENVIRONMENT_TYPE_POPUP) { openPopupCount += 1; @@ -1023,8 +1061,8 @@ export function setupController( METAMASK_CONTROLLER_EVENTS.UPDATE_BADGE, updateBadge, ); - controller.appStateController.on( - METAMASK_CONTROLLER_EVENTS.UPDATE_BADGE, + controller.controllerMessenger.subscribe( + METAMASK_CONTROLLER_EVENTS.APP_STATE_UNLOCK_CHANGE, updateBadge, ); @@ -1093,6 +1131,22 @@ export function setupController( } } + /** + * Initializes remote feature flags by making a request to fetch them from the clientConfigApi. + * This function is called when MM is during internal process. + * If the request fails, the error will be logged but won't interrupt extension initialization. + * + * @returns {Promise} A promise that resolves when the remote feature flags have been updated. + */ + async function initializeRemoteFeatureFlags() { + try { + // initialize the request to fetch remote feature flags + await controller.remoteFeatureFlagController.updateRemoteFeatureFlags(); + } catch (error) { + log.error('Error initializing remote feature flags:', error); + } + } + function getPendingApprovalCount() { try { let pendingApprovalCount = @@ -1183,34 +1237,7 @@ export function setupController( REJECT_NOTIFICATION_CLOSE, ); - // Finally, resolve snap dialog approvals on Flask and reject all the others managed by the ApprovalController. - Object.values(controller.approvalController.state.pendingApprovals).forEach( - ({ id, type }) => { - switch (type) { - case ApprovalType.SnapDialogAlert: - case ApprovalType.SnapDialogPrompt: - case DIALOG_APPROVAL_TYPES.default: - controller.approvalController.accept(id, null); - break; - case ApprovalType.SnapDialogConfirmation: - controller.approvalController.accept(id, false); - break; - ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) - case SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.confirmAccountCreation: - case SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.confirmAccountRemoval: - case SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.showSnapAccountRedirect: - controller.approvalController.accept(id, false); - break; - ///: END:ONLY_INCLUDE_IF - default: - controller.approvalController.reject( - id, - providerErrors.userRejectedRequest(), - ); - break; - } - }, - ); + controller.rejectAllPendingApprovals(); } // Updates the snaps registry and check for newly blocked snaps to block if the user has at least one snap installed that isn't preinstalled. diff --git a/app/scripts/constants/sentry-state.ts b/app/scripts/constants/sentry-state.ts index f18fb96d85fd..ab53ffb3f22d 100644 --- a/app/scripts/constants/sentry-state.ts +++ b/app/scripts/constants/sentry-state.ts @@ -90,7 +90,6 @@ export const SENTRY_BACKGROUND_STATE = { termsOfUseLastAgreed: true, timeoutMinutes: true, trezorModel: true, - usedNetworks: true, }, MultichainBalancesController: { balances: false, @@ -98,15 +97,17 @@ export const SENTRY_BACKGROUND_STATE = { BridgeController: { bridgeState: { bridgeFeatureFlags: { - extensionConfig: false, - extensionSupport: false, - destNetworkAllowlist: [], - srcNetworkAllowlist: [], + extensionConfig: { + support: false, + chains: {}, + }, }, destTokens: {}, destTopAssets: [], + destTokensLoadingStatus: true, srcTokens: {}, srcTopAssets: [], + srcTokensLoadingStatus: true, quoteRequest: { walletAddress: false, srcTokenAddress: true, @@ -117,8 +118,10 @@ export const SENTRY_BACKGROUND_STATE = { srcTokenAmount: true, }, quotes: [], + quotesInitialLoadTime: true, quotesLastFetched: true, quotesLoadingStatus: true, + quoteFetchError: true, quotesRefreshCount: true, }, }, @@ -271,6 +274,10 @@ export const SENTRY_BACKGROUND_STATE = { useTransactionSimulations: true, enableMV3TimestampSave: true, }, + RemoteFeatureFlagController: { + remoteFeatureFlags: true, + cacheTimestamp: false, + }, NotificationServicesPushController: { fcmToken: false, }, @@ -426,6 +433,7 @@ export const SENTRY_UI_STATE = { nextNonce: true, pendingTokens: false, welcomeScreenSeen: true, + slides: false, confirmationExchangeRates: true, useSafeChainsListValidation: true, watchEthereumAccountEnabled: false, diff --git a/app/scripts/controllers/account-tracker-controller.test.ts b/app/scripts/controllers/account-tracker-controller.test.ts index 7456244fc5a4..d9090c2e67f8 100644 --- a/app/scripts/controllers/account-tracker-controller.test.ts +++ b/app/scripts/controllers/account-tracker-controller.test.ts @@ -1,6 +1,6 @@ import EventEmitter from 'events'; import { ControllerMessenger } from '@metamask/base-controller'; -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { BlockTracker, Provider } from '@metamask/network-controller'; import { flushPromises } from '../../../test/lib/timer-helpers'; diff --git a/app/scripts/controllers/account-tracker-controller.ts b/app/scripts/controllers/account-tracker-controller.ts index 5f509a1901bf..ec6ba74ceec2 100644 --- a/app/scripts/controllers/account-tracker-controller.ts +++ b/app/scripts/controllers/account-tracker-controller.ts @@ -36,7 +36,7 @@ import { AccountsControllerSelectedEvmAccountChangeEvent, } from '@metamask/accounts-controller'; import { KeyringControllerAccountRemovedEvent } from '@metamask/keyring-controller'; -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { LOCALHOST_RPC_URL } from '../../../shared/constants/network'; import { SINGLE_CALL_BALANCES_ADDRESSES } from '../constants/contracts'; diff --git a/app/scripts/controllers/app-state-controller.test.ts b/app/scripts/controllers/app-state-controller.test.ts index 4bc1cb63e390..727df9b853e1 100644 --- a/app/scripts/controllers/app-state-controller.test.ts +++ b/app/scripts/controllers/app-state-controller.test.ts @@ -1,4 +1,9 @@ import { ControllerMessenger } from '@metamask/base-controller'; +import type { + AcceptRequest, + AddApprovalRequest, +} from '@metamask/approval-controller'; +import { KeyringControllerQRKeyringStateChangeEvent } from '@metamask/keyring-controller'; import { Browser } from 'webextension-polyfill'; import { ENVIRONMENT_TYPE_POPUP, @@ -6,15 +11,18 @@ import { POLLING_TOKEN_ENVIRONMENT_TYPES, } from '../../../shared/constants/app'; import { AccountOverviewTabKey } from '../../../shared/constants/app-state'; +import { MINUTE } from '../../../shared/constants/time'; import { AppStateController } from './app-state-controller'; import type { - AllowedActions, - AllowedEvents, AppStateControllerActions, AppStateControllerEvents, - AppStateControllerState, + AppStateControllerOptions, } from './app-state-controller'; -import { PreferencesControllerState } from './preferences-controller'; +import type { + PreferencesControllerState, + PreferencesControllerGetStateAction, + PreferencesControllerStateChangeEvent, +} from './preferences-controller'; jest.mock('webextension-polyfill'); @@ -25,12 +33,6 @@ jest.mock('../../../shared/modules/mv3.utils', () => ({ }, })); -let appStateController: AppStateController; -let controllerMessenger: ControllerMessenger< - AppStateControllerActions | AllowedActions, - AppStateControllerEvents | AllowedEvents ->; - const extensionMock = { alarms: { getAll: jest.fn(() => Promise.resolve([])), @@ -43,691 +45,590 @@ const extensionMock = { } as unknown as jest.Mocked; describe('AppStateController', () => { - const createAppStateController = ( - initState: Partial = {}, - ): { - appStateController: AppStateController; - controllerMessenger: typeof controllerMessenger; - } => { - controllerMessenger = new ControllerMessenger(); - jest.spyOn(ControllerMessenger.prototype, 'call'); - const appStateMessenger = controllerMessenger.getRestricted({ - name: 'AppStateController', - allowedActions: [ - `ApprovalController:addRequest`, - `ApprovalController:acceptRequest`, - `PreferencesController:getState`, - ], - allowedEvents: [ - `PreferencesController:stateChange`, - `KeyringController:qrKeyringStateChange`, - ], - }); - controllerMessenger.registerActionHandler( - 'PreferencesController:getState', - jest.fn().mockReturnValue({ - preferences: { - autoLockTimeLimit: 0, - }, - }), - ); - controllerMessenger.registerActionHandler( - 'ApprovalController:addRequest', - jest.fn().mockReturnValue({ - catch: jest.fn(), - }), - ); - appStateController = new AppStateController({ - addUnlockListener: jest.fn(), - isUnlocked: jest.fn(() => true), - initState, - onInactiveTimeout: jest.fn(), - messenger: appStateMessenger, - extension: extensionMock, - }); - - return { appStateController, controllerMessenger }; - }; - - const createIsUnlockedMock = (isUnlocked: boolean) => { - return jest - .spyOn( - appStateController as unknown as { isUnlocked: () => boolean }, - 'isUnlocked', - ) - .mockReturnValue(isUnlocked); - }; - - beforeEach(() => { - ({ appStateController } = createAppStateController()); - }); - describe('setOutdatedBrowserWarningLastShown', () => { - it('sets the last shown time', () => { - ({ appStateController } = createAppStateController()); - const timestamp: number = Date.now(); + it('sets the last shown time', async () => { + await withController(({ controller }) => { + const timestamp: number = Date.now(); - appStateController.setOutdatedBrowserWarningLastShown(timestamp); + controller.setOutdatedBrowserWarningLastShown(timestamp); - expect( - appStateController.store.getState().outdatedBrowserWarningLastShown, - ).toStrictEqual(timestamp); + expect(controller.state.outdatedBrowserWarningLastShown).toStrictEqual( + timestamp, + ); + }); }); - it('sets outdated browser warning last shown timestamp', () => { - const lastShownTimestamp: number = Date.now(); - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); + it('sets outdated browser warning last shown timestamp', async () => { + await withController(({ controller }) => { + const lastShownTimestamp: number = Date.now(); - appStateController.setOutdatedBrowserWarningLastShown(lastShownTimestamp); + controller.setOutdatedBrowserWarningLastShown(lastShownTimestamp); - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - outdatedBrowserWarningLastShown: lastShownTimestamp, + expect(controller.state.outdatedBrowserWarningLastShown).toStrictEqual( + lastShownTimestamp, + ); }); - - updateStateSpy.mockRestore(); }); }); describe('getUnlockPromise', () => { it('waits for unlock if the extension is locked', async () => { - ({ appStateController } = createAppStateController()); - const isUnlockedMock = createIsUnlockedMock(false); - const waitForUnlockSpy = jest.spyOn(appStateController, 'waitForUnlock'); - - appStateController.getUnlockPromise(true); - expect(isUnlockedMock).toHaveBeenCalled(); - expect(waitForUnlockSpy).toHaveBeenCalledWith(expect.any(Function), true); + await withController(({ controller }) => { + const isUnlockedMock = jest + .spyOn(controller, 'isUnlocked') + .mockReturnValue(false); + expect(controller.waitingForUnlock).toHaveLength(0); + + controller.getUnlockPromise(true); + expect(isUnlockedMock).toHaveBeenCalled(); + expect(controller.waitingForUnlock).toHaveLength(1); + }); }); it('resolves immediately if the extension is already unlocked', async () => { - ({ appStateController } = createAppStateController()); - const isUnlockedMock = createIsUnlockedMock(true); + await withController(async ({ controller }) => { + const isUnlockedMock = jest + .spyOn(controller, 'isUnlocked') + .mockReturnValue(true); - await expect( - appStateController.getUnlockPromise(false), - ).resolves.toBeUndefined(); + await expect( + controller.getUnlockPromise(false), + ).resolves.toBeUndefined(); - expect(isUnlockedMock).toHaveBeenCalled(); + expect(isUnlockedMock).toHaveBeenCalled(); + }); }); - }); - describe('waitForUnlock', () => { - it('resolves immediately if already unlocked', async () => { - const emitSpy = jest.spyOn(appStateController, 'emit'); - const resolveFn: () => void = jest.fn(); - appStateController.waitForUnlock(resolveFn, false); - expect(emitSpy).toHaveBeenCalledWith('updateBadge'); - expect(controllerMessenger.call).toHaveBeenCalledTimes(1); + it('publishes an unlock change event when isUnlocked is set to false', async () => { + await withController(async ({ controller, controllerMessenger }) => { + jest.spyOn(controller, 'isUnlocked').mockReturnValue(false); + const unlockChangeSpy = jest.fn(); + controllerMessenger.subscribe( + 'AppStateController:unlockChange', + unlockChangeSpy, + ); + const unlockPromise = controller.getUnlockPromise(false); + + const timeoutPromise = new Promise((resolve) => + setTimeout(() => resolve('timeout'), 100), + ); + + const result = await Promise.race([unlockPromise, timeoutPromise]); + + expect(result).toBe('timeout'); + + expect(unlockChangeSpy).toHaveBeenCalled(); + }); }); it('creates approval request when waitForUnlock is called with shouldShowUnlockRequest as true', async () => { - createIsUnlockedMock(false); - - const resolveFn: () => void = jest.fn(); - appStateController.waitForUnlock(resolveFn, true); - - expect(controllerMessenger.call).toHaveBeenCalledTimes(2); - expect(controllerMessenger.call).toHaveBeenCalledWith( - 'ApprovalController:addRequest', - expect.objectContaining({ - id: expect.any(String), - origin: ORIGIN_METAMASK, - type: 'unlock', - }), - true, - ); + const addRequestMock = jest.fn().mockResolvedValue(undefined); + await withController({ addRequestMock }, async ({ controller }) => { + jest.spyOn(controller, 'isUnlocked').mockReturnValue(false); + + controller.getUnlockPromise(true); + + expect(addRequestMock).toHaveBeenCalled(); + expect(addRequestMock).toHaveBeenCalledWith( + { + id: expect.any(String), + origin: ORIGIN_METAMASK, + type: 'unlock', + }, + true, + ); + }); }); - }); - describe('handleUnlock', () => { - beforeEach(() => { - createIsUnlockedMock(false); - }); - afterEach(() => { - jest.clearAllMocks(); - }); it('accepts approval request revolving all the related promises', async () => { - const emitSpy = jest.spyOn(appStateController, 'emit'); - const resolveFn: () => void = jest.fn(); - appStateController.waitForUnlock(resolveFn, true); - - appStateController.handleUnlock(); - - expect(emitSpy).toHaveBeenCalled(); - expect(emitSpy).toHaveBeenCalledWith('updateBadge'); - expect(controllerMessenger.call).toHaveBeenCalled(); - expect(controllerMessenger.call).toHaveBeenCalledWith( - 'ApprovalController:acceptRequest', - expect.any(String), + let unlockListener: () => void; + const addRequestMock = jest.fn().mockResolvedValue(undefined); + await withController( + { + addRequestMock, + options: { + addUnlockListener: (listener) => { + unlockListener = listener; + }, + }, + }, + ({ controller, controllerMessenger }) => { + jest.spyOn(controller, 'isUnlocked').mockReturnValue(false); + const unlockChangeSpy = jest.fn(); + controllerMessenger.subscribe( + 'AppStateController:unlockChange', + unlockChangeSpy, + ); + + controller.getUnlockPromise(true); + + unlockListener(); + + expect(unlockChangeSpy).toHaveBeenCalled(); + expect(addRequestMock).toHaveBeenCalled(); + expect(addRequestMock).toHaveBeenCalledWith( + { + id: expect.any(String), + origin: ORIGIN_METAMASK, + type: 'unlock', + }, + true, + ); + }, ); }); }); describe('setDefaultHomeActiveTabName', () => { - it('sets the default home tab name', () => { - appStateController.setDefaultHomeActiveTabName( - AccountOverviewTabKey.Activity, - ); - expect(appStateController.store.getState().defaultHomeActiveTabName).toBe( - AccountOverviewTabKey.Activity, - ); + it('sets the default home tab name', async () => { + await withController(({ controller }) => { + controller.setDefaultHomeActiveTabName(AccountOverviewTabKey.Activity); + + expect(controller.state.defaultHomeActiveTabName).toBe( + AccountOverviewTabKey.Activity, + ); + }); }); }); describe('setConnectedStatusPopoverHasBeenShown', () => { - it('sets connected status popover as shown', () => { - appStateController.setConnectedStatusPopoverHasBeenShown(); - expect( - appStateController.store.getState().connectedStatusPopoverHasBeenShown, - ).toBe(true); + it('sets connected status popover as shown', async () => { + await withController(({ controller }) => { + controller.setConnectedStatusPopoverHasBeenShown(); + + expect(controller.state.connectedStatusPopoverHasBeenShown).toBe(true); + }); }); }); describe('setRecoveryPhraseReminderHasBeenShown', () => { - it('sets recovery phrase reminder as shown', () => { - appStateController.setRecoveryPhraseReminderHasBeenShown(); - expect( - appStateController.store.getState().recoveryPhraseReminderHasBeenShown, - ).toBe(true); + it('sets recovery phrase reminder as shown', async () => { + await withController(({ controller }) => { + controller.setRecoveryPhraseReminderHasBeenShown(); + + expect(controller.state.recoveryPhraseReminderHasBeenShown).toBe(true); + }); }); }); describe('setRecoveryPhraseReminderLastShown', () => { - it('sets the last shown time of recovery phrase reminder', () => { - const timestamp: number = Date.now(); - appStateController.setRecoveryPhraseReminderLastShown(timestamp); - - expect( - appStateController.store.getState().recoveryPhraseReminderLastShown, - ).toBe(timestamp); + it('sets the last shown time of recovery phrase reminder', async () => { + await withController(({ controller }) => { + const timestamp = Date.now(); + controller.setRecoveryPhraseReminderLastShown(timestamp); + + expect(controller.state.recoveryPhraseReminderLastShown).toBe( + timestamp, + ); + }); }); }); describe('setLastActiveTime', () => { - it('sets the last active time to the current time', () => { - const spy = jest.spyOn( - appStateController as unknown as { _resetTimer: () => void }, - '_resetTimer', - ); - appStateController.setLastActiveTime(); - - expect(spy).toHaveBeenCalled(); + it('sets the timer if timeoutMinutes is set', async () => { + await withController(({ controller, controllerMessenger }) => { + const timeout = Date.now(); + controllerMessenger.publish( + 'PreferencesController:stateChange', + { + preferences: { autoLockTimeLimit: timeout }, + } as unknown as PreferencesControllerState, + [], + ); + jest.spyOn(global, 'setTimeout'); + + controller.setLastActiveTime(); + + expect(setTimeout).toHaveBeenCalledWith( + expect.any(Function), + timeout * MINUTE, + ); + }); }); - it('sets the timer if timeoutMinutes is set', () => { - const timeout = Date.now(); - controllerMessenger.publish( - 'PreferencesController:stateChange', - { - preferences: { autoLockTimeLimit: timeout }, - } as unknown as PreferencesControllerState, - [], - ); - const spy = jest.spyOn( - appStateController as unknown as { _resetTimer: () => void }, - '_resetTimer', - ); - appStateController.setLastActiveTime(); + it("doesn't set the timer if timeoutMinutes is not set", async () => { + await withController(({ controller }) => { + jest.spyOn(global, 'setTimeout'); - expect(spy).toHaveBeenCalled(); + controller.setLastActiveTime(); + + expect(setTimeout).toHaveBeenCalledTimes(0); + }); }); }); describe('setBrowserEnvironment', () => { - it('sets the current browser and OS environment', () => { - appStateController.setBrowserEnvironment('Windows', 'Chrome'); - expect( - appStateController.store.getState().browserEnvironment, - ).toStrictEqual({ - os: 'Windows', - browser: 'Chrome', + it('sets the current browser and OS environment', async () => { + await withController(({ controller }) => { + controller.setBrowserEnvironment('Windows', 'Chrome'); + + expect(controller.state.browserEnvironment).toStrictEqual({ + os: 'Windows', + browser: 'Chrome', + }); }); }); }); describe('addPollingToken', () => { - it('adds a pollingToken for a given environmentType', () => { - const pollingTokenType = - POLLING_TOKEN_ENVIRONMENT_TYPES[ENVIRONMENT_TYPE_POPUP]; - appStateController.addPollingToken('token1', pollingTokenType); - expect(appStateController.store.getState()[pollingTokenType]).toContain( - 'token1', - ); + it('adds a pollingToken for a given environmentType', async () => { + await withController(({ controller }) => { + const pollingTokenType = + POLLING_TOKEN_ENVIRONMENT_TYPES[ENVIRONMENT_TYPE_POPUP]; + controller.addPollingToken('token1', pollingTokenType); + + expect(controller.state[pollingTokenType]).toContain('token1'); + }); }); }); describe('removePollingToken', () => { - it('removes a pollingToken for a given environmentType', () => { - const pollingTokenType = - POLLING_TOKEN_ENVIRONMENT_TYPES[ENVIRONMENT_TYPE_POPUP]; - appStateController.addPollingToken('token1', pollingTokenType); - appStateController.removePollingToken('token1', pollingTokenType); - expect( - appStateController.store.getState()[pollingTokenType], - ).not.toContain('token1'); + it('removes a pollingToken for a given environmentType', async () => { + await withController(({ controller }) => { + const pollingTokenType = + POLLING_TOKEN_ENVIRONMENT_TYPES[ENVIRONMENT_TYPE_POPUP]; + + controller.addPollingToken('token1', pollingTokenType); + controller.removePollingToken('token1', pollingTokenType); + + expect(controller.state[pollingTokenType]).not.toContain('token1'); + }); }); }); describe('clearPollingTokens', () => { - it('clears all pollingTokens', () => { - appStateController.addPollingToken('token1', 'popupGasPollTokens'); - appStateController.addPollingToken('token2', 'notificationGasPollTokens'); - appStateController.addPollingToken('token3', 'fullScreenGasPollTokens'); - appStateController.clearPollingTokens(); - - expect( - appStateController.store.getState().popupGasPollTokens, - ).toStrictEqual([]); - expect( - appStateController.store.getState().notificationGasPollTokens, - ).toStrictEqual([]); - expect( - appStateController.store.getState().fullScreenGasPollTokens, - ).toStrictEqual([]); + it('clears all pollingTokens', async () => { + await withController(({ controller }) => { + controller.addPollingToken('token1', 'popupGasPollTokens'); + controller.addPollingToken('token2', 'notificationGasPollTokens'); + controller.addPollingToken('token3', 'fullScreenGasPollTokens'); + controller.clearPollingTokens(); + + expect(controller.state.popupGasPollTokens).toStrictEqual([]); + expect(controller.state.notificationGasPollTokens).toStrictEqual([]); + expect(controller.state.fullScreenGasPollTokens).toStrictEqual([]); + }); }); }); describe('setShowTestnetMessageInDropdown', () => { - it('sets whether the testnet dismissal link should be shown in the network dropdown', () => { - appStateController.setShowTestnetMessageInDropdown(true); - expect( - appStateController.store.getState().showTestnetMessageInDropdown, - ).toBe(true); + it('sets whether the testnet dismissal link should be shown in the network dropdown', async () => { + await withController(({ controller }) => { + controller.setShowTestnetMessageInDropdown(true); - appStateController.setShowTestnetMessageInDropdown(false); - expect( - appStateController.store.getState().showTestnetMessageInDropdown, - ).toBe(false); + expect(controller.state.showTestnetMessageInDropdown).toBe(true); + + controller.setShowTestnetMessageInDropdown(false); + + expect(controller.state.showTestnetMessageInDropdown).toBe(false); + }); }); }); describe('setShowBetaHeader', () => { - it('sets whether the beta notification heading on the home page', () => { - appStateController.setShowBetaHeader(true); - expect(appStateController.store.getState().showBetaHeader).toBe(true); + it('sets whether the beta notification heading on the home page', async () => { + await withController(({ controller }) => { + controller.setShowBetaHeader(true); + + expect(controller.state.showBetaHeader).toBe(true); - appStateController.setShowBetaHeader(false); - expect(appStateController.store.getState().showBetaHeader).toBe(false); + controller.setShowBetaHeader(false); + + expect(controller.state.showBetaHeader).toBe(false); + }); }); }); describe('setCurrentPopupId', () => { - it('sets the currentPopupId in the appState', () => { - const popupId = 12345; + it('sets the currentPopupId in the appState', async () => { + await withController(({ controller }) => { + const popupId = 12345; + + controller.setCurrentPopupId(popupId); - appStateController.setCurrentPopupId(popupId); - expect(appStateController.store.getState().currentPopupId).toBe(popupId); + expect(controller.state.currentPopupId).toBe(popupId); + }); }); }); describe('getCurrentPopupId', () => { - it('retrieves the currentPopupId saved in the appState', () => { - const popupId = 54321; + it('retrieves the currentPopupId saved in the appState', async () => { + await withController(({ controller }) => { + const popupId = 54321; - appStateController.setCurrentPopupId(popupId); - expect(appStateController.getCurrentPopupId()).toBe(popupId); - }); - }); - - describe('setFirstTimeUsedNetwork', () => { - it('updates the array of the first time used networks', () => { - const chainId = '0x1'; + controller.setCurrentPopupId(popupId); - appStateController.setFirstTimeUsedNetwork(chainId); - expect(appStateController.store.getState().usedNetworks[chainId]).toBe( - true, - ); + expect(controller.getCurrentPopupId()).toBe(popupId); + }); }); }); describe('setLastInteractedConfirmationInfo', () => { - it('sets information about last confirmation user has interacted with', () => { - const lastInteractedConfirmationInfo = { - id: '123', - chainId: '0x1', - timestamp: new Date().getTime(), - }; - appStateController.setLastInteractedConfirmationInfo( - lastInteractedConfirmationInfo, - ); - expect(appStateController.getLastInteractedConfirmationInfo()).toBe( - lastInteractedConfirmationInfo, - ); + it('sets information about last confirmation user has interacted with', async () => { + await withController(({ controller }) => { + const lastInteractedConfirmationInfo = { + id: '123', + chainId: '0x1', + timestamp: new Date().getTime(), + }; - appStateController.setLastInteractedConfirmationInfo(undefined); - expect(appStateController.getLastInteractedConfirmationInfo()).toBe( - undefined, - ); + controller.setLastInteractedConfirmationInfo( + lastInteractedConfirmationInfo, + ); + + expect(controller.getLastInteractedConfirmationInfo()).toBe( + lastInteractedConfirmationInfo, + ); + + controller.setLastInteractedConfirmationInfo(undefined); + + expect(controller.getLastInteractedConfirmationInfo()).toBe(undefined); + }); }); }); describe('setSnapsInstallPrivacyWarningShownStatus', () => { - it('updates the status of snaps install privacy warning', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); + it('updates the status of snaps install privacy warning', async () => { + await withController(({ controller }) => { + controller.setSnapsInstallPrivacyWarningShownStatus(true); - appStateController.setSnapsInstallPrivacyWarningShownStatus(true); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - snapsInstallPrivacyWarningShown: true, + expect(controller.state.snapsInstallPrivacyWarningShown).toStrictEqual( + true, + ); }); - - updateStateSpy.mockRestore(); }); }); describe('institutional', () => { - it('set the interactive replacement token with a url and the old refresh token', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); - - const mockParams = { - url: 'https://example.com', - oldRefreshToken: 'old', - }; - - appStateController.showInteractiveReplacementTokenBanner(mockParams); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - interactiveReplacementToken: mockParams, + it('set the interactive replacement token with a url and the old refresh token', async () => { + await withController(({ controller }) => { + const mockParams = { + url: 'https://example.com', + oldRefreshToken: 'old', + }; + + controller.showInteractiveReplacementTokenBanner(mockParams); + + expect(controller.state.interactiveReplacementToken).toStrictEqual( + mockParams, + ); }); - - updateStateSpy.mockRestore(); }); - it('set the setCustodianDeepLink with the fromAddress and custodyId', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); - - const mockParams = { - fromAddress: '0x', - custodyId: 'custodyId', - }; + it('set the setCustodianDeepLink with the fromAddress and custodyId', async () => { + await withController(({ controller }) => { + const mockParams = { + fromAddress: '0x', + custodyId: 'custodyId', + }; - appStateController.setCustodianDeepLink(mockParams); + controller.setCustodianDeepLink(mockParams); - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - custodianDeepLink: mockParams, + expect(controller.state.custodianDeepLink).toStrictEqual(mockParams); }); - - updateStateSpy.mockRestore(); }); - it('set the setNoteToTraderMessage with a message', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); + it('set the setNoteToTraderMessage with a message', async () => { + await withController(({ controller }) => { + const mockParams = 'some message'; - const mockParams = 'some message'; + controller.setNoteToTraderMessage(mockParams); - appStateController.setNoteToTraderMessage(mockParams); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - noteToTraderMessage: mockParams, + expect(controller.state.noteToTraderMessage).toStrictEqual(mockParams); }); - - updateStateSpy.mockRestore(); }); }); describe('setSurveyLinkLastClickedOrClosed', () => { - it('set the surveyLinkLastClickedOrClosed time', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); + it('set the surveyLinkLastClickedOrClosed time', async () => { + await withController(({ controller }) => { + const mockParams = Date.now(); - const mockParams = Date.now(); + controller.setSurveyLinkLastClickedOrClosed(mockParams); - appStateController.setSurveyLinkLastClickedOrClosed(mockParams); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - surveyLinkLastClickedOrClosed: mockParams, + expect(controller.state.surveyLinkLastClickedOrClosed).toStrictEqual( + mockParams, + ); }); - - updateStateSpy.mockRestore(); }); }); describe('setOnboardingDate', () => { - it('set the onboardingDate', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); - - appStateController.setOnboardingDate(); + it('set the onboardingDate', async () => { + await withController(({ controller }) => { + const mockDateNow = 1620000000000; + jest.spyOn(Date, 'now').mockReturnValue(mockDateNow); - expect(updateStateSpy).toHaveBeenCalledTimes(1); + controller.setOnboardingDate(); - updateStateSpy.mockRestore(); + expect(controller.state.onboardingDate).toStrictEqual(mockDateNow); + }); }); }); describe('setLastViewedUserSurvey', () => { - it('set the lastViewedUserSurvey with id 1', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); + it('set the lastViewedUserSurvey with id 1', async () => { + await withController(({ controller }) => { + const mockParams = 1; - const mockParams = 1; + controller.setLastViewedUserSurvey(mockParams); - appStateController.setLastViewedUserSurvey(mockParams); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - lastViewedUserSurvey: mockParams, + expect(controller.state.lastViewedUserSurvey).toStrictEqual(mockParams); }); - - updateStateSpy.mockRestore(); }); }); describe('setNewPrivacyPolicyToastClickedOrClosed', () => { - it('set the newPrivacyPolicyToastClickedOrClosed to true', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); - - appStateController.setNewPrivacyPolicyToastClickedOrClosed(); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect( - appStateController.store.getState() - .newPrivacyPolicyToastClickedOrClosed, - ).toStrictEqual(true); + it('set the newPrivacyPolicyToastClickedOrClosed to true', async () => { + await withController(({ controller }) => { + controller.setNewPrivacyPolicyToastClickedOrClosed(); - updateStateSpy.mockRestore(); + expect( + controller.state.newPrivacyPolicyToastClickedOrClosed, + ).toStrictEqual(true); + }); }); }); describe('setNewPrivacyPolicyToastShownDate', () => { - it('set the newPrivacyPolicyToastShownDate', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); + it('set the newPrivacyPolicyToastShownDate', async () => { + await withController(({ controller }) => { + const mockParams = Date.now(); - const mockParams = Date.now(); + controller.setNewPrivacyPolicyToastShownDate(mockParams); - appStateController.setNewPrivacyPolicyToastShownDate(mockParams); - - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - newPrivacyPolicyToastShownDate: mockParams, + expect(controller.state.newPrivacyPolicyToastShownDate).toStrictEqual( + mockParams, + ); }); - expect( - appStateController.store.getState().newPrivacyPolicyToastShownDate, - ).toStrictEqual(mockParams); - - updateStateSpy.mockRestore(); }); }); describe('setTermsOfUseLastAgreed', () => { - it('set the termsOfUseLastAgreed timestamp', () => { - ({ appStateController } = createAppStateController()); - const updateStateSpy = jest.spyOn( - appStateController.store, - 'updateState', - ); - - const mockParams = Date.now(); + it('set the termsOfUseLastAgreed timestamp', async () => { + await withController(({ controller }) => { + const mockParams = Date.now(); - appStateController.setTermsOfUseLastAgreed(mockParams); + controller.setTermsOfUseLastAgreed(mockParams); - expect(updateStateSpy).toHaveBeenCalledTimes(1); - expect(updateStateSpy).toHaveBeenCalledWith({ - termsOfUseLastAgreed: mockParams, + expect(controller.state.termsOfUseLastAgreed).toStrictEqual(mockParams); }); - expect( - appStateController.store.getState().termsOfUseLastAgreed, - ).toStrictEqual(mockParams); - - updateStateSpy.mockRestore(); }); }); describe('onPreferencesStateChange', () => { - it('should update the timeoutMinutes with the autoLockTimeLimit', () => { - ({ appStateController, controllerMessenger } = - createAppStateController()); - const timeout = Date.now(); - - controllerMessenger.publish( - 'PreferencesController:stateChange', - { - preferences: { autoLockTimeLimit: timeout }, - } as unknown as PreferencesControllerState, - [], - ); - - expect(appStateController.store.getState().timeoutMinutes).toStrictEqual( - timeout, - ); + it('should update the timeoutMinutes with the autoLockTimeLimit', async () => { + await withController(({ controller, controllerMessenger }) => { + const timeout = Date.now(); + + controllerMessenger.publish( + 'PreferencesController:stateChange', + { + preferences: { autoLockTimeLimit: timeout }, + } as unknown as PreferencesControllerState, + [], + ); + + expect(controller.state.timeoutMinutes).toStrictEqual(timeout); + }); }); }); describe('isManifestV3', () => { - it('creates alarm when isManifestV3 is true', () => { + it('creates alarm when isManifestV3 is true', async () => { mockIsManifestV3.mockReturnValue(true); - ({ appStateController } = createAppStateController()); - - const timeout = Date.now(); - controllerMessenger.publish( - 'PreferencesController:stateChange', - { - preferences: { autoLockTimeLimit: timeout }, - } as unknown as PreferencesControllerState, - [], - ); - const spy = jest.spyOn( - appStateController as unknown as { _resetTimer: () => void }, - '_resetTimer', - ); - appStateController.setLastActiveTime(); - - expect(spy).toHaveBeenCalled(); - expect(extensionMock.alarms.clear).toHaveBeenCalled(); - expect(extensionMock.alarms.onAlarm.addListener).toHaveBeenCalled(); - }); - }); - - describe('AppStateController:getState', () => { - it('should return the current state of the property', () => { - expect( - appStateController.store.getState().recoveryPhraseReminderHasBeenShown, - ).toStrictEqual(false); - expect( - controllerMessenger.call('AppStateController:getState') - .recoveryPhraseReminderHasBeenShown, - ).toStrictEqual(false); + await withController(({ controller, controllerMessenger }) => { + const timeout = Date.now(); + controllerMessenger.publish( + 'PreferencesController:stateChange', + { + preferences: { autoLockTimeLimit: timeout }, + } as unknown as PreferencesControllerState, + [], + ); + controller.setLastActiveTime(); + + expect(extensionMock.alarms.clear).toHaveBeenCalled(); + expect(extensionMock.alarms.onAlarm.addListener).toHaveBeenCalled(); + }); }); }); +}); - describe('AppStateController:stateChange', () => { - it('subscribers will recieve the state when published', () => { - expect( - appStateController.store.getState().surveyLinkLastClickedOrClosed, - ).toStrictEqual(null); - const timeNow = Date.now(); - controllerMessenger.subscribe( - 'AppStateController:stateChange', - (state: Partial) => { - if (typeof state.surveyLinkLastClickedOrClosed === 'number') { - appStateController.setSurveyLinkLastClickedOrClosed( - state.surveyLinkLastClickedOrClosed, - ); - } - }, - ); - - controllerMessenger.publish( - 'AppStateController:stateChange', - { - surveyLinkLastClickedOrClosed: timeNow, - } as unknown as AppStateControllerState, - [], - ); - - expect( - appStateController.store.getState().surveyLinkLastClickedOrClosed, - ).toStrictEqual(timeNow); - expect( - controllerMessenger.call('AppStateController:getState') - .surveyLinkLastClickedOrClosed, - ).toStrictEqual(timeNow); - }); - - it('state will be published when there is state change', () => { - expect( - appStateController.store.getState().surveyLinkLastClickedOrClosed, - ).toStrictEqual(null); - const timeNow = Date.now(); - controllerMessenger.subscribe( - 'AppStateController:stateChange', - (state: Partial) => { - expect(state.surveyLinkLastClickedOrClosed).toStrictEqual(timeNow); - }, - ); - - appStateController.setSurveyLinkLastClickedOrClosed(timeNow); - - expect( - appStateController.store.getState().surveyLinkLastClickedOrClosed, - ).toStrictEqual(timeNow); - expect( - controllerMessenger.call('AppStateController:getState') - .surveyLinkLastClickedOrClosed, - ).toStrictEqual(timeNow); - }); +type WithControllerOptions = { + options?: Partial; + addRequestMock?: jest.Mock; +}; + +type WithControllerCallback = ({ + controller, + controllerMessenger, +}: { + controller: AppStateController; + controllerMessenger: ControllerMessenger< + | AppStateControllerActions + | AddApprovalRequest + | AcceptRequest + | PreferencesControllerGetStateAction, + | AppStateControllerEvents + | PreferencesControllerStateChangeEvent + | KeyringControllerQRKeyringStateChangeEvent + >; +}) => ReturnValue; + +type WithControllerArgs = + | [WithControllerCallback] + | [WithControllerOptions, WithControllerCallback]; + +async function withController( + ...args: WithControllerArgs +): Promise { + const [{ ...rest }, fn] = args.length === 2 ? args : [{}, args[0]]; + const { addRequestMock, options = {} } = rest; + + const controllerMessenger = new ControllerMessenger< + | AppStateControllerActions + | AddApprovalRequest + | AcceptRequest + | PreferencesControllerGetStateAction, + | AppStateControllerEvents + | PreferencesControllerStateChangeEvent + | KeyringControllerQRKeyringStateChangeEvent + >(); + const appStateMessenger = controllerMessenger.getRestricted({ + name: 'AppStateController', + allowedActions: [ + `ApprovalController:addRequest`, + `ApprovalController:acceptRequest`, + `PreferencesController:getState`, + ], + allowedEvents: [ + `PreferencesController:stateChange`, + `KeyringController:qrKeyringStateChange`, + ], + }); + controllerMessenger.registerActionHandler( + 'PreferencesController:getState', + jest.fn().mockReturnValue({ + preferences: { + autoLockTimeLimit: 0, + }, + }), + ); + controllerMessenger.registerActionHandler( + 'ApprovalController:addRequest', + addRequestMock || jest.fn().mockResolvedValue(undefined), + ); + + return fn({ + controller: new AppStateController({ + addUnlockListener: jest.fn(), + isUnlocked: jest.fn(() => true), + onInactiveTimeout: jest.fn(), + messenger: appStateMessenger, + extension: extensionMock, + ...options, + }), + controllerMessenger, }); -}); +} diff --git a/app/scripts/controllers/app-state-controller.ts b/app/scripts/controllers/app-state-controller.ts index 605f307ec0e4..828b2249c6c2 100644 --- a/app/scripts/controllers/app-state-controller.ts +++ b/app/scripts/controllers/app-state-controller.ts @@ -1,17 +1,19 @@ -import EventEmitter from 'events'; -import { ObservableStore } from '@metamask/obs-store'; import { v4 as uuid } from 'uuid'; import log from 'loglevel'; import { ApprovalType } from '@metamask/controller-utils'; import { KeyringControllerQRKeyringStateChangeEvent } from '@metamask/keyring-controller'; -import { RestrictedControllerMessenger } from '@metamask/base-controller'; +import { + BaseController, + ControllerGetStateAction, + ControllerStateChangeEvent, + RestrictedControllerMessenger, +} from '@metamask/base-controller'; import { AcceptRequest, AddApprovalRequest, } from '@metamask/approval-controller'; import { Json } from '@metamask/utils'; import { Browser } from 'webextension-polyfill'; -import { METAMASK_CONTROLLER_EVENTS } from '../metamask-controller'; import { MINUTE } from '../../../shared/constants/time'; import { AUTO_LOCK_TIMEOUT_ALARM } from '../../../shared/constants/alarms'; import { isManifestV3 } from '../../../shared/modules/mv3.utils'; @@ -26,7 +28,10 @@ import { import { DEFAULT_AUTO_LOCK_TIME_LIMIT } from '../../../shared/constants/preferences'; import { LastInteractedConfirmationInfo } from '../../../shared/types/confirm'; import { SecurityAlertResponse } from '../lib/ppom/types'; -import { AccountOverviewTabKey } from '../../../shared/constants/app-state'; +import { + AccountOverviewTabKey, + CarouselSlide, +} from '../../../shared/constants/app-state'; import type { Preferences, PreferencesControllerGetStateAction, @@ -62,7 +67,6 @@ export type AppStateControllerState = { hadAdvancedGasFeesSetPriorToMigration92_3: boolean; qrHardware: Json; nftsDropdownState: Json; - usedNetworks: Record; surveyLinkLastClickedOrClosed: number | null; signatureSecurityAlertResponses: Record; // States used for displaying the changed network toast @@ -75,6 +79,7 @@ export type AppStateControllerState = { interactiveReplacementToken?: { url: string; oldRefreshToken: string }; noteToTraderMessage?: string; custodianDeepLink?: { fromAddress: string; custodyId: string }; + slides: CarouselSlide[]; }; const controllerName = 'AppStateController'; @@ -82,10 +87,10 @@ const controllerName = 'AppStateController'; /** * Returns the state of the {@link AppStateController}. */ -export type AppStateControllerGetStateAction = { - type: 'AppStateController:getState'; - handler: () => AppStateControllerState; -}; +export type AppStateControllerGetStateAction = ControllerGetStateAction< + typeof controllerName, + AppStateControllerState +>; /** * Actions exposed by the {@link AppStateController}. @@ -95,7 +100,7 @@ export type AppStateControllerActions = AppStateControllerGetStateAction; /** * Actions that this controller is allowed to call. */ -export type AllowedActions = +type AllowedActions = | AddApprovalRequest | AcceptRequest | PreferencesControllerGetStateAction; @@ -103,20 +108,27 @@ export type AllowedActions = /** * Event emitted when the state of the {@link AppStateController} changes. */ -export type AppStateControllerStateChangeEvent = { - type: 'AppStateController:stateChange'; - payload: [AppStateControllerState, []]; +export type AppStateControllerStateChangeEvent = ControllerStateChangeEvent< + typeof controllerName, + AppStateControllerState +>; + +export type AppStateControllerUnlockChangeEvent = { + type: 'AppStateController:unlockChange'; + payload: []; }; /** * Events emitted by {@link AppStateController}. */ -export type AppStateControllerEvents = AppStateControllerStateChangeEvent; +export type AppStateControllerEvents = + | AppStateControllerStateChangeEvent + | AppStateControllerUnlockChangeEvent; /** * Events that this controller is allowed to subscribe. */ -export type AllowedEvents = +type AllowedEvents = | PreferencesControllerStateChangeEvent | KeyringControllerQRKeyringStateChangeEvent; @@ -138,27 +150,22 @@ type AppStateControllerInitState = Partial< AppStateControllerState, | 'qrHardware' | 'nftsDropdownState' - | 'usedNetworks' - | 'surveyLinkLastClickedOrClosed' | 'signatureSecurityAlertResponses' | 'switchedNetworkDetails' - | 'switchedNetworkNeverShowMessage' | 'currentExtensionPopupId' > >; -type AppStateControllerOptions = { +export type AppStateControllerOptions = { addUnlockListener: (callback: () => void) => void; isUnlocked: () => boolean; - initState?: AppStateControllerInitState; + state?: AppStateControllerInitState; onInactiveTimeout?: () => void; messenger: AppStateControllerMessenger; extension: Browser; }; -const getDefaultAppStateControllerState = ( - initState?: AppStateControllerInitState, -): AppStateControllerState => ({ +const getDefaultAppStateControllerState = (): AppStateControllerState => ({ timeoutMinutes: DEFAULT_AUTO_LOCK_TIME_LIMIT, connectedStatusPopoverHasBeenShown: true, defaultHomeActiveTabName: null, @@ -181,69 +188,226 @@ const getDefaultAppStateControllerState = ( newPrivacyPolicyToastClickedOrClosed: null, newPrivacyPolicyToastShownDate: null, hadAdvancedGasFeesSetPriorToMigration92_3: false, - ...initState, - qrHardware: {}, - nftsDropdownState: {}, - usedNetworks: { - '0x1': true, - '0x5': true, - '0x539': true, - }, surveyLinkLastClickedOrClosed: null, - signatureSecurityAlertResponses: {}, - switchedNetworkDetails: null, switchedNetworkNeverShowMessage: false, - currentExtensionPopupId: 0, + slides: [], + ...getInitialStateOverrides(), }); -export class AppStateController extends EventEmitter { - private readonly extension: AppStateControllerOptions['extension']; +function getInitialStateOverrides() { + return { + qrHardware: {}, + nftsDropdownState: {}, + signatureSecurityAlertResponses: {}, + switchedNetworkDetails: null, + currentExtensionPopupId: 0, + }; +} - private readonly onInactiveTimeout: () => void; +const controllerMetadata = { + timeoutMinutes: { + persist: true, + anonymous: true, + }, + connectedStatusPopoverHasBeenShown: { + persist: true, + anonymous: true, + }, + defaultHomeActiveTabName: { + persist: true, + anonymous: true, + }, + browserEnvironment: { + persist: true, + anonymous: true, + }, + popupGasPollTokens: { + persist: false, + anonymous: true, + }, + notificationGasPollTokens: { + persist: false, + anonymous: true, + }, + fullScreenGasPollTokens: { + persist: false, + anonymous: true, + }, + recoveryPhraseReminderHasBeenShown: { + persist: true, + anonymous: true, + }, + recoveryPhraseReminderLastShown: { + persist: true, + anonymous: true, + }, + outdatedBrowserWarningLastShown: { + persist: true, + anonymous: true, + }, + nftsDetectionNoticeDismissed: { + persist: true, + anonymous: true, + }, + showTestnetMessageInDropdown: { + persist: true, + anonymous: true, + }, + showBetaHeader: { + persist: true, + anonymous: true, + }, + showPermissionsTour: { + persist: true, + anonymous: true, + }, + showNetworkBanner: { + persist: true, + anonymous: true, + }, + showAccountBanner: { + persist: true, + anonymous: true, + }, + trezorModel: { + persist: true, + anonymous: true, + }, + currentPopupId: { + persist: false, + anonymous: true, + }, + onboardingDate: { + persist: true, + anonymous: true, + }, + lastViewedUserSurvey: { + persist: true, + anonymous: true, + }, + newPrivacyPolicyToastClickedOrClosed: { + persist: true, + anonymous: true, + }, + newPrivacyPolicyToastShownDate: { + persist: true, + anonymous: true, + }, + hadAdvancedGasFeesSetPriorToMigration92_3: { + persist: true, + anonymous: true, + }, + qrHardware: { + persist: false, + anonymous: true, + }, + nftsDropdownState: { + persist: false, + anonymous: true, + }, + surveyLinkLastClickedOrClosed: { + persist: true, + anonymous: true, + }, + signatureSecurityAlertResponses: { + persist: false, + anonymous: true, + }, + switchedNetworkDetails: { + persist: false, + anonymous: true, + }, + switchedNetworkNeverShowMessage: { + persist: true, + anonymous: true, + }, + currentExtensionPopupId: { + persist: false, + anonymous: true, + }, + lastInteractedConfirmationInfo: { + persist: true, + anonymous: true, + }, + termsOfUseLastAgreed: { + persist: true, + anonymous: true, + }, + snapsInstallPrivacyWarningShown: { + persist: true, + anonymous: true, + }, + interactiveReplacementToken: { + persist: true, + anonymous: true, + }, + noteToTraderMessage: { + persist: true, + anonymous: true, + }, + custodianDeepLink: { + persist: true, + anonymous: true, + }, + slides: { + persist: true, + anonymous: true, + }, +}; - store: ObservableStore; +export class AppStateController extends BaseController< + typeof controllerName, + AppStateControllerState, + AppStateControllerMessenger +> { + readonly #extension: AppStateControllerOptions['extension']; - private timer: NodeJS.Timeout | null; + readonly #onInactiveTimeout: () => void; - isUnlocked: () => boolean; + #timer: NodeJS.Timeout | null; - private readonly waitingForUnlock: { resolve: () => void }[]; + isUnlocked: () => boolean; - private readonly messagingSystem: AppStateControllerMessenger; + readonly waitingForUnlock: { resolve: () => void }[]; #approvalRequestId: string | null; - constructor(opts: AppStateControllerOptions) { - const { - addUnlockListener, - isUnlocked, - initState, - onInactiveTimeout, + constructor({ + state = {}, + messenger, + addUnlockListener, + isUnlocked, + onInactiveTimeout, + extension, + }: AppStateControllerOptions) { + super({ + name: controllerName, + metadata: controllerMetadata, + state: { + ...getDefaultAppStateControllerState(), + ...state, + ...getInitialStateOverrides(), + }, messenger, - extension, - } = opts; - super(); - - this.extension = extension; - this.onInactiveTimeout = onInactiveTimeout || (() => undefined); - this.store = new ObservableStore( - getDefaultAppStateControllerState(initState), - ); - this.timer = null; + }); + + this.#extension = extension; + this.#onInactiveTimeout = onInactiveTimeout || (() => undefined); + this.#timer = null; this.isUnlocked = isUnlocked; this.waitingForUnlock = []; - addUnlockListener(this.handleUnlock.bind(this)); + addUnlockListener(this.#handleUnlock.bind(this)); messenger.subscribe( 'PreferencesController:stateChange', ({ preferences }: { preferences: Partial }) => { - const currentState = this.store.getState(); + const currentState = this.state; if ( typeof preferences?.autoLockTimeLimit === 'number' && currentState.timeoutMinutes !== preferences.autoLockTimeLimit ) { - this._setInactiveTimeout(preferences.autoLockTimeLimit); + this.#setInactiveTimeout(preferences.autoLockTimeLimit); } }, ); @@ -251,24 +415,17 @@ export class AppStateController extends EventEmitter { messenger.subscribe( 'KeyringController:qrKeyringStateChange', (qrHardware: Json) => - this.store.updateState({ - qrHardware, + this.update((currentState) => { + // @ts-expect-error this is caused by a bug in Immer, not being able to handle recursive types like Json + currentState.qrHardware = qrHardware; }), ); const { preferences } = messenger.call('PreferencesController:getState'); if (typeof preferences.autoLockTimeLimit === 'number') { - this._setInactiveTimeout(preferences.autoLockTimeLimit); + this.#setInactiveTimeout(preferences.autoLockTimeLimit); } - this.messagingSystem = messenger; - this.messagingSystem.registerActionHandler( - 'AppStateController:getState', - () => this.store.getState(), - ); - this.store.subscribe((state: AppStateControllerState) => { - this.messagingSystem.publish('AppStateController:stateChange', state, []); - }); this.#approvalRequestId = null; } @@ -286,7 +443,7 @@ export class AppStateController extends EventEmitter { if (this.isUnlocked()) { resolve(); } else { - this.waitForUnlock(resolve, shouldShowUnlockRequest); + this.#waitForUnlock(resolve, shouldShowUnlockRequest); } }); } @@ -300,26 +457,26 @@ export class AppStateController extends EventEmitter { * @param shouldShowUnlockRequest - Whether the extension notification * popup should be opened. */ - waitForUnlock(resolve: () => void, shouldShowUnlockRequest: boolean): void { + #waitForUnlock(resolve: () => void, shouldShowUnlockRequest: boolean): void { this.waitingForUnlock.push({ resolve }); - this.emit(METAMASK_CONTROLLER_EVENTS.UPDATE_BADGE); + this.messagingSystem.publish('AppStateController:unlockChange'); if (shouldShowUnlockRequest) { - this._requestApproval(); + this.#requestApproval(); } } /** * Drains the waitingForUnlock queue, resolving all the related Promises. */ - handleUnlock(): void { + #handleUnlock(): void { if (this.waitingForUnlock.length > 0) { while (this.waitingForUnlock.length > 0) { this.waitingForUnlock.shift()?.resolve(); } - this.emit(METAMASK_CONTROLLER_EVENTS.UPDATE_BADGE); + this.messagingSystem.publish('AppStateController:unlockChange'); } - this._acceptApproval(); + this.#acceptApproval(); } /** @@ -330,8 +487,8 @@ export class AppStateController extends EventEmitter { setDefaultHomeActiveTabName( defaultHomeActiveTabName: AccountOverviewTabKey | null, ): void { - this.store.updateState({ - defaultHomeActiveTabName, + this.update((state) => { + state.defaultHomeActiveTabName = defaultHomeActiveTabName; }); } @@ -339,8 +496,8 @@ export class AppStateController extends EventEmitter { * Record that the user has seen the connected status info popover */ setConnectedStatusPopoverHasBeenShown(): void { - this.store.updateState({ - connectedStatusPopoverHasBeenShown: true, + this.update((state) => { + state.connectedStatusPopoverHasBeenShown = true; }); } @@ -348,38 +505,87 @@ export class AppStateController extends EventEmitter { * Record that the user has been shown the recovery phrase reminder. */ setRecoveryPhraseReminderHasBeenShown(): void { - this.store.updateState({ - recoveryPhraseReminderHasBeenShown: true, + this.update((state) => { + state.recoveryPhraseReminderHasBeenShown = true; }); } setSurveyLinkLastClickedOrClosed(time: number): void { - this.store.updateState({ - surveyLinkLastClickedOrClosed: time, + this.update((state) => { + state.surveyLinkLastClickedOrClosed = time; }); } setOnboardingDate(): void { - this.store.updateState({ - onboardingDate: Date.now(), + this.update((state) => { + state.onboardingDate = Date.now(); }); } setLastViewedUserSurvey(id: number) { - this.store.updateState({ - lastViewedUserSurvey: id, + this.update((state) => { + state.lastViewedUserSurvey = id; }); } setNewPrivacyPolicyToastClickedOrClosed(): void { - this.store.updateState({ - newPrivacyPolicyToastClickedOrClosed: true, + this.update((state) => { + state.newPrivacyPolicyToastClickedOrClosed = true; }); } setNewPrivacyPolicyToastShownDate(time: number): void { - this.store.updateState({ - newPrivacyPolicyToastShownDate: time, + this.update((state) => { + state.newPrivacyPolicyToastShownDate = time; + }); + } + + /** + * Updates slides by adding new slides that don't already exist in state + * + * @param slides - Array of new slides to add + */ + updateSlides(slides: CarouselSlide[]): void { + this.update((state) => { + const currentSlides = state.slides || []; + + // Updates the undismissable property for slides that already exist in state + const updatedCurrentSlides = currentSlides.map((currentSlide) => { + const matchingNewSlide = slides.find((s) => s.id === currentSlide.id); + if (matchingNewSlide) { + return { + ...currentSlide, + undismissable: matchingNewSlide.undismissable, + }; + } + return currentSlide; + }); + + // Adds new slides that don't already exist in state + const newSlides = slides.filter((newSlide) => { + return !currentSlides.some( + (currentSlide) => currentSlide.id === newSlide.id, + ); + }); + + state.slides = [...updatedCurrentSlides, ...newSlides]; + }); + } + + /** + * Marks a slide as dismissed by ID + * + * @param id - ID of the slide to dismiss + */ + removeSlide(id: string): void { + this.update((state) => { + const slides = state.slides || []; + state.slides = slides.map((slide) => { + if (slide.id === id) { + return { ...slide, dismissed: true }; + } + return slide; + }); }); } @@ -389,8 +595,8 @@ export class AppStateController extends EventEmitter { * @param lastShown - timestamp when user was last shown the reminder. */ setRecoveryPhraseReminderLastShown(lastShown: number): void { - this.store.updateState({ - recoveryPhraseReminderLastShown: lastShown, + this.update((state) => { + state.recoveryPhraseReminderLastShown = lastShown; }); } @@ -400,8 +606,8 @@ export class AppStateController extends EventEmitter { * @param lastAgreed - timestamp when user last accepted the terms of use */ setTermsOfUseLastAgreed(lastAgreed: number): void { - this.store.updateState({ - termsOfUseLastAgreed: lastAgreed, + this.update((state) => { + state.termsOfUseLastAgreed = lastAgreed; }); } @@ -412,8 +618,8 @@ export class AppStateController extends EventEmitter { * @param shown - shown status */ setSnapsInstallPrivacyWarningShownStatus(shown: boolean): void { - this.store.updateState({ - snapsInstallPrivacyWarningShown: shown, + this.update((state) => { + state.snapsInstallPrivacyWarningShown = shown; }); } @@ -423,8 +629,8 @@ export class AppStateController extends EventEmitter { * @param lastShown - Timestamp (in milliseconds) of when the user was last shown the warning. */ setOutdatedBrowserWarningLastShown(lastShown: number): void { - this.store.updateState({ - outdatedBrowserWarningLastShown: lastShown, + this.update((state) => { + state.outdatedBrowserWarningLastShown = lastShown; }); } @@ -432,7 +638,7 @@ export class AppStateController extends EventEmitter { * Sets the last active time to the current time. */ setLastActiveTime(): void { - this._resetTimer(); + this.#resetTimer(); } /** @@ -440,12 +646,12 @@ export class AppStateController extends EventEmitter { * * @param timeoutMinutes - The inactive timeout in minutes. */ - private _setInactiveTimeout(timeoutMinutes: number): void { - this.store.updateState({ - timeoutMinutes, + #setInactiveTimeout(timeoutMinutes: number): void { + this.update((state) => { + state.timeoutMinutes = timeoutMinutes; }); - this._resetTimer(); + this.#resetTimer(); } /** @@ -455,13 +661,13 @@ export class AppStateController extends EventEmitter { * timer will not be created. * */ - private _resetTimer(): void { - const { timeoutMinutes } = this.store.getState(); + #resetTimer(): void { + const { timeoutMinutes } = this.state; - if (this.timer) { - clearTimeout(this.timer); + if (this.#timer) { + clearTimeout(this.#timer); } else if (isManifestV3) { - this.extension.alarms.clear(AUTO_LOCK_TIMEOUT_ALARM); + this.#extension.alarms.clear(AUTO_LOCK_TIMEOUT_ALARM); } if (!timeoutMinutes) { @@ -478,21 +684,21 @@ export class AppStateController extends EventEmitter { const timeoutToSet = Number(timeoutMinutes); if (isManifestV3) { - this.extension.alarms.create(AUTO_LOCK_TIMEOUT_ALARM, { + this.#extension.alarms.create(AUTO_LOCK_TIMEOUT_ALARM, { delayInMinutes: timeoutToSet, periodInMinutes: timeoutToSet, }); - this.extension.alarms.onAlarm.addListener( + this.#extension.alarms.onAlarm.addListener( (alarmInfo: { name: string }) => { if (alarmInfo.name === AUTO_LOCK_TIMEOUT_ALARM) { - this.onInactiveTimeout(); - this.extension.alarms.clear(AUTO_LOCK_TIMEOUT_ALARM); + this.#onInactiveTimeout(); + this.#extension.alarms.clear(AUTO_LOCK_TIMEOUT_ALARM); } }, ); } else { - this.timer = setTimeout( - () => this.onInactiveTimeout(), + this.#timer = setTimeout( + () => this.#onInactiveTimeout(), timeoutToSet * MINUTE, ); } @@ -505,7 +711,9 @@ export class AppStateController extends EventEmitter { * @param browser */ setBrowserEnvironment(os: string, browser: string): void { - this.store.updateState({ browserEnvironment: { os, browser } }); + this.update((state) => { + state.browserEnvironment = { os, browser }; + }); } /** @@ -538,9 +746,8 @@ export class AppStateController extends EventEmitter { pollingToken: string, pollingTokenType: PollingTokenType, ) { - const currentTokens: string[] = this.store.getState()[pollingTokenType]; - this.store.updateState({ - [pollingTokenType]: [...currentTokens, pollingToken], + this.update((state) => { + state[pollingTokenType].push(pollingToken); }); } @@ -558,12 +765,12 @@ export class AppStateController extends EventEmitter { pollingTokenType.toString() !== POLLING_TOKEN_ENVIRONMENT_TYPES[ENVIRONMENT_TYPE_BACKGROUND] ) { - const currentTokens: string[] = this.store.getState()[pollingTokenType]; + const currentTokens: string[] = this.state[pollingTokenType]; if (this.#isValidPollingTokenType(pollingTokenType)) { - this.store.updateState({ - [pollingTokenType]: currentTokens.filter( + this.update((state) => { + state[pollingTokenType] = currentTokens.filter( (token: string) => token !== pollingToken, - ), + ); }); } } @@ -589,10 +796,10 @@ export class AppStateController extends EventEmitter { * clears all pollingTokens */ clearPollingTokens(): void { - this.store.updateState({ - popupGasPollTokens: [], - notificationGasPollTokens: [], - fullScreenGasPollTokens: [], + this.update((state) => { + state.popupGasPollTokens = []; + state.notificationGasPollTokens = []; + state.fullScreenGasPollTokens = []; }); } @@ -602,7 +809,9 @@ export class AppStateController extends EventEmitter { * @param showTestnetMessageInDropdown */ setShowTestnetMessageInDropdown(showTestnetMessageInDropdown: boolean): void { - this.store.updateState({ showTestnetMessageInDropdown }); + this.update((state) => { + state.showTestnetMessageInDropdown = showTestnetMessageInDropdown; + }); } /** @@ -611,7 +820,9 @@ export class AppStateController extends EventEmitter { * @param showBetaHeader */ setShowBetaHeader(showBetaHeader: boolean): void { - this.store.updateState({ showBetaHeader }); + this.update((state) => { + state.showBetaHeader = showBetaHeader; + }); } /** @@ -620,7 +831,9 @@ export class AppStateController extends EventEmitter { * @param showPermissionsTour */ setShowPermissionsTour(showPermissionsTour: boolean): void { - this.store.updateState({ showPermissionsTour }); + this.update((state) => { + state.showPermissionsTour = showPermissionsTour; + }); } /** @@ -629,7 +842,9 @@ export class AppStateController extends EventEmitter { * @param showNetworkBanner */ setShowNetworkBanner(showNetworkBanner: boolean): void { - this.store.updateState({ showNetworkBanner }); + this.update((state) => { + state.showNetworkBanner = showNetworkBanner; + }); } /** @@ -638,7 +853,9 @@ export class AppStateController extends EventEmitter { * @param showAccountBanner */ setShowAccountBanner(showAccountBanner: boolean): void { - this.store.updateState({ showAccountBanner }); + this.update((state) => { + state.showAccountBanner = showAccountBanner; + }); } /** @@ -647,7 +864,9 @@ export class AppStateController extends EventEmitter { * @param currentExtensionPopupId */ setCurrentExtensionPopupId(currentExtensionPopupId: number): void { - this.store.updateState({ currentExtensionPopupId }); + this.update((state) => { + state.currentExtensionPopupId = currentExtensionPopupId; + }); } /** @@ -659,14 +878,18 @@ export class AppStateController extends EventEmitter { setSwitchedNetworkDetails( switchedNetworkDetails: { origin: string; networkClientId: string } | null, ): void { - this.store.updateState({ switchedNetworkDetails }); + this.update((state) => { + state.switchedNetworkDetails = switchedNetworkDetails; + }); } /** * Clears the switched network details in state */ clearSwitchedNetworkDetails(): void { - this.store.updateState({ switchedNetworkDetails: null }); + this.update((state) => { + state.switchedNetworkDetails = null; + }); } /** @@ -678,9 +901,9 @@ export class AppStateController extends EventEmitter { setSwitchedNetworkNeverShowMessage( switchedNetworkNeverShowMessage: boolean, ): void { - this.store.updateState({ - switchedNetworkDetails: null, - switchedNetworkNeverShowMessage, + this.update((state) => { + state.switchedNetworkDetails = null; + state.switchedNetworkNeverShowMessage = switchedNetworkNeverShowMessage; }); } @@ -690,7 +913,9 @@ export class AppStateController extends EventEmitter { * @param trezorModel - The Trezor model. */ setTrezorModel(trezorModel: string | null): void { - this.store.updateState({ trezorModel }); + this.update((state) => { + state.trezorModel = trezorModel; + }); } /** @@ -699,24 +924,11 @@ export class AppStateController extends EventEmitter { * @param nftsDropdownState */ updateNftDropDownState(nftsDropdownState: Json): void { - this.store.updateState({ - nftsDropdownState, + this.update((state) => { + state.nftsDropdownState = nftsDropdownState; }); } - /** - * Updates the array of the first time used networks - * - * @param chainId - */ - setFirstTimeUsedNetwork(chainId: string): void { - const currentState = this.store.getState(); - const { usedNetworks } = currentState; - usedNetworks[chainId] = true; - - this.store.updateState({ usedNetworks }); - } - ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) /** * Set the interactive replacement token with a url and the old refresh token @@ -732,11 +944,11 @@ export class AppStateController extends EventEmitter { url: string; oldRefreshToken: string; }): void { - this.store.updateState({ - interactiveReplacementToken: { + this.update((state) => { + state.interactiveReplacementToken = { url, oldRefreshToken, - }, + }; }); } @@ -754,14 +966,14 @@ export class AppStateController extends EventEmitter { fromAddress: string; custodyId: string; }): void { - this.store.updateState({ - custodianDeepLink: { fromAddress, custodyId }, + this.update((state) => { + state.custodianDeepLink = { fromAddress, custodyId }; }); } setNoteToTraderMessage(message: string): void { - this.store.updateState({ - noteToTraderMessage: message, + this.update((state) => { + state.noteToTraderMessage = message; }); } @@ -770,23 +982,17 @@ export class AppStateController extends EventEmitter { getSignatureSecurityAlertResponse( securityAlertId: string, ): SecurityAlertResponse { - return this.store.getState().signatureSecurityAlertResponses[ - securityAlertId - ]; + return this.state.signatureSecurityAlertResponses[securityAlertId]; } addSignatureSecurityAlertResponse( securityAlertResponse: SecurityAlertResponse, ): void { - const currentState = this.store.getState(); - const { signatureSecurityAlertResponses } = currentState; if (securityAlertResponse.securityAlertId) { - this.store.updateState({ - signatureSecurityAlertResponses: { - ...signatureSecurityAlertResponses, - [String(securityAlertResponse.securityAlertId)]: - securityAlertResponse, - }, + this.update((state) => { + state.signatureSecurityAlertResponses[ + String(securityAlertResponse.securityAlertId) + ] = securityAlertResponse; }); } } @@ -797,8 +1003,8 @@ export class AppStateController extends EventEmitter { * @param currentPopupId */ setCurrentPopupId(currentPopupId: number): void { - this.store.updateState({ - currentPopupId, + this.update((state) => { + state.currentPopupId = currentPopupId; }); } @@ -808,7 +1014,7 @@ export class AppStateController extends EventEmitter { getLastInteractedConfirmationInfo(): | LastInteractedConfirmationInfo | undefined { - return this.store.getState().lastInteractedConfirmationInfo; + return this.state.lastInteractedConfirmationInfo; } /** @@ -819,8 +1025,8 @@ export class AppStateController extends EventEmitter { setLastInteractedConfirmationInfo( lastInteractedConfirmationInfo: LastInteractedConfirmationInfo | undefined, ): void { - this.store.updateState({ - lastInteractedConfirmationInfo, + this.update((state) => { + state.lastInteractedConfirmationInfo = lastInteractedConfirmationInfo; }); } @@ -828,10 +1034,10 @@ export class AppStateController extends EventEmitter { * A getter to retrieve currentPopupId saved in the appState */ getCurrentPopupId(): number | undefined { - return this.store.getState().currentPopupId; + return this.state.currentPopupId; } - private _requestApproval(): void { + #requestApproval(): void { // If we already have a pending request this is a no-op if (this.#approvalRequestId) { return; @@ -854,12 +1060,7 @@ export class AppStateController extends EventEmitter { }); } - // Override emit method to provide strong typing for events - emit(event: string) { - return super.emit(event); - } - - private _acceptApproval(): void { + #acceptApproval(): void { if (!this.#approvalRequestId) { return; } diff --git a/app/scripts/controllers/bridge-status/__snapshots__/bridge-status-controller.test.ts.snap b/app/scripts/controllers/bridge-status/__snapshots__/bridge-status-controller.test.ts.snap index ebd3a938822e..8bbeab6356d9 100644 --- a/app/scripts/controllers/bridge-status/__snapshots__/bridge-status-controller.test.ts.snap +++ b/app/scripts/controllers/bridge-status/__snapshots__/bridge-status-controller.test.ts.snap @@ -2,11 +2,13 @@ exports[`BridgeStatusController constructor rehydrates the tx history state 1`] = ` { - "0xsrcTxHash1": { + "bridgeTxMetaId1": { "account": "0xaccount1", "estimatedProcessingTimeInSeconds": 15, "initialDestAssetBalance": undefined, - "pricingData": undefined, + "pricingData": { + "amountSent": "1.234", + }, "quote": { "bridgeId": "lifi", "bridges": [ @@ -102,17 +104,20 @@ exports[`BridgeStatusController constructor rehydrates the tx history state 1`] "status": "PENDING", }, "targetContractAddress": "0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC", + "txMetaId": "bridgeTxMetaId1", }, } `; exports[`BridgeStatusController startPollingForBridgeTxStatus sets the inital tx history state 1`] = ` { - "0xsrcTxHash1": { + "bridgeTxMetaId1": { "account": "0xaccount1", "estimatedProcessingTimeInSeconds": 15, "initialDestAssetBalance": undefined, - "pricingData": undefined, + "pricingData": { + "amountSent": "1.234", + }, "quote": { "bridgeId": "lifi", "bridges": [ @@ -208,6 +213,7 @@ exports[`BridgeStatusController startPollingForBridgeTxStatus sets the inital tx "status": "PENDING", }, "targetContractAddress": "0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC", + "txMetaId": "bridgeTxMetaId1", }, } `; diff --git a/app/scripts/controllers/bridge-status/bridge-status-controller.test.ts b/app/scripts/controllers/bridge-status/bridge-status-controller.test.ts index 7d82d32284f4..0a8e331b2767 100644 --- a/app/scripts/controllers/bridge-status/bridge-status-controller.test.ts +++ b/app/scripts/controllers/bridge-status/bridge-status-controller.test.ts @@ -1,271 +1,19 @@ import { flushPromises } from '../../../../test/lib/timer-helpers'; import { Numeric } from '../../../../shared/modules/Numeric'; -import { - StatusTypes, - ActionTypes, - BridgeId, -} from '../../../../shared/types/bridge-status'; import BridgeStatusController from './bridge-status-controller'; import { BridgeStatusControllerMessenger } from './types'; import { DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE } from './constants'; import * as bridgeStatusUtils from './utils'; +import { + MockStatusResponse, + MockTxHistory, + getMockStartPollingForBridgeTxStatusArgs, +} from './mocks'; const EMPTY_INIT_STATE = { bridgeStatusState: DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE, }; -const getMockQuote = ({ srcChainId = 42161, destChainId = 10 } = {}) => ({ - requestId: '197c402f-cb96-4096-9f8c-54aed84ca776', - srcChainId, - srcTokenAmount: '991250000000000', - srcAsset: { - address: '0x0000000000000000000000000000000000000000', - chainId: srcChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.7', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - destChainId, - destTokenAmount: '990654755978612', - destAsset: { - address: '0x0000000000000000000000000000000000000000', - chainId: destChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.63', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - feeData: { - metabridge: { - amount: '8750000000000', - asset: { - address: '0x0000000000000000000000000000000000000000', - chainId: srcChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.7', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - }, - }, - bridgeId: 'lifi', - bridges: ['across'], - steps: [ - { - action: 'bridge' as ActionTypes, - srcChainId, - destChainId, - protocol: { - name: 'across', - displayName: 'Across', - icon: 'https://raw.githubusercontent.com/lifinance/types/main/src/assets/icons/bridges/acrossv2.png', - }, - srcAsset: { - address: '0x0000000000000000000000000000000000000000', - chainId: srcChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.7', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - destAsset: { - address: '0x0000000000000000000000000000000000000000', - chainId: destChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.63', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - srcAmount: '991250000000000', - destAmount: '990654755978612', - }, - ], -}); - -const getMockStartPollingForBridgeTxStatusArgs = ({ - srcTxHash = '0xsrcTxHash1', - account = '0xaccount1', - srcChainId = 42161, - destChainId = 10, -} = {}) => ({ - statusRequest: { - bridgeId: 'lifi', - srcTxHash, - bridge: 'across', - srcChainId, - destChainId, - quote: getMockQuote({ srcChainId, destChainId }), - refuel: false, - }, - quoteResponse: { - quote: getMockQuote({ srcChainId, destChainId }), - trade: { - chainId: srcChainId, - to: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', - from: account, - value: '0x038d7ea4c68000', - data: '0x3ce33bff0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000d6c6966694164617074657256320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000e397c4883ec89ed4fc9d258f00c689708b2799c9000000000000000000000000e397c4883ec89ed4fc9d258f00c689708b2799c9000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038589602234000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000007f544a44c0000000000000000000000000056ca675c3633cc16bd6849e2b431d4e8de5e23bf000000000000000000000000000000000000000000000000000000000000006c5a39b10a4f4f0747826140d2c5fe6ef47965741f6f7a4734bf784bf3ae3f24520000000a000222266cc2dca0671d2a17ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00dfeeddeadbeef8932eb23bad9bddb5cf81426f78279a53c6c3b7100000000000000000000000000000000000000009ce3c510b3f58edc8d53ae708056e30926f62d0b42d5c9b61c391bb4e8a2c1917f8ed995169ffad0d79af2590303e83c57e15a9e0b248679849556c2e03a1c811b', - gasLimit: 282915, - }, - approval: null, - estimatedProcessingTimeInSeconds: 15, - }, - startTime: 1729964825189, - slippagePercentage: 0, - pricingData: undefined, - initialDestAssetBalance: undefined, - targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', -}); - -const MockStatusResponse = { - getPending: ({ - srcTxHash = '0xsrcTxHash1', - srcChainId = 42161, - destChainId = 10, - } = {}) => ({ - status: 'PENDING' as StatusTypes, - srcChain: { - chainId: srcChainId, - txHash: srcTxHash, - amount: '991250000000000', - token: { - address: '0x0000000000000000000000000000000000000000', - chainId: srcChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2518.47', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - }, - destChain: { - chainId: destChainId, - token: {}, - }, - }), - getComplete: ({ - srcTxHash = '0xsrcTxHash1', - destTxHash = '0xdestTxHash1', - srcChainId = 42161, - destChainId = 10, - } = {}) => ({ - status: 'COMPLETE' as StatusTypes, - isExpectedToken: true, - bridge: 'across' as BridgeId, - srcChain: { - chainId: srcChainId, - txHash: srcTxHash, - amount: '991250000000000', - token: { - address: '0x0000000000000000000000000000000000000000', - chainId: srcChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.7', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - }, - destChain: { - chainId: destChainId, - txHash: destTxHash, - amount: '990654755978611', - token: { - address: '0x0000000000000000000000000000000000000000', - chainId: destChainId, - symbol: 'ETH', - decimals: 18, - name: 'ETH', - coinKey: 'ETH', - logoURI: - 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - priceUSD: '2478.63', - icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', - }, - }, - }), -}; - -const MockTxHistory = { - getInit: ({ - srcTxHash = '0xsrcTxHash1', - account = '0xaccount1', - srcChainId = 42161, - destChainId = 10, - } = {}) => ({ - [srcTxHash]: { - quote: getMockQuote({ srcChainId, destChainId }), - startTime: 1729964825189, - estimatedProcessingTimeInSeconds: 15, - slippagePercentage: 0, - account, - targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', - }, - }), - getPending: ({ - srcTxHash = '0xsrcTxHash1', - account = '0xaccount1', - srcChainId = 42161, - destChainId = 10, - } = {}) => ({ - [srcTxHash]: { - quote: getMockQuote({ srcChainId, destChainId }), - startTime: 1729964825189, - estimatedProcessingTimeInSeconds: 15, - slippagePercentage: 0, - account, - status: MockStatusResponse.getPending({ - srcTxHash, - srcChainId, - }), - targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', - }, - }), - getComplete: ({ - srcTxHash = '0xsrcTxHash1', - account = '0xaccount1', - srcChainId = 42161, - destChainId = 10, - } = {}) => ({ - [srcTxHash]: { - quote: getMockQuote({ srcChainId, destChainId }), - startTime: 1729964825189, - estimatedProcessingTimeInSeconds: 15, - slippagePercentage: 0, - account, - status: MockStatusResponse.getComplete({ srcTxHash }), - targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', - }, - }), -}; - const getMessengerMock = ({ account = '0xaccount1', srcChainId = 42161, @@ -513,6 +261,7 @@ describe('BridgeStatusController', () => { // Start polling for 0xaccount2 bridgeStatusController.startPollingForBridgeTxStatus( getMockStartPollingForBridgeTxStatusArgs({ + txMetaId: 'bridgeTxMetaId2', srcTxHash: '0xsrcTxHash2', account: '0xaccount2', }), @@ -523,10 +272,10 @@ describe('BridgeStatusController', () => { // Check that both accounts have a tx history entry expect( bridgeStatusController.state.bridgeStatusState.txHistory, - ).toHaveProperty('0xsrcTxHash1'); + ).toHaveProperty('bridgeTxMetaId1'); expect( bridgeStatusController.state.bridgeStatusState.txHistory, - ).toHaveProperty('0xsrcTxHash2'); + ).toHaveProperty('bridgeTxMetaId2'); // Wipe the status for 1 account only bridgeStatusController.wipeBridgeStatus({ @@ -586,6 +335,7 @@ describe('BridgeStatusController', () => { getMockStartPollingForBridgeTxStatusArgs({ account: '0xaccount1', srcTxHash: '0xsrcTxHash1', + txMetaId: 'bridgeTxMetaId1', srcChainId: 42161, destChainId: 1, }), @@ -598,6 +348,7 @@ describe('BridgeStatusController', () => { getMockStartPollingForBridgeTxStatusArgs({ account: '0xaccount1', srcTxHash: '0xsrcTxHash2', + txMetaId: 'bridgeTxMetaId2', srcChainId: 10, destChainId: 123, }), @@ -607,20 +358,20 @@ describe('BridgeStatusController', () => { // Check we have a tx history entry for each chainId expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash1'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId1 .quote.srcChainId, ).toEqual(42161); expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash1'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId1 .quote.destChainId, ).toEqual(1); expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash2'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId2 .quote.srcChainId, ).toEqual(10); expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash2'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId2 .quote.destChainId, ).toEqual(123); @@ -681,6 +432,7 @@ describe('BridgeStatusController', () => { getMockStartPollingForBridgeTxStatusArgs({ account: '0xaccount1', srcTxHash: '0xsrcTxHash1', + txMetaId: 'bridgeTxMetaId1', srcChainId: 42161, destChainId: 1, }), @@ -693,6 +445,7 @@ describe('BridgeStatusController', () => { getMockStartPollingForBridgeTxStatusArgs({ account: '0xaccount1', srcTxHash: '0xsrcTxHash2', + txMetaId: 'bridgeTxMetaId2', srcChainId: 10, destChainId: 123, }), @@ -702,20 +455,20 @@ describe('BridgeStatusController', () => { // Check we have a tx history entry for each chainId expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash1'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId1 .quote.srcChainId, ).toEqual(42161); expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash1'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId1 .quote.destChainId, ).toEqual(1); expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash2'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId2 .quote.srcChainId, ).toEqual(10); expect( - bridgeStatusController.state.bridgeStatusState.txHistory['0xsrcTxHash2'] + bridgeStatusController.state.bridgeStatusState.txHistory.bridgeTxMetaId2 .quote.destChainId, ).toEqual(123); diff --git a/app/scripts/controllers/bridge-status/bridge-status-controller.ts b/app/scripts/controllers/bridge-status/bridge-status-controller.ts index 86e87d9d0622..841bf9868787 100644 --- a/app/scripts/controllers/bridge-status/bridge-status-controller.ts +++ b/app/scripts/controllers/bridge-status/bridge-status-controller.ts @@ -1,13 +1,11 @@ import { StateMetadata } from '@metamask/base-controller'; -import type { NetworkClientId } from '@metamask/network-controller'; import { StaticIntervalPollingController } from '@metamask/polling-controller'; import { Hex } from '@metamask/utils'; // eslint-disable-next-line import/no-restricted-paths import { - StartPollingForBridgeTxStatusArgs, - StatusRequest, StatusTypes, BridgeStatusControllerState, + StartPollingForBridgeTxStatusArgsSerialized, } from '../../../../shared/types/bridge-status'; import { decimalToPrefixedHex } from '../../../../shared/modules/conversion.utils'; import { @@ -16,7 +14,7 @@ import { REFRESH_INTERVAL_MS, } from './constants'; import { BridgeStatusControllerMessenger } from './types'; -import { fetchBridgeTxStatus } from './utils'; +import { fetchBridgeTxStatus, getStatusRequestWithSrcTxHash } from './utils'; const metadata: StateMetadata<{ bridgeStatusState: BridgeStatusControllerState; @@ -30,21 +28,18 @@ const metadata: StateMetadata<{ }; /** The input to start polling for the {@link BridgeStatusController} */ -type BridgeStatusPollingInput = { - networkClientId: NetworkClientId; - statusRequest: StatusRequest; -}; +type BridgeStatusPollingInput = FetchBridgeTxStatusArgs; -type SrcTxHash = string; +type SrcTxMetaId = string; export type FetchBridgeTxStatusArgs = { - statusRequest: StatusRequest; + bridgeTxMetaId: string; }; export default class BridgeStatusController extends StaticIntervalPollingController()< typeof BRIDGE_STATUS_CONTROLLER_NAME, { bridgeStatusState: BridgeStatusControllerState }, BridgeStatusControllerMessenger > { - #pollingTokensBySrcTxHash: Record = {}; + #pollingTokensByTxMetaId: Record = {}; constructor({ messenger, @@ -130,94 +125,82 @@ export default class BridgeStatusController extends StaticIntervalPollingControl const historyItems = Object.values(bridgeStatusState.txHistory); const incompleteHistoryItems = historyItems .filter( - (historyItem) => historyItem.status.status !== StatusTypes.COMPLETE, + (historyItem) => + historyItem.status.status === StatusTypes.PENDING || + historyItem.status.status === StatusTypes.UNKNOWN, ) .filter((historyItem) => { // Check if we are already polling this tx, if so, skip restarting polling for that - const srcTxHash = historyItem.status.srcChain.txHash; - const pollingToken = this.#pollingTokensBySrcTxHash[srcTxHash]; + const srcTxMetaId = historyItem.txMetaId; + const pollingToken = this.#pollingTokensByTxMetaId[srcTxMetaId]; return !pollingToken; }); incompleteHistoryItems.forEach((historyItem) => { - const statusRequest = { - bridgeId: historyItem.quote.bridgeId, - srcTxHash: historyItem.status.srcChain.txHash, - bridge: historyItem.quote.bridges[0], - srcChainId: historyItem.quote.srcChainId, - destChainId: historyItem.quote.destChainId, - quote: historyItem.quote, - refuel: Boolean(historyItem.quote.refuel), - }; - - const hexSourceChainId = decimalToPrefixedHex(statusRequest.srcChainId); - const networkClientId = this.messagingSystem.call( - 'NetworkController:findNetworkClientIdByChainId', - hexSourceChainId, - ); + const bridgeTxMetaId = historyItem.txMetaId; // We manually call startPolling() here rather than go through startPollingForBridgeTxStatus() // because we don't want to overwrite the existing historyItem in state - this.#pollingTokensBySrcTxHash[statusRequest.srcTxHash] = - this.startPolling({ networkClientId, statusRequest }); + this.#pollingTokensByTxMetaId[bridgeTxMetaId] = this.startPolling({ + bridgeTxMetaId, + }); }); }; startPollingForBridgeTxStatus = ( - startPollingForBridgeTxStatusArgs: StartPollingForBridgeTxStatusArgs, + startPollingForBridgeTxStatusArgs: StartPollingForBridgeTxStatusArgsSerialized, ) => { const { + bridgeTxMeta, statusRequest, quoteResponse, startTime, slippagePercentage, - pricingData, initialDestAssetBalance, targetContractAddress, } = startPollingForBridgeTxStatusArgs; - const hexSourceChainId = decimalToPrefixedHex(statusRequest.srcChainId); - const { bridgeStatusState } = this.state; const { address: account } = this.#getSelectedAccount(); // Write all non-status fields to state so we can reference the quote in Activity list without the Bridge API // We know it's in progress but not the exact status yet + const txHistoryItem = { + txMetaId: bridgeTxMeta.id, + quote: quoteResponse.quote, + startTime, + estimatedProcessingTimeInSeconds: + quoteResponse.estimatedProcessingTimeInSeconds, + slippagePercentage, + pricingData: { + amountSent: quoteResponse.sentAmount.amount, + }, + initialDestAssetBalance, + targetContractAddress, + account, + status: { + // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that + // Also we know the bare minimum fields for status at this point in time + status: StatusTypes.PENDING, + srcChain: { + chainId: statusRequest.srcChainId, + txHash: statusRequest.srcTxHash, + }, + }, + }; this.update((_state) => { _state.bridgeStatusState = { ...bridgeStatusState, txHistory: { ...bridgeStatusState.txHistory, - [statusRequest.srcTxHash]: { - quote: quoteResponse.quote, - startTime, - estimatedProcessingTimeInSeconds: - quoteResponse.estimatedProcessingTimeInSeconds, - slippagePercentage, - pricingData, - initialDestAssetBalance, - targetContractAddress, - account, - status: { - // We always have a PENDING status when we start polling for a tx, don't need the Bridge API for that - // Also we know the bare minimum fields for status at this point in time - status: StatusTypes.PENDING, - srcChain: { - chainId: statusRequest.srcChainId, - txHash: statusRequest.srcTxHash, - }, - }, - }, + // Use the txMeta.id as the key so we can reference the txMeta in TransactionController + [bridgeTxMeta.id]: txHistoryItem, }, }; }); - const networkClientId = this.messagingSystem.call( - 'NetworkController:findNetworkClientIdByChainId', - hexSourceChainId, - ); - this.#pollingTokensBySrcTxHash[statusRequest.srcTxHash] = this.startPolling( - { networkClientId, statusRequest }, - ); + this.#pollingTokensByTxMetaId[bridgeTxMeta.id] = this.startPolling({ + bridgeTxMetaId: bridgeTxMeta.id, + }); }; // This will be called after you call this.startPolling() @@ -231,14 +214,26 @@ export default class BridgeStatusController extends StaticIntervalPollingControl } #fetchBridgeTxStatus = async ({ - networkClientId: _networkClientId, - statusRequest, - }: BridgeStatusPollingInput) => { + bridgeTxMetaId, + }: FetchBridgeTxStatusArgs) => { const { bridgeStatusState } = this.state; try { // We try here because we receive 500 errors from Bridge API if we try to fetch immediately after submitting the source tx // Oddly mostly happens on Optimism, never on Arbitrum. By the 2nd fetch, the Bridge API responds properly. + // Also srcTxHash may not be available immediately for STX, so we don't want to fetch in those cases + const historyItem = bridgeStatusState.txHistory[bridgeTxMetaId]; + const srcTxHash = this.#getSrcTxHash(bridgeTxMetaId); + if (!srcTxHash) { + return; + } + + this.#updateSrcTxHash(bridgeTxMetaId, srcTxHash); + + const statusRequest = getStatusRequestWithSrcTxHash( + historyItem.quote, + srcTxHash, + ); const status = await fetchBridgeTxStatus(statusRequest); // No need to purge these on network change or account change, TransactionController does not purge either. @@ -247,13 +242,13 @@ export default class BridgeStatusController extends StaticIntervalPollingControl // First stab at this will not stop polling when you are on a different account this.update((_state) => { const bridgeHistoryItem = - _state.bridgeStatusState.txHistory[statusRequest.srcTxHash]; + _state.bridgeStatusState.txHistory[bridgeTxMetaId]; _state.bridgeStatusState = { ...bridgeStatusState, txHistory: { ...bridgeStatusState.txHistory, - [statusRequest.srcTxHash]: { + [bridgeTxMetaId]: { ...bridgeHistoryItem, status, }, @@ -261,8 +256,7 @@ export default class BridgeStatusController extends StaticIntervalPollingControl }; }); - const pollingToken = - this.#pollingTokensBySrcTxHash[statusRequest.srcTxHash]; + const pollingToken = this.#pollingTokensByTxMetaId[bridgeTxMetaId]; if (status.status === StatusTypes.COMPLETE && pollingToken) { this.stopPollingByPollingToken(pollingToken); } @@ -271,43 +265,86 @@ export default class BridgeStatusController extends StaticIntervalPollingControl } }; + #getSrcTxHash = (bridgeTxMetaId: string): string | undefined => { + const { bridgeStatusState } = this.state; + // Prefer the srcTxHash from bridgeStatusState so we don't have to l ook up in TransactionController + // But it is possible to have bridgeHistoryItem in state without the srcTxHash yet when it is an STX + const srcTxHash = + bridgeStatusState.txHistory[bridgeTxMetaId].status.srcChain.txHash; + + if (srcTxHash) { + return srcTxHash; + } + + // Look up in TransactionController if txMeta has been updated with the srcTxHash + const txControllerState = this.messagingSystem.call( + 'TransactionController:getState', + ); + const txMeta = txControllerState.transactions.find( + (tx) => tx.id === bridgeTxMetaId, + ); + return txMeta?.hash; + }; + + #updateSrcTxHash = (bridgeTxMetaId: string, srcTxHash: string) => { + const { bridgeStatusState } = this.state; + if (bridgeStatusState.txHistory[bridgeTxMetaId].status.srcChain.txHash) { + return; + } + + this.update((_state) => { + _state.bridgeStatusState = { + ...bridgeStatusState, + txHistory: { + ...bridgeStatusState.txHistory, + [bridgeTxMetaId]: { + ...bridgeStatusState.txHistory[bridgeTxMetaId], + status: { + ...bridgeStatusState.txHistory[bridgeTxMetaId].status, + srcChain: { + ...bridgeStatusState.txHistory[bridgeTxMetaId].status.srcChain, + txHash: srcTxHash, + }, + }, + }, + }, + }; + }); + }; + // Wipes the bridge status for the given address and chainId - // Will match either source or destination chainId to the selectedChainId + // Will match only source chainId to the selectedChainId #wipeBridgeStatusByChainId = (address: string, selectedChainId: Hex) => { - const sourceTxHashesToDelete = Object.keys( + const sourceTxMetaIdsToDelete = Object.keys( this.state.bridgeStatusState.txHistory, - ).filter((sourceTxHash) => { + ).filter((txMetaId) => { const bridgeHistoryItem = - this.state.bridgeStatusState.txHistory[sourceTxHash]; + this.state.bridgeStatusState.txHistory[txMetaId]; const hexSourceChainId = decimalToPrefixedHex( bridgeHistoryItem.quote.srcChainId, ); - const hexDestChainId = decimalToPrefixedHex( - bridgeHistoryItem.quote.destChainId, - ); return ( bridgeHistoryItem.account === address && - (hexSourceChainId === selectedChainId || - hexDestChainId === selectedChainId) + hexSourceChainId === selectedChainId ); }); - sourceTxHashesToDelete.forEach((sourceTxHash) => { - const pollingToken = this.#pollingTokensBySrcTxHash[sourceTxHash]; + sourceTxMetaIdsToDelete.forEach((sourceTxMetaId) => { + const pollingToken = this.#pollingTokensByTxMetaId[sourceTxMetaId]; if (pollingToken) { this.stopPollingByPollingToken( - this.#pollingTokensBySrcTxHash[sourceTxHash], + this.#pollingTokensByTxMetaId[sourceTxMetaId], ); } }); this.update((_state) => { - _state.bridgeStatusState.txHistory = sourceTxHashesToDelete.reduce( - (acc, sourceTxHash) => { - delete acc[sourceTxHash]; + _state.bridgeStatusState.txHistory = sourceTxMetaIdsToDelete.reduce( + (acc, sourceTxMetaId) => { + delete acc[sourceTxMetaId]; return acc; }, _state.bridgeStatusState.txHistory, diff --git a/app/scripts/controllers/bridge-status/mocks.ts b/app/scripts/controllers/bridge-status/mocks.ts new file mode 100644 index 000000000000..1507af5830ec --- /dev/null +++ b/app/scripts/controllers/bridge-status/mocks.ts @@ -0,0 +1,327 @@ +import { TransactionMeta } from '@metamask/transaction-controller'; +import { + BridgeId, + StatusResponse, + StatusTypes, + ActionTypes, + StartPollingForBridgeTxStatusArgsSerialized, +} from '../../../../shared/types/bridge-status'; + +export const MockStatusResponse = { + getPending: ({ + srcTxHash = '0xsrcTxHash1', + srcChainId = 42161, + destChainId = 10, + } = {}) => ({ + status: 'PENDING' as StatusTypes, + srcChain: { + chainId: srcChainId, + txHash: srcTxHash, + amount: '991250000000000', + token: { + address: '0x0000000000000000000000000000000000000000', + chainId: srcChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2518.47', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + }, + destChain: { + chainId: destChainId, + token: {}, + }, + }), + getComplete: ({ + srcTxHash = '0xsrcTxHash1', + destTxHash = '0xdestTxHash1', + srcChainId = 42161, + destChainId = 10, + } = {}) => ({ + status: 'COMPLETE' as StatusTypes, + isExpectedToken: true, + bridge: 'across' as BridgeId, + srcChain: { + chainId: srcChainId, + txHash: srcTxHash, + amount: '991250000000000', + token: { + address: '0x0000000000000000000000000000000000000000', + chainId: srcChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.7', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + }, + destChain: { + chainId: destChainId, + txHash: destTxHash, + amount: '990654755978611', + token: { + address: '0x0000000000000000000000000000000000000000', + chainId: destChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.63', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + }, + }), +}; + +let mockFetchBridgeTxStatusCount = 0; +export const mockFetchBridgeTxStatus: () => Promise = () => { + return new Promise((resolve) => { + console.log('HELLO mockFetchBridgeTxStatus', mockFetchBridgeTxStatusCount); + setTimeout(() => { + if (mockFetchBridgeTxStatusCount === 0) { + resolve( + MockStatusResponse.getPending({ + srcTxHash: + '0xe3e223b9725765a7de557effdb2b507ace3534bcff2c1fe3a857e0791e56a518', + srcChainId: 1, + destChainId: 42161, + }), + ); + } else { + resolve( + MockStatusResponse.getComplete({ + srcTxHash: + '0xe3e223b9725765a7de557effdb2b507ace3534bcff2c1fe3a857e0791e56a518', + destTxHash: + '0x010e1bffe8288956012e6b6132d7eb3eaf9d0bbf066bd13aae13b973c678508f', + srcChainId: 1, + destChainId: 42161, + }), + ); + } + mockFetchBridgeTxStatusCount += 1; + }, 2000); + }); +}; + +export const getMockQuote = ({ + srcChainId = 42161, + destChainId = 10, +} = {}) => ({ + requestId: '197c402f-cb96-4096-9f8c-54aed84ca776', + srcChainId, + srcTokenAmount: '991250000000000', + srcAsset: { + address: '0x0000000000000000000000000000000000000000', + chainId: srcChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.7', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + destChainId, + destTokenAmount: '990654755978612', + destAsset: { + address: '0x0000000000000000000000000000000000000000', + chainId: destChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.63', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + feeData: { + metabridge: { + amount: '8750000000000', + asset: { + address: '0x0000000000000000000000000000000000000000', + chainId: srcChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.7', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + }, + }, + bridgeId: 'lifi', + bridges: ['across'], + steps: [ + { + action: 'bridge' as ActionTypes, + srcChainId, + destChainId, + protocol: { + name: 'across', + displayName: 'Across', + icon: 'https://raw.githubusercontent.com/lifinance/types/main/src/assets/icons/bridges/acrossv2.png', + }, + srcAsset: { + address: '0x0000000000000000000000000000000000000000', + chainId: srcChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.7', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + destAsset: { + address: '0x0000000000000000000000000000000000000000', + chainId: destChainId, + symbol: 'ETH', + decimals: 18, + name: 'ETH', + coinKey: 'ETH', + logoURI: + 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + priceUSD: '2478.63', + icon: 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png', + }, + srcAmount: '991250000000000', + destAmount: '990654755978612', + }, + ], +}); + +export const getMockStartPollingForBridgeTxStatusArgs = ({ + txMetaId = 'bridgeTxMetaId1', + srcTxHash = '0xsrcTxHash1', + account = '0xaccount1', + srcChainId = 42161, + destChainId = 10, +} = {}): StartPollingForBridgeTxStatusArgsSerialized => ({ + bridgeTxMeta: { + id: txMetaId, + } as TransactionMeta, + statusRequest: { + bridgeId: 'lifi', + srcTxHash, + bridge: 'across', + srcChainId, + destChainId, + quote: getMockQuote({ srcChainId, destChainId }), + refuel: false, + }, + quoteResponse: { + quote: getMockQuote({ srcChainId, destChainId }), + trade: { + chainId: srcChainId, + to: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', + from: account, + value: '0x038d7ea4c68000', + data: '0x3ce33bff0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000d6c6966694164617074657256320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000e397c4883ec89ed4fc9d258f00c689708b2799c9000000000000000000000000e397c4883ec89ed4fc9d258f00c689708b2799c9000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038589602234000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000007f544a44c0000000000000000000000000056ca675c3633cc16bd6849e2b431d4e8de5e23bf000000000000000000000000000000000000000000000000000000000000006c5a39b10a4f4f0747826140d2c5fe6ef47965741f6f7a4734bf784bf3ae3f24520000000a000222266cc2dca0671d2a17ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00dfeeddeadbeef8932eb23bad9bddb5cf81426f78279a53c6c3b7100000000000000000000000000000000000000009ce3c510b3f58edc8d53ae708056e30926f62d0b42d5c9b61c391bb4e8a2c1917f8ed995169ffad0d79af2590303e83c57e15a9e0b248679849556c2e03a1c811b', + gasLimit: 282915, + }, + approval: null, + estimatedProcessingTimeInSeconds: 15, + sentAmount: { amount: '1.234', fiat: null }, + }, + startTime: 1729964825189, + slippagePercentage: 0, + initialDestAssetBalance: undefined, + targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', +}); + +export const MockTxHistory = { + getInitNoSrcTxHash: ({ + txMetaId = 'bridgeTxMetaId1', + account = '0xaccount1', + srcChainId = 42161, + destChainId = 10, + } = {}) => ({ + [txMetaId]: { + txMetaId, + quote: getMockQuote({ srcChainId, destChainId }), + startTime: 1729964825189, + estimatedProcessingTimeInSeconds: 15, + slippagePercentage: 0, + account, + targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', + initialDestAssetBalance: undefined, + pricingData: { amountSent: '1.234' }, + }, + }), + getInit: ({ + txMetaId = 'bridgeTxMetaId1', + account = '0xaccount1', + srcChainId = 42161, + destChainId = 10, + } = {}) => ({ + [txMetaId]: { + txMetaId, + quote: getMockQuote({ srcChainId, destChainId }), + startTime: 1729964825189, + estimatedProcessingTimeInSeconds: 15, + slippagePercentage: 0, + account, + targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', + initialDestAssetBalance: undefined, + pricingData: { amountSent: '1.234' }, + }, + }), + getPending: ({ + txMetaId = 'bridgeTxMetaId1', + srcTxHash = '0xsrcTxHash1', + account = '0xaccount1', + srcChainId = 42161, + destChainId = 10, + } = {}) => ({ + [txMetaId]: { + txMetaId, + quote: getMockQuote({ srcChainId, destChainId }), + startTime: 1729964825189, + estimatedProcessingTimeInSeconds: 15, + slippagePercentage: 0, + account, + status: MockStatusResponse.getPending({ + srcTxHash, + srcChainId, + }), + targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', + initialDestAssetBalance: undefined, + pricingData: { amountSent: '1.234' }, + }, + }), + getComplete: ({ + txMetaId = 'bridgeTxMetaId1', + srcTxHash = '0xsrcTxHash1', + account = '0xaccount1', + srcChainId = 42161, + destChainId = 10, + } = {}) => ({ + [txMetaId]: { + txMetaId, + quote: getMockQuote({ srcChainId, destChainId }), + startTime: 1729964825189, + estimatedProcessingTimeInSeconds: 15, + slippagePercentage: 0, + account, + status: MockStatusResponse.getComplete({ srcTxHash }), + targetContractAddress: '0x23981fC34e69eeDFE2BD9a0a9fCb0719Fe09DbFC', + initialDestAssetBalance: undefined, + pricingData: { amountSent: '1.234' }, + }, + }), +}; diff --git a/app/scripts/controllers/bridge-status/types.ts b/app/scripts/controllers/bridge-status/types.ts index 040cd1e0c9bd..d06c3c40b3d8 100644 --- a/app/scripts/controllers/bridge-status/types.ts +++ b/app/scripts/controllers/bridge-status/types.ts @@ -9,6 +9,7 @@ import { NetworkControllerGetStateAction, } from '@metamask/network-controller'; import { AccountsControllerGetSelectedAccountAction } from '@metamask/accounts-controller'; +import { TransactionControllerGetStateAction } from '@metamask/transaction-controller'; import { BridgeStatusAction, BridgeStatusControllerState, @@ -37,11 +38,19 @@ type BridgeStatusControllerEvents = ControllerStateChangeEvent< BridgeStatusControllerState >; +/** + * The external actions available to the BridgeStatusController. + */ type AllowedActions = | NetworkControllerFindNetworkClientIdByChainIdAction | NetworkControllerGetStateAction | NetworkControllerGetNetworkClientByIdAction - | AccountsControllerGetSelectedAccountAction; + | AccountsControllerGetSelectedAccountAction + | TransactionControllerGetStateAction; + +/** + * The external events available to the BridgeStatusController. + */ type AllowedEvents = never; /** diff --git a/app/scripts/controllers/bridge-status/utils.ts b/app/scripts/controllers/bridge-status/utils.ts index 323e7e2faeab..d8dbac9e1590 100644 --- a/app/scripts/controllers/bridge-status/utils.ts +++ b/app/scripts/controllers/bridge-status/utils.ts @@ -5,24 +5,44 @@ import { import fetchWithCache from '../../../../shared/lib/fetch-with-cache'; import { StatusResponse, - StatusRequest, + StatusRequestWithSrcTxHash, + StatusRequestDto, } from '../../../../shared/types/bridge-status'; +// TODO fix this +// eslint-disable-next-line import/no-restricted-paths +import { Quote } from '../../../../ui/pages/bridge/types'; import { validateResponse, validators } from './validators'; const CLIENT_ID_HEADER = { 'X-Client-Id': BRIDGE_CLIENT_ID }; export const BRIDGE_STATUS_BASE_URL = `${BRIDGE_API_BASE_URL}/getTxStatus`; -export const fetchBridgeTxStatus = async (statusRequest: StatusRequest) => { - // Assemble params +export const getStatusRequestDto = ( + statusRequest: StatusRequestWithSrcTxHash, +): StatusRequestDto => { const { quote, ...statusRequestNoQuote } = statusRequest; + const statusRequestNoQuoteFormatted = Object.fromEntries( Object.entries(statusRequestNoQuote).map(([key, value]) => [ key, value.toString(), ]), - ); - const params = new URLSearchParams(statusRequestNoQuoteFormatted); + ) as unknown as Omit; + + const requestId: { requestId: string } | Record = + quote?.requestId ? { requestId: quote.requestId } : {}; + + return { + ...statusRequestNoQuoteFormatted, + ...requestId, + }; +}; + +export const fetchBridgeTxStatus = async ( + statusRequest: StatusRequestWithSrcTxHash, +) => { + const statusRequestDto = getStatusRequestDto(statusRequest); + const params = new URLSearchParams(statusRequestDto); // Fetch const url = `${BRIDGE_STATUS_BASE_URL}?${params.toString()}`; @@ -47,3 +67,18 @@ export const fetchBridgeTxStatus = async (statusRequest: StatusRequest) => { // Return return rawTxStatus; }; + +export const getStatusRequestWithSrcTxHash = ( + quote: Quote, + srcTxHash: string, +): StatusRequestWithSrcTxHash => { + return { + bridgeId: quote.bridgeId, + srcTxHash, + bridge: quote.bridges[0], + srcChainId: quote.srcChainId, + destChainId: quote.destChainId, + quote, + refuel: Boolean(quote.refuel), + }; +}; diff --git a/app/scripts/controllers/bridge-status/validators.test.ts b/app/scripts/controllers/bridge-status/validators.test.ts index 18ca81d7a5b2..83877b80bdb5 100644 --- a/app/scripts/controllers/bridge-status/validators.test.ts +++ b/app/scripts/controllers/bridge-status/validators.test.ts @@ -162,6 +162,43 @@ const BridgeTxStatusResponses = { }, }, }, + STATUS_COMPLETE_VALID_MISSING_FIELDS_2: { + status: 'COMPLETE', + isExpectedToken: false, + bridge: 'across', + srcChain: { + chainId: 10, + txHash: + '0x4c57876fad21fb5149af5a58a4aba2ca9d6b212014505dd733b75667ca4f0f2b', + amount: '991250000000000', + token: { + chainId: 10, + address: '0x4200000000000000000000000000000000000006', + symbol: 'WETH', + name: 'Wrapped Ether', + decimals: 18, + icon: 'https://media.socket.tech/tokens/all/WETH', + // logoURI: 'https://media.socket.tech/tokens/all/WETH', + // chainAgnosticId: 'ETH', + }, + }, + destChain: { + chainId: 8453, + txHash: + '0x60c4cad7c3eb14c7b3ace40cd4015b90927dadacbdc8673f404bea6a5603844b', + amount: '988339336750062', + token: { + chainId: 8453, + address: '0x4200000000000000000000000000000000000006', + symbol: 'WETH', + name: 'Wrapped Ether', + decimals: 18, + icon: null, + // logoURI: null, + // chainAgnosticId: null, + }, + }, + }, STATUS_COMPLETE_INVALID_MISSING_FIELDS: { status: 'COMPLETE', isExpectedToken: true, @@ -203,6 +240,11 @@ describe('validators', () => { expected: false, description: 'complete bridge status with missing fields', }, + { + input: BridgeTxStatusResponses.STATUS_COMPLETE_VALID_MISSING_FIELDS_2, + expected: true, + description: 'complete bridge status with missing fields 2', + }, { input: BridgeTxStatusResponses.STATUS_COMPLETE_VALID_MISSING_FIELDS, expected: true, diff --git a/app/scripts/controllers/bridge-status/validators.ts b/app/scripts/controllers/bridge-status/validators.ts index 69e788025b01..b942317a3119 100644 --- a/app/scripts/controllers/bridge-status/validators.ts +++ b/app/scripts/controllers/bridge-status/validators.ts @@ -54,9 +54,10 @@ const assetValidators = [ }, { property: 'icon', - type: 'string|undefined', - validator: (v: unknown): v is string | undefined => - v === undefined || typeof v === 'string', + // typeof null === 'object' + type: 'string|undefined|object', + validator: (v: unknown): v is string | undefined | object => + v === undefined || v === null || typeof v === 'string', }, ]; diff --git a/app/scripts/controllers/bridge/bridge-controller.test.ts b/app/scripts/controllers/bridge/bridge-controller.test.ts index dcfe4b21554e..3b0d095fa0c3 100644 --- a/app/scripts/controllers/bridge/bridge-controller.test.ts +++ b/app/scripts/controllers/bridge/bridge-controller.test.ts @@ -18,7 +18,7 @@ import { QuoteResponse } from '../../../../ui/pages/bridge/types'; import { decimalToHex } from '../../../../shared/modules/conversion.utils'; import BridgeController from './bridge-controller'; import { BridgeControllerMessenger } from './types'; -import { DEFAULT_BRIDGE_CONTROLLER_STATE } from './constants'; +import { DEFAULT_BRIDGE_CONTROLLER_STATE, RequestStatus } from './constants'; const EMPTY_INIT_STATE = { bridgeState: DEFAULT_BRIDGE_CONTROLLER_STATE, @@ -66,10 +66,26 @@ describe('BridgeController', function () { 'extension-config': { refreshRate: 3, maxRefreshCount: 3, + support: true, + chains: { + '10': { + isActiveSrc: true, + isActiveDest: false, + }, + '534352': { + isActiveSrc: true, + isActiveDest: false, + }, + '137': { + isActiveSrc: false, + isActiveDest: true, + }, + '42161': { + isActiveSrc: false, + isActiveDest: true, + }, + }, }, - 'extension-support': true, - 'src-network-allowlist': [10, 534352], - 'dest-network-allowlist': [137, 42161], 'approval-gas-multiplier': { '137': 1.1, '42161': 1.2, @@ -90,6 +106,7 @@ describe('BridgeController', function () { address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', symbol: 'ABC', decimals: 16, + aggregators: ['lifl', 'socket'], }, { address: '0x1291478912', @@ -114,12 +131,16 @@ describe('BridgeController', function () { it('setBridgeFeatureFlags should fetch and set the bridge feature flags', async function () { const expectedFeatureFlagsResponse = { - extensionSupport: true, - destNetworkAllowlist: [CHAIN_IDS.POLYGON, CHAIN_IDS.ARBITRUM], - srcNetworkAllowlist: [CHAIN_IDS.OPTIMISM, CHAIN_IDS.SCROLL], extensionConfig: { maxRefreshCount: 3, refreshRate: 3, + support: true, + chains: { + [CHAIN_IDS.OPTIMISM]: { isActiveSrc: true, isActiveDest: false }, + [CHAIN_IDS.SCROLL]: { isActiveSrc: true, isActiveDest: false }, + [CHAIN_IDS.POLYGON]: { isActiveSrc: false, isActiveDest: true }, + [CHAIN_IDS.ARBITRUM]: { isActiveSrc: false, isActiveDest: true }, + }, }, }; expect(bridgeController.state).toStrictEqual(EMPTY_INIT_STATE); @@ -151,6 +172,12 @@ describe('BridgeController', function () { it('selectDestNetwork should set the bridge dest tokens and top assets', async function () { await bridgeController.selectDestNetwork('0xa'); expect(bridgeController.state.bridgeState.destTokens).toStrictEqual({ + '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984': { + address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', + symbol: 'ABC', + decimals: 16, + aggregators: ['lifl', 'socket'], + }, '0x0000000000000000000000000000000000000000': { address: '0x0000000000000000000000000000000000000000', decimals: 18, @@ -158,12 +185,10 @@ describe('BridgeController', function () { name: 'Ether', symbol: 'ETH', }, - '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984': { - address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', - symbol: 'ABC', - decimals: 16, - }, }); + expect( + bridgeController.state.bridgeState.destTokensLoadingStatus, + ).toStrictEqual(RequestStatus.FETCHED); expect(bridgeController.state.bridgeState.destTopAssets).toStrictEqual([ { address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', symbol: 'ABC' }, ]); @@ -188,8 +213,12 @@ describe('BridgeController', function () { address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', symbol: 'ABC', decimals: 16, + aggregators: ['lifl', 'socket'], }, }); + expect( + bridgeController.state.bridgeState.srcTokensLoadingStatus, + ).toStrictEqual(RequestStatus.FETCHED); expect(bridgeController.state.bridgeState.srcTopAssets).toStrictEqual([ { address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', @@ -393,6 +422,7 @@ describe('BridgeController', function () { ...mockBridgeQuotesNativeErc20Eth, ], quotesLoadingStatus: 1, + quoteFetchError: undefined, quotesRefreshCount: 2, }), ); @@ -413,12 +443,14 @@ describe('BridgeController', function () { ...mockBridgeQuotesNativeErc20Eth, ], quotesLoadingStatus: 2, + quoteFetchError: 'Network error', quotesRefreshCount: 3, }), ); - expect(bridgeController.state.bridgeState.quotesLastFetched).toStrictEqual( - secondFetchTime, - ); + secondFetchTime && + expect( + bridgeController.state.bridgeState.quotesLastFetched, + ).toBeGreaterThan(secondFetchTime); expect(hasSufficientBalanceSpy).toHaveBeenCalledTimes(1); expect(getLayer1GasFeeMock).not.toHaveBeenCalled(); @@ -487,6 +519,7 @@ describe('BridgeController', function () { quoteRequest: { ...quoteRequest, walletAddress: undefined }, quotes: DEFAULT_BRIDGE_CONTROLLER_STATE.quotes, quotesLastFetched: DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLastFetched, + quotesInitialLoadTime: undefined, quotesLoadingStatus: DEFAULT_BRIDGE_CONTROLLER_STATE.quotesLoadingStatus, }), @@ -524,6 +557,7 @@ describe('BridgeController', function () { quotes: mockBridgeQuotesNativeErc20Eth, quotesLoadingStatus: 1, quotesRefreshCount: 1, + quotesInitialLoadTime: 11000, }), ); const firstFetchTime = @@ -540,6 +574,7 @@ describe('BridgeController', function () { quotes: mockBridgeQuotesNativeErc20Eth, quotesLoadingStatus: 1, quotesRefreshCount: 1, + quotesInitialLoadTime: 11000, }), ); const secondFetchTime = diff --git a/app/scripts/controllers/bridge/bridge-controller.ts b/app/scripts/controllers/bridge/bridge-controller.ts index 319c5406c259..4770c342587c 100644 --- a/app/scripts/controllers/bridge/bridge-controller.ts +++ b/app/scripts/controllers/bridge/bridge-controller.ts @@ -70,6 +70,8 @@ export default class BridgeController extends StaticIntervalPollingController
{ #abortController: AbortController | undefined; + #quotesFirstFetched: number | undefined; + #getLayer1GasFee: (params: { transactionParams: TransactionParams; chainId: ChainId; @@ -150,11 +152,15 @@ export default class BridgeController extends StaticIntervalPollingController
{ - await this.#setTopAssets(chainId, 'srcTopAssets'); - await this.#setTokens(chainId, 'srcTokens'); + this.update((state) => { + state.bridgeState.srcTokensLoadingStatus = RequestStatus.LOADING; + return state; + }); + try { + await this.#setTopAssets(chainId, 'srcTopAssets'); + await this.#setTokens(chainId, 'srcTokens'); + } finally { + this.update((state) => { + state.bridgeState.srcTokensLoadingStatus = RequestStatus.FETCHED; + return state; + }); + } }; selectDestNetwork = async (chainId: Hex) => { - await this.#setTopAssets(chainId, 'destTopAssets'); - await this.#setTokens(chainId, 'destTokens'); + this.update((state) => { + state.bridgeState.destTokensLoadingStatus = RequestStatus.LOADING; + return state; + }); + try { + await this.#setTopAssets(chainId, 'destTopAssets'); + await this.#setTokens(chainId, 'destTokens'); + } finally { + this.update((state) => { + state.bridgeState.destTokensLoadingStatus = RequestStatus.FETCHED; + return state; + }); + } }; #fetchBridgeQuotes = async ({ @@ -242,11 +270,9 @@ export default class BridgeController extends StaticIntervalPollingController
= 1) || - (!updatedQuoteRequest.insufficientBal && - newQuotesRefreshCount >= maxRefreshCount) - ) { - this.stopAllPolling(); - } - const quotesWithL1GasFees = await this.#appendL1GasFees(quotes); this.update((_state) => { _state.bridgeState = { ..._state.bridgeState, quotes: quotesWithL1GasFees, - quotesLastFetched: Date.now(), quotesLoadingStatus: RequestStatus.FETCHED, - quotesRefreshCount: newQuotesRefreshCount, }; }); } catch (error) { @@ -284,11 +299,39 @@ export default class BridgeController extends StaticIntervalPollingController
{ _state.bridgeState = { ...bridgeState, + quoteFetchError: + error instanceof Error ? error.message : 'Unknown error', quotesLoadingStatus: RequestStatus.ERROR, - quotesRefreshCount: newQuotesRefreshCount, }; }); console.log('Failed to fetch bridge quotes', error); + } finally { + const { maxRefreshCount } = + bridgeState.bridgeFeatureFlags[BridgeFeatureFlagsKey.EXTENSION_CONFIG]; + + const updatedQuotesRefreshCount = bridgeState.quotesRefreshCount + 1; + // Stop polling if the maximum number of refreshes has been reached + if ( + updatedQuoteRequest.insufficientBal || + (!updatedQuoteRequest.insufficientBal && + updatedQuotesRefreshCount >= maxRefreshCount) + ) { + this.stopAllPolling(); + } + + // Update quote fetching stats + const quotesLastFetched = Date.now(); + this.update((_state) => { + _state.bridgeState = { + ..._state.bridgeState, + quotesInitialLoadTime: + updatedQuotesRefreshCount === 1 && this.#quotesFirstFetched + ? quotesLastFetched - this.#quotesFirstFetched + : bridgeState.quotesInitialLoadTime, + quotesLastFetched, + quotesRefreshCount: updatedQuotesRefreshCount, + }; + }); } }; diff --git a/app/scripts/controllers/bridge/constants.ts b/app/scripts/controllers/bridge/constants.ts index ec60f8e6a0a4..4903a9ee2858 100644 --- a/app/scripts/controllers/bridge/constants.ts +++ b/app/scripts/controllers/bridge/constants.ts @@ -1,13 +1,15 @@ import { zeroAddress } from 'ethereumjs-util'; import { Hex } from '@metamask/utils'; -import { METABRIDGE_ETHEREUM_ADDRESS } from '../../../../shared/constants/bridge'; +import { + BRIDGE_DEFAULT_SLIPPAGE, + METABRIDGE_ETHEREUM_ADDRESS, +} from '../../../../shared/constants/bridge'; import { CHAIN_IDS } from '../../../../shared/constants/network'; import { BridgeControllerState, BridgeFeatureFlagsKey } from './types'; export const BRIDGE_CONTROLLER_NAME = 'BridgeController'; export const REFRESH_INTERVAL_MS = 30 * 1000; const DEFAULT_MAX_REFRESH_COUNT = 5; -const DEFAULT_SLIPPAGE = 0.5; export enum RequestStatus { LOADING, @@ -20,23 +22,26 @@ export const DEFAULT_BRIDGE_CONTROLLER_STATE: BridgeControllerState = { [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: { refreshRate: REFRESH_INTERVAL_MS, maxRefreshCount: DEFAULT_MAX_REFRESH_COUNT, + support: false, + chains: {}, }, - [BridgeFeatureFlagsKey.EXTENSION_SUPPORT]: false, - [BridgeFeatureFlagsKey.NETWORK_SRC_ALLOWLIST]: [], - [BridgeFeatureFlagsKey.NETWORK_DEST_ALLOWLIST]: [], }, srcTokens: {}, + srcTokensLoadingStatus: undefined, + destTokensLoadingStatus: undefined, srcTopAssets: [], destTokens: {}, destTopAssets: [], quoteRequest: { walletAddress: undefined, srcTokenAddress: zeroAddress(), - slippage: DEFAULT_SLIPPAGE, + slippage: BRIDGE_DEFAULT_SLIPPAGE, }, + quotesInitialLoadTime: undefined, quotes: [], quotesLastFetched: undefined, quotesLoadingStatus: undefined, + quoteFetchError: undefined, quotesRefreshCount: 0, }; diff --git a/app/scripts/controllers/bridge/types.ts b/app/scripts/controllers/bridge/types.ts index c9e221b82418..7cdfa43cabd0 100644 --- a/app/scripts/controllers/bridge/types.ts +++ b/app/scripts/controllers/bridge/types.ts @@ -16,36 +16,37 @@ import { // TODO: Remove restricted import // eslint-disable-next-line import/no-restricted-paths } from '../../../../ui/pages/bridge/types'; +import { ChainConfiguration } from '../../../../shared/types/bridge'; import BridgeController from './bridge-controller'; import { BRIDGE_CONTROLLER_NAME, RequestStatus } from './constants'; export enum BridgeFeatureFlagsKey { EXTENSION_CONFIG = 'extensionConfig', - EXTENSION_SUPPORT = 'extensionSupport', - NETWORK_SRC_ALLOWLIST = 'srcNetworkAllowlist', - NETWORK_DEST_ALLOWLIST = 'destNetworkAllowlist', } export type BridgeFeatureFlags = { [BridgeFeatureFlagsKey.EXTENSION_CONFIG]: { refreshRate: number; maxRefreshCount: number; + support: boolean; + chains: Record; }; - [BridgeFeatureFlagsKey.EXTENSION_SUPPORT]: boolean; - [BridgeFeatureFlagsKey.NETWORK_SRC_ALLOWLIST]: Hex[]; - [BridgeFeatureFlagsKey.NETWORK_DEST_ALLOWLIST]: Hex[]; }; export type BridgeControllerState = { bridgeFeatureFlags: BridgeFeatureFlags; srcTokens: Record; srcTopAssets: { address: string }[]; + srcTokensLoadingStatus?: RequestStatus; + destTokensLoadingStatus?: RequestStatus; destTokens: Record; destTopAssets: { address: string }[]; quoteRequest: Partial; quotes: (QuoteResponse & L1GasFees)[]; + quotesInitialLoadTime?: number; quotesLastFetched?: number; quotesLoadingStatus?: RequestStatus; + quoteFetchError?: string; quotesRefreshCount: number; }; diff --git a/app/scripts/controllers/metametrics-controller.test.ts b/app/scripts/controllers/metametrics-controller.test.ts index 57c49547c28b..939d8e506070 100644 --- a/app/scripts/controllers/metametrics-controller.test.ts +++ b/app/scripts/controllers/metametrics-controller.test.ts @@ -10,7 +10,7 @@ import { Token, TokensControllerState, } from '@metamask/assets-controllers'; -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { Browser } from 'webextension-polyfill'; import { ControllerMessenger } from '@metamask/base-controller'; import { merge } from 'lodash'; @@ -1669,12 +1669,12 @@ describe('MetaMetricsController', function () { }, ShowNativeTokenAsMainBalance: true, allNfts: {}, - names: { - ethereumAddress: {}, - }, participateInMetaMetrics: true, dataCollectionForMarketing: false, preferences: { privacyMode: true, tokenNetworkFilter: [] }, + names: { + ethereumAddress: {}, + }, securityAlertsEnabled: true, security_providers: ['blockaid'], currentCurrency: 'usd', @@ -1842,6 +1842,40 @@ describe('MetaMetricsController', function () { ); }); }); + describe('updateExtensionUninstallUrl', function () { + it('should include extension version in uninstall URL regardless of MetaMetrics participation', async function () { + await withController(({ controller }) => { + const setUninstallURLSpy = jest.spyOn( + MOCK_EXTENSION.runtime, + 'setUninstallURL', + ); + + // Test with MetaMetrics disabled + controller.updateExtensionUninstallUrl(false, 'test-id'); + expect(setUninstallURLSpy).toHaveBeenCalledWith( + expect.stringContaining(`av=${VERSION}`), + ); + expect(setUninstallURLSpy).toHaveBeenCalledWith( + expect.not.stringContaining('mmi='), + ); + expect(setUninstallURLSpy).toHaveBeenCalledWith( + expect.not.stringContaining('env='), + ); + + // Test with MetaMetrics enabled + controller.updateExtensionUninstallUrl(true, 'test-id'); + expect(setUninstallURLSpy).toHaveBeenCalledWith( + expect.stringContaining(`av=${VERSION}`), + ); + expect(setUninstallURLSpy).toHaveBeenCalledWith( + expect.stringContaining('mmi='), + ); + expect(setUninstallURLSpy).toHaveBeenCalledWith( + expect.stringContaining('env='), + ); + }); + }); + }); }); type WithControllerOptions = { diff --git a/app/scripts/controllers/metametrics-controller.ts b/app/scripts/controllers/metametrics-controller.ts index d2cc114b3d99..9668a9f25b09 100644 --- a/app/scripts/controllers/metametrics-controller.ts +++ b/app/scripts/controllers/metametrics-controller.ts @@ -584,7 +584,6 @@ export default class MetaMetricsController extends BaseController< : {}; this.update((state) => { - // @ts-expect-error this is caused by a bug in Immer, not being able to handle recursive types like Json state.fragments[id] = merge({}, additionalFragmentProps, fragment); }); @@ -779,13 +778,14 @@ export default class MetaMetricsController extends BaseController< const query: { mmi?: string; env?: string; - av?: string; - } = {}; + av: string; + } = { + av: this.version, + }; if (participateInMetaMetrics) { // We only want to track these things if a user opted into metrics. query.mmi = Buffer.from(metaMetricsId).toString('base64'); query.env = this.#environment; - query.av = this.version; } const queryString = new URLSearchParams(query); diff --git a/app/scripts/controllers/mmi-controller.test.ts b/app/scripts/controllers/mmi-controller.test.ts index 71c8329b3dcd..8e52655ee11e 100644 --- a/app/scripts/controllers/mmi-controller.test.ts +++ b/app/scripts/controllers/mmi-controller.test.ts @@ -273,7 +273,7 @@ describe('MMIController', function () { appStateController: new AppStateController({ addUnlockListener: jest.fn(), isUnlocked: jest.fn(() => true), - initState: {}, + state: {}, onInactiveTimeout: jest.fn(), showUnlockRequest: jest.fn(), messenger: { diff --git a/app/scripts/controllers/mmi-controller.ts b/app/scripts/controllers/mmi-controller.ts index 9f2701b2c0b9..7378585a7e8f 100644 --- a/app/scripts/controllers/mmi-controller.ts +++ b/app/scripts/controllers/mmi-controller.ts @@ -27,8 +27,8 @@ import { OriginalRequest, SignatureController, } from '@metamask/signature-controller'; -import { InternalAccount } from '@metamask/keyring-api'; import { toHex } from '@metamask/controller-utils'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils'; // TODO: Remove restricted import // eslint-disable-next-line import/no-restricted-paths @@ -311,7 +311,7 @@ export class MMIController { } } - const txList = this.txStateManager.getTransactions({}, [], false); // Includes all transactions, but we are looping through keyrings. Currently filtering is done in updateCustodianTransactions :-/ + const txList = this.txStateManager.getTransactions(); // Includes all transactions, but we are looping through keyrings. Currently filtering is done in updateCustodianTransactions :-/ try { updateCustodianTransactions({ diff --git a/app/scripts/controllers/permissions/background-api.js b/app/scripts/controllers/permissions/background-api.js index b778ff42385d..8a0942667f17 100644 --- a/app/scripts/controllers/permissions/background-api.js +++ b/app/scripts/controllers/permissions/background-api.js @@ -1,4 +1,4 @@ -import nanoid from 'nanoid'; +import { nanoid } from 'nanoid'; import { CaveatTypes, RestrictedMethods, diff --git a/app/scripts/controllers/permissions/specifications.js b/app/scripts/controllers/permissions/specifications.js index b0b2051b10f5..38a2bb002523 100644 --- a/app/scripts/controllers/permissions/specifications.js +++ b/app/scripts/controllers/permissions/specifications.js @@ -47,7 +47,7 @@ export const CaveatFactories = Object.freeze({ * PermissionController. * * @param {{ - * getInternalAccounts: () => Record, + * getInternalAccounts: () => Record, * }} options - Options bag. */ export const getCaveatSpecifications = ({ @@ -96,7 +96,7 @@ export const getCaveatSpecifications = ({ * * @param {{ * getAllAccounts: () => Promise, - * getInternalAccounts: () => Record, + * getInternalAccounts: () => Record, * }} options - Options bag. * @param options.getAllAccounts - A function that returns all Ethereum accounts * in the current MetaMask instance. @@ -254,7 +254,7 @@ export const getPermissionSpecifications = ({ * corresponds to a PreferencesController identity. * * @param {string[]} accounts - The accounts associated with the caveat. - * @param {() => Record} getInternalAccounts - + * @param {() => Record} getInternalAccounts - * Gets all AccountsController InternalAccounts. */ function validateCaveatAccounts(accounts, getInternalAccounts) { diff --git a/app/scripts/lib/AccountIdentitiesPetnamesBridge.ts b/app/scripts/lib/AccountIdentitiesPetnamesBridge.ts index 87f4d114eabb..dac123744772 100644 --- a/app/scripts/lib/AccountIdentitiesPetnamesBridge.ts +++ b/app/scripts/lib/AccountIdentitiesPetnamesBridge.ts @@ -4,7 +4,7 @@ import { NameType, NameOrigin, } from '@metamask/name-controller'; -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { AccountsControllerChangeEvent, AccountsControllerListAccountsAction, diff --git a/app/scripts/lib/accounts/BalancesController.test.ts b/app/scripts/lib/accounts/BalancesController.test.ts index 982df0289fea..e18fbc1e7be8 100644 --- a/app/scripts/lib/accounts/BalancesController.test.ts +++ b/app/scripts/lib/accounts/BalancesController.test.ts @@ -1,10 +1,6 @@ import { ControllerMessenger } from '@metamask/base-controller'; -import { - Balance, - BtcAccountType, - CaipAssetType, - InternalAccount, -} from '@metamask/keyring-api'; +import { Balance, BtcAccountType, CaipAssetType } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { createMockInternalAccount } from '../../../../test/jest/mocks'; import { MultichainNetworks } from '../../../../shared/constants/multichain/networks'; import { diff --git a/app/scripts/lib/accounts/BalancesController.ts b/app/scripts/lib/accounts/BalancesController.ts index 588053d6ea2a..4b9616fac35f 100644 --- a/app/scripts/lib/accounts/BalancesController.ts +++ b/app/scripts/lib/accounts/BalancesController.ts @@ -8,13 +8,13 @@ import { } from '@metamask/base-controller'; import { BtcAccountType, - KeyringClient, + SolAccountType, + isEvmAccountType, type Balance, type CaipAssetType, - type InternalAccount, - isEvmAccountType, - SolAccountType, } from '@metamask/keyring-api'; +import { type InternalAccount } from '@metamask/keyring-internal-api'; +import { KeyringClient } from '@metamask/keyring-snap-client'; import type { HandleSnapRequest } from '@metamask/snaps-controllers'; import type { SnapId } from '@metamask/snaps-sdk'; import { HandlerType } from '@metamask/snaps-utils'; diff --git a/app/scripts/lib/approval/utils.test.ts b/app/scripts/lib/approval/utils.test.ts new file mode 100644 index 000000000000..14c472df89ba --- /dev/null +++ b/app/scripts/lib/approval/utils.test.ts @@ -0,0 +1,103 @@ +import { + ApprovalController, + ApprovalRequest, +} from '@metamask/approval-controller'; +import { Json } from '@metamask/utils'; +import { ApprovalType } from '@metamask/controller-utils'; +import { providerErrors } from '@metamask/rpc-errors'; +import { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods'; +import { SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES } from '../../../../shared/constants/app'; +import { rejectAllApprovals } from './utils'; + +const ID_MOCK = '123'; +const ID_MOCK_2 = '456'; +const INTERFACE_ID_MOCK = '789'; + +function createApprovalControllerMock( + pendingApprovals: Partial>>[], +) { + return { + state: { + pendingApprovals, + }, + accept: jest.fn(), + reject: jest.fn(), + } as unknown as jest.Mocked; +} + +describe('Approval Utils', () => { + describe('rejectAllApprovals', () => { + it('rejects approval requests with rejected error', () => { + const approvalController = createApprovalControllerMock([ + { id: ID_MOCK, type: ApprovalType.Transaction }, + { id: ID_MOCK_2, type: ApprovalType.EthSignTypedData }, + ]); + + rejectAllApprovals({ + approvalController, + }); + + expect(approvalController.reject).toHaveBeenCalledTimes(2); + expect(approvalController.reject).toHaveBeenCalledWith( + ID_MOCK, + providerErrors.userRejectedRequest(), + ); + expect(approvalController.reject).toHaveBeenCalledWith( + ID_MOCK_2, + providerErrors.userRejectedRequest(), + ); + }); + + // @ts-expect-error This function is missing from the Mocha type definitions + it.each([ + ApprovalType.SnapDialogAlert, + ApprovalType.SnapDialogPrompt, + DIALOG_APPROVAL_TYPES.default, + ])('accepts pending approval if type is %s', (type: string) => { + const approvalController = createApprovalControllerMock([ + { id: ID_MOCK, type }, + ]); + + rejectAllApprovals({ approvalController }); + + expect(approvalController.accept).toHaveBeenCalledTimes(1); + expect(approvalController.accept).toHaveBeenCalledWith(ID_MOCK, null); + }); + + // @ts-expect-error This function is missing from the Mocha type definitions + it.each([ + ApprovalType.SnapDialogConfirmation, + SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.confirmAccountCreation, + SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.confirmAccountRemoval, + SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.showSnapAccountRedirect, + ])('accepts pending approval if type is %s', (type: string) => { + const approvalController = createApprovalControllerMock([ + { id: ID_MOCK, type }, + ]); + + rejectAllApprovals({ approvalController }); + + expect(approvalController.accept).toHaveBeenCalledTimes(1); + expect(approvalController.accept).toHaveBeenCalledWith(ID_MOCK, false); + }); + + // @ts-expect-error This function is missing from the Mocha type definitions + it.each([ + ApprovalType.SnapDialogAlert, + ApprovalType.SnapDialogPrompt, + DIALOG_APPROVAL_TYPES.default, + ApprovalType.SnapDialogConfirmation, + ])('deletes interface if type is %s', (type: string) => { + const approvalController = createApprovalControllerMock([ + { id: ID_MOCK, type, requestData: { id: INTERFACE_ID_MOCK } }, + ]); + + const deleteInterface = jest.fn(); + + rejectAllApprovals({ approvalController, deleteInterface }); + + expect(deleteInterface).toHaveBeenCalledTimes(1); + expect(deleteInterface).toHaveBeenCalledWith(INTERFACE_ID_MOCK); + }); + }); +}); diff --git a/app/scripts/lib/approval/utils.ts b/app/scripts/lib/approval/utils.ts new file mode 100644 index 000000000000..5bd44b5db079 --- /dev/null +++ b/app/scripts/lib/approval/utils.ts @@ -0,0 +1,56 @@ +import { ApprovalController } from '@metamask/approval-controller'; +import { ApprovalType } from '@metamask/controller-utils'; +import { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods'; +import { providerErrors } from '@metamask/rpc-errors'; +import { createProjectLogger } from '@metamask/utils'; +///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) +import { SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES } from '../../../../shared/constants/app'; +///: END:ONLY_INCLUDE_IF + +const log = createProjectLogger('approval-utils'); + +export function rejectAllApprovals({ + approvalController, + deleteInterface, +}: { + approvalController: ApprovalController; + deleteInterface?: (id: string) => void; +}) { + const approvalRequestsById = approvalController.state.pendingApprovals; + const approvalRequests = Object.values(approvalRequestsById); + + for (const approvalRequest of approvalRequests) { + const { id, type } = approvalRequest; + const interfaceId = approvalRequest.requestData?.id as string; + + switch (type) { + case ApprovalType.SnapDialogAlert: + case ApprovalType.SnapDialogPrompt: + case DIALOG_APPROVAL_TYPES.default: + log('Rejecting snap dialog', { id, interfaceId }); + approvalController.accept(id, null); + deleteInterface?.(interfaceId); + break; + + case ApprovalType.SnapDialogConfirmation: + log('Rejecting snap confirmation', { id, interfaceId }); + approvalController.accept(id, false); + deleteInterface?.(interfaceId); + break; + + ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) + case SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.confirmAccountCreation: + case SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.confirmAccountRemoval: + case SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES.showSnapAccountRedirect: + log('Rejecting snap account confirmation', { id }); + approvalController.accept(id, false); + break; + ///: END:ONLY_INCLUDE_IF + + default: + log('Rejecting pending approval', { id }); + approvalController.reject(id, providerErrors.userRejectedRequest()); + break; + } + } +} diff --git a/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js b/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js index 1949ca7f876e..98bb790cfa32 100644 --- a/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js +++ b/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js @@ -36,20 +36,16 @@ const expectedMetametricsEventUndefinedProps = { }; const appStateController = { - store: { - getState: () => ({ - signatureSecurityAlertResponses: { - 1: { - result_type: BlockaidResultType.Malicious, - reason: BlockaidReason.maliciousDomain, - }, + state: { + signatureSecurityAlertResponses: { + 1: { + result_type: BlockaidResultType.Malicious, + reason: BlockaidReason.maliciousDomain, }, - }), + }, }, getSignatureSecurityAlertResponse: (id) => { - return appStateController.store.getState().signatureSecurityAlertResponses[ - id - ]; + return appStateController.state.signatureSecurityAlertResponses[id]; }, }; diff --git a/app/scripts/lib/manifestFlags.ts b/app/scripts/lib/manifestFlags.ts index 5804c7391973..574099d0cb94 100644 --- a/app/scripts/lib/manifestFlags.ts +++ b/app/scripts/lib/manifestFlags.ts @@ -1,17 +1,63 @@ import browser from 'webextension-polyfill'; +/** + * Flags that we use to control runtime behavior of the extension. Typically + * used for E2E tests. + * + * These flags are added to `manifest.json` for runtime querying. + */ export type ManifestFlags = { + /** + * CircleCI metadata for the current run + */ circleci?: { + /** + * Whether CircleCI manifest flags are enabled. + */ enabled: boolean; + /** + * The name of the branch that triggered the current run on CircleCI + */ branch?: string; + /** + * The current CircleCI build number + */ buildNum?: number; + /** + * The name of the CircleCI job currently running + */ job?: string; + /** + * For jobs with CircleCI parallelism enabled, this is the index of the current machine. + */ nodeIndex?: number; + /** + * The number of the pull request that triggered the current run + */ prNumber?: number; + /** + * The number of minutes to allow the E2E tests to run before timing out + */ + timeoutMinutes?: number; }; + /** + * Sentry flags + */ sentry?: { + /** + * Override the performance trace sample rate + */ tracesSampleRate?: number; - lazyLoadSubSampleRate?: number; // multiply by tracesSampleRate to get the actual probability + /** + * Sub-sample rate for lazy-loaded components. + * + * Multiply this rate by tracesSampleRate to get the actual probability of sampling the load + * time of a lazy-loaded component. + */ + lazyLoadSubSampleRate?: number; + /** + * Force enable Sentry (this is typically set by individual E2E tests in spec files) + */ forceEnable?: boolean; }; }; diff --git a/app/scripts/lib/ppom/ppom-util.test.ts b/app/scripts/lib/ppom/ppom-util.test.ts index 8acb6dd9788c..d3ff3015ca41 100644 --- a/app/scripts/lib/ppom/ppom-util.test.ts +++ b/app/scripts/lib/ppom/ppom-util.test.ts @@ -198,6 +198,7 @@ describe('PPOM Utils', () => { result_type: BlockaidResultType.Errored, reason: BlockaidReason.errored, description: 'Test Error: Test error message', + source: SecurityAlertSource.Local, }, ); }); @@ -219,6 +220,7 @@ describe('PPOM Utils', () => { result_type: BlockaidResultType.Errored, reason: BlockaidReason.errored, description: 'Test Error: Test error message', + source: SecurityAlertSource.Local, }, ); }); diff --git a/app/scripts/lib/ppom/ppom-util.ts b/app/scripts/lib/ppom/ppom-util.ts index d27ec6c8e505..7dbf8c92ec5f 100644 --- a/app/scripts/lib/ppom/ppom-util.ts +++ b/app/scripts/lib/ppom/ppom-util.ts @@ -132,6 +132,7 @@ export async function updateSecurityAlertResponse({ export function handlePPOMError( error: unknown, logMessage: string, + source: SecurityAlertSource = SecurityAlertSource.API, ): SecurityAlertResponse { const errorData = getErrorData(error); const description = getErrorMessage(error); @@ -142,6 +143,7 @@ export function handlePPOMError( return { ...SECURITY_ALERT_RESPONSE_ERROR, description, + source, }; } @@ -236,15 +238,23 @@ async function validateWithController( request: SecurityAlertsAPIRequest | JsonRpcRequest, chainId: string, ): Promise { - const response = (await ppomController.usePPOM( - (ppom: PPOM) => ppom.validateJsonRpc(request), - chainId, - )) as SecurityAlertResponse; + try { + const response = (await ppomController.usePPOM( + (ppom: PPOM) => ppom.validateJsonRpc(request), + chainId, + )) as SecurityAlertResponse; - return { - ...response, - source: SecurityAlertSource.Local, - }; + return { + ...response, + source: SecurityAlertSource.Local, + }; + } catch (error: unknown) { + return handlePPOMError( + error, + `Error validating request with PPOM controller`, + SecurityAlertSource.Local, + ); + } } async function validateWithAPI( diff --git a/app/scripts/lib/setupSentry.js b/app/scripts/lib/setupSentry.js index 72c246826ab5..76d66eba88d2 100644 --- a/app/scripts/lib/setupSentry.js +++ b/app/scripts/lib/setupSentry.js @@ -127,9 +127,9 @@ function getTracesSampleRate(sentryTarget) { } if (flags.circleci) { - // Report very frequently on develop branch, and never on other branches + // Report very frequently on main branch, and never on other branches // (Unless you use a `flags = {"sentry": {"tracesSampleRate": x.xx}}` override) - if (flags.circleci.branch === 'develop') { + if (flags.circleci.branch === 'main') { return 0.015; } return 0; diff --git a/app/scripts/lib/snap-keyring/snap-keyring.test.ts b/app/scripts/lib/snap-keyring/snap-keyring.test.ts index 4136fd1fd1fc..0e778b2268d7 100644 --- a/app/scripts/lib/snap-keyring/snap-keyring.test.ts +++ b/app/scripts/lib/snap-keyring/snap-keyring.test.ts @@ -1,5 +1,6 @@ import { ControllerMessenger } from '@metamask/base-controller'; -import { EthAccountType, InternalAccount } from '@metamask/keyring-api'; +import { EthAccountType } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES } from '../../../../shared/constants/app'; import { MetaMetricsEventCategory, diff --git a/app/scripts/lib/transaction/metrics.test.ts b/app/scripts/lib/transaction/metrics.test.ts index 7dcedd4e467e..8e2924a0e30f 100644 --- a/app/scripts/lib/transaction/metrics.test.ts +++ b/app/scripts/lib/transaction/metrics.test.ts @@ -18,6 +18,7 @@ import { MetaMetricsTransactionEventSource, MetaMetricsEventCategory, MetaMetricsEventUiCustomization, + MetaMetricsEventTransactionEstimateType, } from '../../../../shared/constants/metametrics'; import { TRANSACTION_ENVELOPE_TYPE_NAMES } from '../../../../shared/lib/transactions-controller-utils'; import { @@ -115,6 +116,7 @@ describe('Transaction metrics', () => { type: TransactionType.simpleSend, origin: ORIGIN_METAMASK, chainId: mockChainId, + networkClientId: 'testNetworkClientId', time: 1624408066355, defaultGasEstimates: { gas: '0x7b0d', @@ -160,9 +162,11 @@ describe('Transaction metrics', () => { ui_customizations: ['redesigned_confirmation'], transaction_advanced_view: undefined, transaction_contract_method: undefined, + transaction_internal_id: '1', }; expectedSensitiveProperties = { + default_estimate: MetaMetricsEventTransactionEstimateType.DefaultEstimate, default_gas: '0.000031501', default_gas_price: '2', first_seen: 1624408066355, diff --git a/app/scripts/lib/transaction/metrics.ts b/app/scripts/lib/transaction/metrics.ts index 375a8bd4a8ab..ee09d60259cd 100644 --- a/app/scripts/lib/transaction/metrics.ts +++ b/app/scripts/lib/transaction/metrics.ts @@ -9,12 +9,16 @@ import { TransactionType, } from '@metamask/transaction-controller'; import { ORIGIN_METAMASK } from '../../../../shared/constants/app'; -import { GasRecommendations } from '../../../../shared/constants/gas'; +import { + GasRecommendations, + PriorityLevels, +} from '../../../../shared/constants/gas'; import { MetaMetricsEventCategory, MetaMetricsEventFragment, MetaMetricsEventName, MetaMetricsEventUiCustomization, + MetaMetricsEventTransactionEstimateType, MetaMetricsPageObject, MetaMetricsReferrerObject, } from '../../../../shared/constants/metametrics'; @@ -792,10 +796,15 @@ async function buildEventFragmentProperties({ finalApprovalAmount, securityProviderResponse, simulationFails, + id, + userFeeLevel, } = transactionMeta; const query = new EthQuery(transactionMetricsRequest.provider); const source = referrer === ORIGIN_METAMASK ? 'user' : 'dapp'; + const gasFeeSelected = + userFeeLevel === 'dappSuggested' ? 'dapp_proposed' : userFeeLevel; + const { assetType, tokenStandard } = await determineTransactionAssetType( transactionMeta, query, @@ -819,12 +828,18 @@ async function buildEventFragmentProperties({ gasParams.max_priority_fee_per_gas = maxPriorityFeePerGas; } else { gasParams.gas_price = gasPrice; + gasParams.default_estimate = + MetaMetricsEventTransactionEstimateType.DefaultEstimate; } if (defaultGasEstimates) { const { estimateType } = defaultGasEstimates; if (estimateType) { - gasParams.default_estimate = estimateType; + gasParams.default_estimate = + estimateType === PriorityLevels.dAppSuggested + ? MetaMetricsEventTransactionEstimateType.DappProposed + : estimateType; + let defaultMaxFeePerGas = transactionMeta.defaultGasEstimates?.maxFeePerGas; let defaultMaxPriorityFeePerGas = @@ -906,6 +921,7 @@ async function buildEventFragmentProperties({ let transactionApprovalAmountVsBalanceRatio; let transactionContractAddress; let transactionType = TransactionType.simpleSend; + let transactionContractMethod4Byte; if (type === TransactionType.swapAndSend) { transactionType = TransactionType.swapAndSend; } else if (type === TransactionType.cancel) { @@ -918,6 +934,10 @@ async function buildEventFragmentProperties({ transactionType = TransactionType.contractInteraction; transactionContractMethod = contractMethodName; transactionContractAddress = transactionMeta.txParams?.to; + transactionContractMethod4Byte = transactionMeta.txParams?.data?.slice( + 0, + 10, + ); if ( transactionContractMethod === contractMethodNames.APPROVE && tokenStandard === TokenStandard.ERC20 @@ -1038,6 +1058,8 @@ async function buildEventFragmentProperties({ token_standard: tokenStandard, transaction_type: transactionType, transaction_speed_up: type === TransactionType.retry, + transaction_internal_id: id, + gas_fee_selected: gasFeeSelected, ...blockaidProperties, // ui_customizations must come after ...blockaidProperties ui_customizations: uiCustomizations.length > 0 ? uiCustomizations : null, @@ -1071,6 +1093,7 @@ async function buildEventFragmentProperties({ gas_limit: gasLimit, transaction_replaced: transactionReplaced, transaction_contract_address: transactionContractAddress, + transaction_contract_method_4byte: transactionContractMethod4Byte, ...extraParams, ...gasParamsInGwei, // TODO: Replace `any` with type diff --git a/app/scripts/lib/transaction/smart-transactions-mocks.ts b/app/scripts/lib/transaction/smart-transactions-mocks.ts new file mode 100644 index 000000000000..4d819aa1b7c5 --- /dev/null +++ b/app/scripts/lib/transaction/smart-transactions-mocks.ts @@ -0,0 +1,35 @@ +/** + * Mock for waitForTransactionHash. Simply replace the waitForTransactionHash + * with this mock so that we can debug locally without spending gas on mainnet. + * + * @returns Promise + */ +export const mockWaitForTransactionHash: () => Promise = () => { + return new Promise((resolve) => { + setTimeout(() => { + // Need a real tx hash to pass some downstream validation + resolve( + '0xe3e223b9725765a7de557effdb2b507ace3534bcff2c1fe3a857e0791e56a518', + ); + }, 20_000_000); + }); +}; + +/** + * Mock for signAndSubmitTransactions. Simply replace the signAndSubmitTransactions + * with this mock so that we can debug locally without spending gas on mainnet. + * + * @returns Promise<{ uuid: string; txHash?: string }> + */ +export const mockSignAndSubmitTransactions: () => Promise<{ + uuid: string; + txHash?: string; +}> = () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + uuid: 'uuid123456789', + }); + }, 100); + }); +}; diff --git a/app/scripts/lib/transaction/smart-transactions.test.ts b/app/scripts/lib/transaction/smart-transactions.test.ts index 1cf266c3e141..25bb409dffa1 100644 --- a/app/scripts/lib/transaction/smart-transactions.test.ts +++ b/app/scripts/lib/transaction/smart-transactions.test.ts @@ -150,6 +150,7 @@ function withRequest( }, type: TransactionType.simpleSend, chainId: CHAIN_IDS.MAINNET, + networkClientId: 'testNetworkClientId', time: 1624408066355, defaultGasEstimates: { gas: '0x7b0d', diff --git a/app/scripts/lib/transaction/smart-transactions.ts b/app/scripts/lib/transaction/smart-transactions.ts index c80cd8373d2a..6f9acac1ce74 100644 --- a/app/scripts/lib/transaction/smart-transactions.ts +++ b/app/scripts/lib/transaction/smart-transactions.ts @@ -101,6 +101,8 @@ class SmartTransactionHook { #txParams: TransactionParams; + #shouldShowStatusPage: boolean; + constructor(request: SubmitSmartTransactionRequest) { const { transactionMeta, @@ -123,14 +125,18 @@ class SmartTransactionHook { this.#isDapp = transactionMeta.origin !== ORIGIN_METAMASK; this.#chainId = transactionMeta.chainId; this.#txParams = transactionMeta.txParams; + this.#shouldShowStatusPage = + transactionMeta.type !== TransactionType.bridge; } async submit() { const isUnsupportedTransactionTypeForSmartTransaction = this .#transactionMeta?.type - ? [TransactionType.swapAndSend, TransactionType.swapApproval].includes( - this.#transactionMeta.type, - ) + ? [ + TransactionType.swapAndSend, + TransactionType.swapApproval, + TransactionType.bridgeApproval, + ].includes(this.#transactionMeta.type) : false; // Will cause TransactionController to publish to the RPC provider as normal. @@ -141,10 +147,13 @@ class SmartTransactionHook { ) { return useRegularTransactionSubmit; } - const { id: approvalFlowId } = await this.#controllerMessenger.call( - 'ApprovalController:startFlow', - ); - this.#approvalFlowId = approvalFlowId; + + if (this.#shouldShowStatusPage) { + const { id: approvalFlowId } = await this.#controllerMessenger.call( + 'ApprovalController:startFlow', + ); + this.#approvalFlowId = approvalFlowId; + } let getFeesResponse; try { getFeesResponse = await this.#smartTransactionsController.getFees( @@ -169,12 +178,15 @@ class SmartTransactionHook { } const extensionReturnTxHashAsap = this.#featureFlags?.smartTransactions?.extensionReturnTxHashAsap; - this.#addApprovalRequest({ - uuid, - }); - this.#addListenerToUpdateStatusPage({ - uuid, - }); + + if (this.#shouldShowStatusPage) { + this.#addApprovalRequest({ + uuid, + }); + this.#addListenerToUpdateStatusPage({ + uuid, + }); + } let transactionHash: string | undefined | null; if (extensionReturnTxHashAsap && submitTransactionResponse?.txHash) { transactionHash = submitTransactionResponse.txHash; @@ -197,7 +209,7 @@ class SmartTransactionHook { } #onApproveOrReject() { - if (this.#approvalFlowEnded) { + if (!this.#shouldShowStatusPage || this.#approvalFlowEnded) { return; } this.#approvalFlowEnded = true; diff --git a/app/scripts/lib/transaction/util.test.ts b/app/scripts/lib/transaction/util.test.ts index fbbee025381b..0a941968d802 100644 --- a/app/scripts/lib/transaction/util.test.ts +++ b/app/scripts/lib/transaction/util.test.ts @@ -1,4 +1,4 @@ -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { TransactionParams } from '@metamask/eth-json-rpc-middleware'; import { TransactionController, @@ -50,6 +50,7 @@ const TRANSACTION_PARAMS_MOCK: TransactionParams = { const TRANSACTION_OPTIONS_MOCK: AddTransactionOptions = { actionId: 'mockActionId', + networkClientId: 'mockNetworkClientId', origin: 'mockOrigin', requireApproval: false, type: TransactionType.simpleSend, @@ -151,23 +152,6 @@ describe('Transaction Utils', () => { }); }); - it('adds transaction with networkClientId if process.env.TRANSACTION_MULTICHAIN is set', async () => { - process.env.TRANSACTION_MULTICHAIN = '1'; - - await addTransaction(request); - - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledTimes(1); - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledWith(TRANSACTION_PARAMS_MOCK, { - ...TRANSACTION_OPTIONS_MOCK, - networkClientId: 'mockNetworkClientId', - }); - process.env.TRANSACTION_MULTICHAIN = ''; - }); - it('returns transaction meta', async () => { const transactionMeta = await addTransaction(request); expect(transactionMeta).toStrictEqual(TRANSACTION_META_MOCK); @@ -541,27 +525,6 @@ describe('Transaction Utils', () => { }); }); - it('adds transaction with networkClientId if process.env.TRANSACTION_MULTICHAIN is set', async () => { - process.env.TRANSACTION_MULTICHAIN = '1'; - - await addDappTransaction(dappRequest); - - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledTimes(1); - expect( - request.transactionController.addTransaction, - ).toHaveBeenCalledWith(TRANSACTION_PARAMS_MOCK, { - ...TRANSACTION_OPTIONS_MOCK, - networkClientId: 'mockNetworkClientId', - method: DAPP_REQUEST_MOCK.method, - requireApproval: true, - securityAlertResponse: DAPP_REQUEST_MOCK.securityAlertResponse, - type: undefined, - }); - process.env.TRANSACTION_MULTICHAIN = ''; - }); - it('returns transaction hash', async () => { const transactionHash = await addDappTransaction(dappRequest); expect(transactionHash).toStrictEqual(TRANSACTION_META_MOCK.hash); diff --git a/app/scripts/lib/transaction/util.ts b/app/scripts/lib/transaction/util.ts index 0bbf93afd8a8..a3d0b929aff8 100644 --- a/app/scripts/lib/transaction/util.ts +++ b/app/scripts/lib/transaction/util.ts @@ -1,4 +1,5 @@ -import { EthAccountType, InternalAccount } from '@metamask/keyring-api'; +import { EthAccountType } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { TransactionController, TransactionMeta, @@ -46,7 +47,7 @@ type BaseAddTransactionRequest = { }; type FinalAddTransactionRequest = BaseAddTransactionRequest & { - transactionOptions: AddTransactionOptions; + transactionOptions: Partial; }; export type AddTransactionRequest = FinalAddTransactionRequest & { @@ -66,7 +67,7 @@ export async function addDappTransaction( const { id: actionId, method, origin } = dappRequest; const { securityAlertResponse, traceContext } = dappRequest; - const transactionOptions: AddTransactionOptions = { + const transactionOptions: Partial = { actionId, method, origin, @@ -143,10 +144,11 @@ async function addTransactionWithController( transactionParams, networkClientId, } = request; + const { result, transactionMeta } = await transactionController.addTransaction(transactionParams, { ...transactionOptions, - ...(process.env.TRANSACTION_MULTICHAIN ? { networkClientId } : {}), + networkClientId, }); return { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index d60d937e1c3c..8ab78f2c7e92 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -47,7 +47,7 @@ import { rawChainData } from 'eth-chainlist'; import { MetaMaskKeyring as QRHardwareKeyring } from '@keystonehq/metamask-airgapped-keyring'; import EthQuery from '@metamask/eth-query'; import EthJSQuery from '@metamask/ethjs-query'; -import nanoid from 'nanoid'; +import { nanoid } from 'nanoid'; import { captureException } from '@sentry/browser'; import { AddressBookController } from '@metamask/address-book-controller'; import { @@ -104,6 +104,13 @@ import { } from '@metamask/controller-utils'; import { AccountsController } from '@metamask/accounts-controller'; +import { + RemoteFeatureFlagController, + ClientConfigApiService, + ClientType, + DistributionType, + EnvironmentType, +} from '@metamask/remote-feature-flag-controller'; ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) import { @@ -236,14 +243,12 @@ import { TOKEN_TRANSFER_LOG_TOPIC_HASH, TRANSFER_SINFLE_LOG_TOPIC_HASH, } from '../../shared/lib/transactions-controller-utils'; -import { - getCurrentChainId, - getProviderConfig, -} from '../../shared/modules/selectors/networks'; +import { getProviderConfig } from '../../shared/modules/selectors/networks'; import { endTrace, trace } from '../../shared/lib/trace'; // eslint-disable-next-line import/no-restricted-paths import { isSnapId } from '../../ui/helpers/utils/snaps'; import { BridgeStatusAction } from '../../shared/types/bridge-status'; +import { ENVIRONMENT } from '../../development/build/constants'; import fetchWithCache from '../../shared/lib/fetch-with-cache'; import { BalancesController as MultichainBalancesController } from './lib/accounts/BalancesController'; import { @@ -375,6 +380,7 @@ import { PatchStore } from './lib/PatchStore'; import { sanitizeUIState } from './lib/state-utils'; import BridgeStatusController from './controllers/bridge-status/bridge-status-controller'; import { BRIDGE_STATUS_CONTROLLER_NAME } from './controllers/bridge-status/constants'; +import { rejectAllApprovals } from './lib/approval/utils'; const { TRIGGER_TYPES } = NotificationServicesController.Constants; export const METAMASK_CONTROLLER_EVENTS = { @@ -383,6 +389,7 @@ export const METAMASK_CONTROLLER_EVENTS = { UPDATE_BADGE: 'updateBadge', // TODO: Add this and similar enums to the `controllers` repo and export them APPROVAL_STATE_CHANGE: 'ApprovalController:stateChange', + APP_STATE_UNLOCK_CHANGE: 'AppStateController:unlockChange', QUEUED_REQUEST_STATE_CHANGE: 'QueuedRequestController:stateChange', METAMASK_NOTIFICATIONS_LIST_UPDATED: 'NotificationServicesController:notificationsListUpdated', @@ -396,6 +403,17 @@ const PHISHING_SAFELIST = 'metamask-phishing-safelist'; // OneKey devices can connect to Metamask using Trezor USB transport. They use a specific device minor version (99) to differentiate between genuine Trezor and OneKey devices. export const ONE_KEY_VIA_TREZOR_MINOR_VERSION = 99; +const environmentMappingForRemoteFeatureFlag = { + [ENVIRONMENT.DEVELOPMENT]: EnvironmentType.Development, + [ENVIRONMENT.RELEASE_CANDIDATE]: EnvironmentType.ReleaseCandidate, + [ENVIRONMENT.PRODUCTION]: EnvironmentType.Production, +}; + +const buildTypeMappingForRemoteFeatureFlag = { + flask: DistributionType.Flask, + main: DistributionType.Main, +}; + export default class MetamaskController extends EventEmitter { /** * @param {object} opts @@ -652,7 +670,9 @@ export default class MetamaskController extends EventEmitter { }); this.tokenListController = new TokenListController({ - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId({ + metamask: this.networkController.state, + }), preventPollingOnNetworkRestart: !this.#isTokenListPollingRequired( this.preferencesController.state, ), @@ -676,7 +696,7 @@ export default class MetamaskController extends EventEmitter { }); this.assetsContractController = new AssetsContractController({ messenger: assetsContractControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), }); const tokensControllerMessenger = this.controllerMessenger.getRestricted({ @@ -699,7 +719,7 @@ export default class MetamaskController extends EventEmitter { state: initState.TokensController, provider: this.provider, messenger: tokensControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), }); const nftControllerMessenger = this.controllerMessenger.getRestricted({ @@ -725,7 +745,7 @@ export default class MetamaskController extends EventEmitter { this.nftController = new NftController({ state: initState.NftController, messenger: nftControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), onNftAdded: ({ address, symbol, tokenId, standard, source }) => this.metaMetricsController.trackEvent({ event: MetaMetricsEventName.NftAdded, @@ -760,7 +780,7 @@ export default class MetamaskController extends EventEmitter { this.nftDetectionController = new NftDetectionController({ messenger: nftDetectionControllerMessenger, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), getOpenSeaApiKey: () => this.nftController.openSeaApiKey, getBalancesInSingleCall: this.assetsContractController.getBalancesInSingleCall.bind( @@ -849,19 +869,16 @@ export default class MetamaskController extends EventEmitter { legacyAPIEndpoint: `${gasApiBaseUrl}/networks//gasPrices`, EIP1559APIEndpoint: `${gasApiBaseUrl}/networks//suggestedGasFees`, getCurrentNetworkLegacyGasAPICompatibility: () => { - const chainId = getCurrentChainId({ - metamask: this.networkController.state, - }); + const chainId = this.#getGlobalChainId(); return chainId === CHAIN_IDS.BSC; }, - getChainId: () => - getCurrentChainId({ metamask: this.networkController.state }), + getChainId: () => this.#getGlobalChainId(), }); this.appStateController = new AppStateController({ addUnlockListener: this.on.bind(this, 'unlock'), isUnlocked: this.isUnlocked.bind(this), - initState: initState.AppStateController, + state: initState.AppStateController, onInactiveTimeout: () => this.setLocked(), messenger: this.controllerMessenger.getRestricted({ name: 'AppStateController', @@ -950,7 +967,7 @@ export default class MetamaskController extends EventEmitter { ppomInit: () => PPOMModule.default(process.env.PPOM_URI), }, state: initState.PPOMController, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), securityAlertsEnabled: this.preferencesController.state.securityAlertsEnabled, onPreferencesChange: preferencesMessenger.subscribe.bind( @@ -1465,12 +1482,19 @@ export default class MetamaskController extends EventEmitter { }, showInAppNotification: { method: (origin, args) => { - const { message } = args; + const { message, title, footerLink, interfaceId } = args; + + const detailedView = { + title, + ...(footerLink ? { footerLink } : {}), + interfaceId, + }; const notification = { data: { message, origin, + ...(interfaceId ? { detailedView } : {}), }, type: TRIGGER_TYPES.SNAP, readDate: null, @@ -1639,16 +1663,54 @@ export default class MetamaskController extends EventEmitter { 'NotificationServicesController:selectIsNotificationServicesEnabled', 'AccountsController:listAccounts', 'AccountsController:updateAccountMetadata', + 'NetworkController:getState', + 'NetworkController:addNetwork', + 'NetworkController:removeNetwork', + 'NetworkController:updateNetwork', ], allowedEvents: [ 'KeyringController:lock', 'KeyringController:unlock', 'AccountsController:accountAdded', 'AccountsController:accountRenamed', + 'NetworkController:networkRemoved', ], }), }); + this.controllerMessenger.subscribe( + 'MetaMetricsController:stateChange', + previousValueComparator(async (prevState, currState) => { + const { participateInMetaMetrics: prevParticipateInMetaMetrics } = + prevState; + const { participateInMetaMetrics: currParticipateInMetaMetrics } = + currState; + + const metaMetricsWasDisabled = + prevParticipateInMetaMetrics && !currParticipateInMetaMetrics; + const metaMetricsWasEnabled = + !prevParticipateInMetaMetrics && currParticipateInMetaMetrics; + + if (!metaMetricsWasDisabled && !metaMetricsWasEnabled) { + return; + } + + const shouldPerformSignIn = + metaMetricsWasEnabled && + !this.authenticationController.state.isSignedIn; + const shouldPerformSignOut = + metaMetricsWasDisabled && + this.authenticationController.state.isSignedIn && + !this.userStorageController.state.isProfileSyncingEnabled; + + if (shouldPerformSignIn) { + await this.authenticationController.performSignIn(); + } else if (shouldPerformSignOut) { + await this.authenticationController.performSignOut(); + } + }, this.metaMetricsController.state), + ); + const notificationServicesPushControllerMessenger = this.controllerMessenger.getRestricted({ name: 'NotificationServicesPushController', @@ -1916,8 +1978,8 @@ export default class MetamaskController extends EventEmitter { ], allowedEvents: [`NetworkController:stateChange`], }); + this.txController = new TransactionController({ - blockTracker: this.blockTracker, getCurrentNetworkEIP1559Compatibility: this.networkController.getEIP1559Compatibility.bind( this.networkController, @@ -1935,10 +1997,10 @@ export default class MetamaskController extends EventEmitter { ), getNetworkState: () => this.networkController.state, getPermittedAccounts: this.getPermittedAccounts.bind(this), - getSavedGasFees: () => - this.preferencesController.state.advancedGasFee[ - getCurrentChainId({ metamask: this.networkController.state }) - ], + getSavedGasFees: () => { + const globalChainId = this.#getGlobalChainId(); + return this.preferencesController.state.advancedGasFee[globalChainId]; + }, incomingTransactions: { etherscanApiKeysByChainId: { [CHAIN_IDS.MAINNET]: process.env.ETHERSCAN_API_KEY, @@ -1946,26 +2008,17 @@ export default class MetamaskController extends EventEmitter { }, includeTokenTransfers: false, isEnabled: () => - Boolean( - this.preferencesController.state.incomingTransactionsPreferences?.[ - getCurrentChainId({ metamask: this.networkController.state }) - ] && this.onboardingController.state.completedOnboarding, - ), + this.preferencesController.state.incomingTransactionsPreferences?.[ + this.#getGlobalChainId() + ] && this.onboardingController.state.completedOnboarding, queryEntireHistory: false, updateTransactions: false, }, isFirstTimeInteractionEnabled: () => this.preferencesController.state.securityAlertsEnabled, - isMultichainEnabled: process.env.TRANSACTION_MULTICHAIN, isSimulationEnabled: () => this.preferencesController.state.useTransactionSimulations, messenger: transactionControllerMessenger, - onNetworkStateChange: (listener) => { - networkControllerMessenger.subscribe( - 'NetworkController:networkDidChange', - () => listener(), - ); - }, pendingTransactions: { isResubmitEnabled: () => { const state = this._getMetaMaskState(); @@ -1975,7 +2028,6 @@ export default class MetamaskController extends EventEmitter { ); }, }, - provider: this.provider, testGasFeeFlows: process.env.TEST_GAS_FEE_FLOWS, trace, hooks: { @@ -2155,12 +2207,12 @@ export default class MetamaskController extends EventEmitter { this.swapsController = new SwapsController( { messenger: swapsControllerMessenger, - // TODO: Remove once TransactionController exports this action type getBufferedGasLimit: async (txMeta, multiplier) => { const { gas: gasLimit, simulationFails } = await this.txController.estimateGasBuffered( txMeta.txParams, multiplier, + this.#getGlobalNetworkClientId(), ); return { gasLimit, simulationFails }; @@ -2206,6 +2258,7 @@ export default class MetamaskController extends EventEmitter { 'NetworkController:getNetworkClientById', 'NetworkController:findNetworkClientIdByChainId', 'NetworkController:getState', + 'TransactionController:getState', ], allowedEvents: [], }); @@ -2223,7 +2276,11 @@ export default class MetamaskController extends EventEmitter { this.smartTransactionsController = new SmartTransactionsController({ supportedChainIds: getAllowedSmartTransactionsChainIds(), clientId: ClientId.Extension, - getNonceLock: this.txController.getNonceLock.bind(this.txController), + getNonceLock: (address) => + this.txController.getNonceLock( + address, + this.#getGlobalNetworkClientId(), + ), confirmExternalTransaction: this.txController.confirmExternalTransaction.bind(this.txController), trackMetaMetricsEvent: this.metaMetricsController.trackEvent.bind( @@ -2352,6 +2409,40 @@ export default class MetamaskController extends EventEmitter { clearPendingConfirmations.bind(this), ); + // RemoteFeatureFlagController has subscription for preferences changes + this.controllerMessenger.subscribe( + 'PreferencesController:stateChange', + previousValueComparator((prevState, currState) => { + const { useExternalServices: prevUseExternalServices } = prevState; + const { useExternalServices: currUseExternalServices } = currState; + if (currUseExternalServices && !prevUseExternalServices) { + this.remoteFeatureFlagController.enable(); + this.remoteFeatureFlagController.updateRemoteFeatureFlags(); + } else if (!currUseExternalServices && prevUseExternalServices) { + this.remoteFeatureFlagController.disable(); + } + }, this.preferencesController.state), + ); + + // Initialize RemoteFeatureFlagController + this.remoteFeatureFlagController = new RemoteFeatureFlagController({ + messenger: this.controllerMessenger.getRestricted({ + name: 'RemoteFeatureFlagController', + allowedActions: [], + allowedEvents: [], + }), + disabled: !this.preferencesController.state.useExternalServices, + clientConfigApiService: new ClientConfigApiService({ + fetch: globalThis.fetch.bind(globalThis), + config: { + client: ClientType.Extension, + distribution: + this._getConfigForRemoteFeatureFlagRequest().distribution, + environment: this._getConfigForRemoteFeatureFlagRequest().environment, + }, + }), + }); + this.metamaskMiddleware = createMetamaskMiddleware({ static: { eth_syncing: false, @@ -2469,7 +2560,7 @@ export default class MetamaskController extends EventEmitter { this.store.updateStructure({ AccountsController: this.accountsController, - AppStateController: this.appStateController.store, + AppStateController: this.appStateController, AppMetadataController: this.appMetadataController, MultichainBalancesController: this.multichainBalancesController, TransactionController: this.txController, @@ -2518,13 +2609,14 @@ export default class MetamaskController extends EventEmitter { NotificationServicesController: this.notificationServicesController, NotificationServicesPushController: this.notificationServicesPushController, + RemoteFeatureFlagController: this.remoteFeatureFlagController, ...resetOnRestartStore, }); this.memStore = new ComposableObservableStore({ config: { AccountsController: this.accountsController, - AppStateController: this.appStateController.store, + AppStateController: this.appStateController, AppMetadataController: this.appMetadataController, MultichainBalancesController: this.multichainBalancesController, NetworkController: this.networkController, @@ -2573,6 +2665,7 @@ export default class MetamaskController extends EventEmitter { QueuedRequestController: this.queuedRequestController, NotificationServicesPushController: this.notificationServicesPushController, + RemoteFeatureFlagController: this.remoteFeatureFlagController, ...resetOnRestartStore, }, controllerMessenger: this.controllerMessenger, @@ -2704,7 +2797,12 @@ export default class MetamaskController extends EventEmitter { } triggerNetworkrequests() { - this.txController.startIncomingTransactionPolling(); + this.txController.stopIncomingTransactionPolling(); + + this.txController.startIncomingTransactionPolling([ + this.#getGlobalChainId(), + ]); + this.tokenDetectionController.enable(); this.getInfuraFeatureFlags(); } @@ -2873,14 +2971,22 @@ export default class MetamaskController extends EventEmitter { origin, args.message, ), - showInAppNotification: (origin, args) => - this.controllerMessenger.call( + showInAppNotification: (origin, args) => { + const { message, title, footerLink } = args; + const notificationArgs = { + interfaceId: args.content, + message, + title, + footerLink, + }; + return this.controllerMessenger.call( 'RateLimitController:call', origin, 'showInAppNotification', origin, - args, - ), + notificationArgs, + ); + }, updateSnapState: this.controllerMessenger.call.bind( this.controllerMessenger, 'SnapController:updateSnapState', @@ -2916,6 +3022,8 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger, 'SnapInterfaceController:getInterface', ), + // We don't currently use special cryptography for the extension client. + getClientCryptography: () => ({}), ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) getSnapKeyring: this.getSnapKeyring.bind(this), ///: END:ONLY_INCLUDE_IF @@ -2942,13 +3050,16 @@ export default class MetamaskController extends EventEmitter { 'PreferencesController:stateChange', previousValueComparator(async (prevState, currState) => { const { currentLocale } = currState; - const chainId = getCurrentChainId({ - metamask: this.networkController.state, - }); + const chainId = this.#getGlobalChainId(); await updateCurrentLocale(currentLocale); + if (currState.incomingTransactionsPreferences?.[chainId]) { - this.txController.startIncomingTransactionPolling(); + this.txController.stopIncomingTransactionPolling(); + + this.txController.startIncomingTransactionPolling([ + this.#getGlobalChainId(), + ]); } else { this.txController.stopIncomingTransactionPolling(); } @@ -3018,7 +3129,15 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger.subscribe( 'NetworkController:networkDidChange', async () => { - await this.txController.updateIncomingTransactions(); + await this.txController.stopIncomingTransactionPolling(); + + await this.txController.updateIncomingTransactions([ + this.#getGlobalChainId(), + ]); + + await this.txController.startIncomingTransactionPolling([ + this.#getGlobalChainId(), + ]); }, ); @@ -3184,6 +3303,17 @@ export default class MetamaskController extends EventEmitter { ); this.multichainBalancesController.start(); this.multichainBalancesController.updateBalances(); + + this.controllerMessenger.subscribe( + 'CurrencyRateController:stateChange', + ({ currentCurrency }) => { + if ( + currentCurrency !== this.multichainRatesController.state.fiatCurrency + ) { + this.multichainRatesController.setFiatCurrency(currentCurrency); + } + }, + ); } /** @@ -3478,10 +3608,6 @@ export default class MetamaskController extends EventEmitter { markNotificationPopupAsAutomaticallyClosed: () => this.notificationManager.markAsAutomaticallyClosed(), - // approval - requestUserApproval: - approvalController.addAndShowApprovalRequest.bind(approvalController), - // primary keyring management addNewAccount: this.addNewAccount.bind(this), getSeedPhrase: this.getSeedPhrase.bind(this), @@ -3704,8 +3830,6 @@ export default class MetamaskController extends EventEmitter { appStateController.setShowNetworkBanner.bind(appStateController), updateNftDropDownState: appStateController.updateNftDropDownState.bind(appStateController), - setFirstTimeUsedNetwork: - appStateController.setFirstTimeUsedNetwork.bind(appStateController), setSwitchedNetworkDetails: appStateController.setSwitchedNetworkDetails.bind(appStateController), clearSwitchedNetworkDetails: @@ -3722,6 +3846,8 @@ export default class MetamaskController extends EventEmitter { appStateController.setLastInteractedConfirmationInfo.bind( appStateController, ), + updateSlides: appStateController.updateSlides.bind(appStateController), + removeSlide: appStateController.removeSlide.bind(appStateController), // EnsController tryReverseResolveAddress: @@ -4107,9 +4233,12 @@ export default class MetamaskController extends EventEmitter { ), trackInsightSnapView: this.trackInsightSnapView.bind(this), - // approval controller - resolvePendingApproval: this.resolvePendingApproval, + // ApprovalController + rejectAllPendingApprovals: this.rejectAllPendingApprovals.bind(this), rejectPendingApproval: this.rejectPendingApproval, + requestUserApproval: + approvalController.addAndShowApprovalRequest.bind(approvalController), + resolvePendingApproval: this.resolvePendingApproval, // Notifications resetViewedNotifications: announcementController.resetViewed.bind( @@ -4520,9 +4649,7 @@ export default class MetamaskController extends EventEmitter { async _addAccountsWithBalance() { try { // Scan accounts until we find an empty one - const chainId = getCurrentChainId({ - metamask: this.networkController.state, - }); + const chainId = this.#getGlobalChainId(); const ethQuery = new EthQuery(this.provider); const accounts = await this.keyringController.getAccounts(); let address = accounts[accounts.length - 1]; @@ -5051,15 +5178,24 @@ export default class MetamaskController extends EventEmitter { async resetAccount() { const selectedAddress = this.accountsController.getSelectedAccount().address; - this.txController.wipeTransactions(false, selectedAddress); + + const globalChainId = this.#getGlobalChainId(); + + this.txController.wipeTransactions({ + address: selectedAddress, + chainId: globalChainId, + }); + this.smartTransactionsController.wipeSmartTransactions({ address: selectedAddress, ignoreNetwork: false, }); + this.bridgeStatusController.wipeBridgeStatus({ address: selectedAddress, ignoreNetwork: false, }); + this.networkController.resetConnection(); return selectedAddress; @@ -5187,8 +5323,7 @@ export default class MetamaskController extends EventEmitter { internalAccounts: this.accountsController.listAccounts(), dappRequest, networkClientId: - dappRequest?.networkClientId ?? - this.networkController.state.selectedNetworkClientId, + dappRequest?.networkClientId ?? this.#getGlobalNetworkClientId(), selectedAccount: this.accountsController.getAccountByAddress( transactionParams.from, ), @@ -5196,7 +5331,7 @@ export default class MetamaskController extends EventEmitter { transactionOptions, transactionParams, userOperationController: this.userOperationController, - chainId: getCurrentChainId({ metamask: this.networkController.state }), + chainId: this.#getGlobalChainId(), ppomController: this.ppomController, securityAlertsEnabled: this.preferencesController.state?.securityAlertsEnabled, @@ -6546,13 +6681,13 @@ export default class MetamaskController extends EventEmitter { * Returns the nonce that will be associated with a transaction once approved * * @param {string} address - The hex string address for the transaction - * @param networkClientId - The optional networkClientId to get the nonce lock with + * @param networkClientId - The networkClientId to get the nonce lock with * @returns {Promise} */ async getPendingNonce(address, networkClientId) { const { nonceDetails, releaseLock } = await this.txController.getNonceLock( address, - process.env.TRANSACTION_MULTICHAIN ? networkClientId : undefined, + networkClientId, ); const pendingNonce = nonceDetails.params.highestSuggested; @@ -6565,13 +6700,13 @@ export default class MetamaskController extends EventEmitter { * Returns the next nonce according to the nonce-tracker * * @param {string} address - The hex string address for the transaction - * @param networkClientId - The optional networkClientId to get the nonce lock with + * @param networkClientId - The networkClientId to get the nonce lock with * @returns {Promise} */ async getNextNonce(address, networkClientId) { const nonceLock = await this.txController.getNonceLock( address, - process.env.TRANSACTION_MULTICHAIN ? networkClientId : undefined, + networkClientId, ); nonceLock.releaseLock(); return nonceLock.nextNonce; @@ -6846,7 +6981,7 @@ export default class MetamaskController extends EventEmitter { const appStatePollingTokenType = POLLING_TOKEN_ENVIRONMENT_TYPES[environmentType]; const pollingTokensToDisconnect = - this.appStateController.store.getState()[appStatePollingTokenType]; + this.appStateController.state[appStatePollingTokenType]; pollingTokensToDisconnect.forEach((pollingToken) => { this.gasFeeController.stopPollingByPollingToken(pollingToken); this.currencyRateController.stopPollingByPollingToken(pollingToken); @@ -6996,6 +7131,19 @@ export default class MetamaskController extends EventEmitter { } }; + rejectAllPendingApprovals() { + const deleteInterface = (id) => + this.controllerMessenger.call( + 'SnapInterfaceController:deleteInterface', + id, + ); + + rejectAllApprovals({ + approvalController: this.approvalController, + deleteInterface, + }); + } + async _onAccountChange(newAddress) { const permittedAccountsMap = getPermittedAccountsByOrigin( this.permissionController.state, @@ -7007,7 +7155,9 @@ export default class MetamaskController extends EventEmitter { } } - await this.txController.updateIncomingTransactions(); + await this.txController.updateIncomingTransactions([ + this.#getGlobalChainId(), + ]); } async _notifyAccountsChange(origin, newAccounts) { @@ -7359,6 +7509,17 @@ export default class MetamaskController extends EventEmitter { }; } + _getConfigForRemoteFeatureFlagRequest() { + const distribution = + buildTypeMappingForRemoteFeatureFlag[process.env.METAMASK_BUILD_TYPE] || + DistributionType.Main; + const environment = + environmentMappingForRemoteFeatureFlag[ + process.env.METAMASK_ENVIRONMENT + ] || EnvironmentType.Development; + return { distribution, environment }; + } + #checkTokenListPolling(currentState, previousState) { const previousEnabled = this.#isTokenListPollingRequired(previousState); const newEnabled = this.#isTokenListPollingRequired(currentState); @@ -7378,4 +7539,28 @@ export default class MetamaskController extends EventEmitter { return useTokenDetection || petnamesEnabled || useTransactionSimulations; } + + /** + * @deprecated Avoid new references to the global network. + * Will be removed once multi-chain support is fully implemented. + * @returns {string} The chain ID of the currently selected network. + */ + #getGlobalChainId() { + const globalNetworkClientId = this.#getGlobalNetworkClientId(); + + const globalNetworkClient = this.networkController.getNetworkClientById( + globalNetworkClientId, + ); + + return globalNetworkClient.configuration.chainId; + } + + /** + * @deprecated Avoid new references to the global network. + * Will be removed once multi-chain support is fully implemented. + * @returns {string} The network client ID of the currently selected network client. + */ + #getGlobalNetworkClientId() { + return this.networkController.state.selectedNetworkClientId; + } } diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index a596277154eb..47a9050232fd 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -21,7 +21,10 @@ import { } from '@metamask/keyring-api'; import { ControllerMessenger } from '@metamask/base-controller'; import { LoggingController, LogType } from '@metamask/logging-controller'; -import { TransactionController } from '@metamask/transaction-controller'; +import { + CHAIN_IDS, + TransactionController, +} from '@metamask/transaction-controller'; import { RatesController, TokenListController, @@ -39,6 +42,7 @@ import { flushPromises } from '../../test/lib/timer-helpers'; import { ETH_EOA_METHODS } from '../../shared/constants/eth-methods'; import { createMockInternalAccount } from '../../test/jest/mocks'; import { mockNetworkState } from '../../test/stub/networks'; +import { ENVIRONMENT } from '../../development/build/constants'; import { SECOND } from '../../shared/constants/time'; import { BalancesController as MultichainBalancesController, @@ -1206,7 +1210,10 @@ describe('MetaMaskController', () => { ).toHaveBeenCalledTimes(1); expect( metamaskController.txController.wipeTransactions, - ).toHaveBeenCalledWith(false, selectedAddressMock); + ).toHaveBeenCalledWith({ + address: selectedAddressMock, + chainId: CHAIN_IDS.MAINNET, + }); expect( metamaskController.smartTransactionsController.wipeSmartTransactions, ).toHaveBeenCalledWith({ @@ -2405,6 +2412,7 @@ describe('MetaMaskController', () => { methods: [BtcMethod.SendBitcoin], address: 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq', }; + const mockCurrency = 'CAD'; beforeEach(() => { jest.spyOn(metamaskController.multichainRatesController, 'start'); @@ -2502,6 +2510,43 @@ describe('MetaMaskController', () => { localMetamaskController.multichainRatesController.start, ).toHaveBeenCalled(); }); + + it('calls setFiatCurrency when the `currentCurrency` has changed', async () => { + jest.spyOn(RatesController.prototype, 'setFiatCurrency'); + const localMetamaskController = new MetaMaskController({ + showUserConfirmation: noop, + encryptor: mockEncryptor, + initState: { + ...cloneDeep(firstTimeState), + AccountsController: { + internalAccounts: { + accounts: { + [mockNonEvmAccount.id]: mockNonEvmAccount, + [mockEvmAccount.id]: mockEvmAccount, + }, + selectedAccount: mockNonEvmAccount.id, + }, + }, + }, + initLangCode: 'en_US', + platform: { + showTransactionNotification: () => undefined, + getVersion: () => 'foo', + }, + browser: browserPolyfillMock, + infuraProjectId: 'foo', + isFirstMetaMaskControllerSetup: true, + }); + + metamaskController.controllerMessenger.publish( + 'CurrencyRateController:stateChange', + { currentCurrency: mockCurrency }, + ); + + expect( + localMetamaskController.multichainRatesController.setFiatCurrency, + ).toHaveBeenCalledWith(mockCurrency); + }); }); describe('MultichainBalancesController', () => { @@ -2601,6 +2646,131 @@ describe('MetaMaskController', () => { ); }); }); + + describe('RemoteFeatureFlagController', () => { + let localMetamaskController; + + beforeEach(() => { + localMetamaskController = new MetaMaskController({ + showUserConfirmation: noop, + encryptor: mockEncryptor, + initState: { + ...cloneDeep(firstTimeState), + PreferencesController: { + useExternalServices: false, + }, + }, + initLangCode: 'en_US', + platform: { + showTransactionNotification: () => undefined, + getVersion: () => 'foo', + }, + browser: browserPolyfillMock, + infuraProjectId: 'foo', + isFirstMetaMaskControllerSetup: true, + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should initialize RemoteFeatureFlagController in disabled state when useExternalServices is false', async () => { + const { remoteFeatureFlagController, preferencesController } = + localMetamaskController; + + expect(preferencesController.state.useExternalServices).toBe(false); + expect(remoteFeatureFlagController.state).toStrictEqual({ + remoteFeatureFlags: {}, + cacheTimestamp: 0, + }); + }); + + it('should disable feature flag fetching when useExternalServices is disabled', async () => { + const { remoteFeatureFlagController } = localMetamaskController; + + // First enable external services + await simulatePreferencesChange({ + useExternalServices: true, + }); + + // Then disable them + await simulatePreferencesChange({ + useExternalServices: false, + }); + + expect(remoteFeatureFlagController.state).toStrictEqual({ + remoteFeatureFlags: {}, + cacheTimestamp: 0, + }); + }); + + it('should handle errors during feature flag updates', async () => { + const { remoteFeatureFlagController } = localMetamaskController; + const mockError = new Error('Failed to fetch'); + + jest + .spyOn(remoteFeatureFlagController, 'updateRemoteFeatureFlags') + .mockRejectedValue(mockError); + + await simulatePreferencesChange({ + useExternalServices: true, + }); + + expect(remoteFeatureFlagController.state).toStrictEqual({ + remoteFeatureFlags: {}, + cacheTimestamp: 0, + }); + }); + + it('should maintain feature flag state across preference toggles', async () => { + const { remoteFeatureFlagController } = localMetamaskController; + const mockFlags = { testFlag: true }; + + jest + .spyOn(remoteFeatureFlagController, 'updateRemoteFeatureFlags') + .mockResolvedValue(mockFlags); + + // Enable external services + await simulatePreferencesChange({ + useExternalServices: true, + }); + + // Disable external services + await simulatePreferencesChange({ + useExternalServices: false, + }); + + // Verify state is cleared + expect(remoteFeatureFlagController.state).toStrictEqual({ + remoteFeatureFlags: {}, + cacheTimestamp: 0, + }); + }); + }); + + describe('_getConfigForRemoteFeatureFlagRequest', () => { + it('returns config in mapping', async () => { + const result = + await metamaskController._getConfigForRemoteFeatureFlagRequest(); + expect(result).toStrictEqual({ + distribution: 'main', + environment: 'dev', + }); + }); + + it('returna config when not matching default mapping', async () => { + process.env.METAMASK_BUILD_TYPE = 'beta'; + process.env.METAMASK_ENVIRONMENT = ENVIRONMENT.RELEASE_CANDIDATE; + + const result = + await metamaskController._getConfigForRemoteFeatureFlagRequest(); + expect(result).toStrictEqual({ + distribution: 'main', + environment: 'rc', + }); + }); + }); }); describe('onFeatureFlagResponseReceived', () => { @@ -2708,4 +2878,144 @@ describe('MetaMaskController', () => { expect(browserPolyfillMock.storage.session.set).not.toHaveBeenCalled(); }); }); + + describe('MetaMetrics & authentication dependencies', () => { + let metamaskController; + let mockPerformSignIn; + let mockPerformSignOut; + + const arrangeControllerState = (stateOverrides) => { + metamaskController = new MetaMaskController({ + showUserConfirmation: noop, + encryptor: mockEncryptor, + initState: { ...cloneDeep(firstTimeState), ...stateOverrides }, + initLangCode: 'en_US', + platform: { + showTransactionNotification: () => undefined, + getVersion: () => 'foo', + }, + browser: browserPolyfillMock, + infuraProjectId: 'foo', + isFirstMetaMaskControllerSetup: true, + }); + + mockPerformSignIn = jest + .spyOn(metamaskController.authenticationController, 'performSignIn') + .mockResolvedValue(); + mockPerformSignOut = jest + .spyOn(metamaskController.authenticationController, 'performSignOut') + .mockResolvedValue(); + }; + + it('should sign in the user if MetaMetrics is enabled and the user is not signed in', async () => { + arrangeControllerState({ + MetaMetricsController: { + participateInMetaMetrics: false, + }, + AuthenticationController: { + isSignedIn: false, + }, + }); + + metamaskController.controllerMessenger.publish( + 'MetaMetricsController:stateChange', + { + participateInMetaMetrics: true, + }, + ); + + expect(mockPerformSignIn).toHaveBeenCalledTimes(1); + expect(mockPerformSignOut).not.toHaveBeenCalled(); + }); + + it('should sign out the user if MetaMetrics is disabled and the user is signed in but profile syncing is disabled', async () => { + arrangeControllerState({ + MetaMetricsController: { + participateInMetaMetrics: true, + }, + AuthenticationController: { + isSignedIn: true, + }, + UserStorageController: { + isProfileSyncingEnabled: false, + }, + }); + + metamaskController.controllerMessenger.publish( + 'MetaMetricsController:stateChange', + { + participateInMetaMetrics: false, + }, + ); + + expect(mockPerformSignIn).not.toHaveBeenCalled(); + expect(mockPerformSignOut).toHaveBeenCalledTimes(1); + }); + + it('should not sign in the user if MetaMetrics is enabled and the user is already signed in', async () => { + arrangeControllerState({ + MetaMetricsController: { + participateInMetaMetrics: false, + }, + AuthenticationController: { + isSignedIn: true, + }, + }); + + metamaskController.controllerMessenger.publish( + 'MetaMetricsController:stateChange', + { + participateInMetaMetrics: true, + }, + ); + + expect(mockPerformSignIn).not.toHaveBeenCalled(); + expect(mockPerformSignOut).not.toHaveBeenCalled(); + }); + + it('should not sign out the user if MetaMetrics is disabled and the user is not signed in', async () => { + arrangeControllerState({ + MetaMetricsController: { + participateInMetaMetrics: true, + }, + AuthenticationController: { + isSignedIn: false, + }, + }); + + metamaskController.controllerMessenger.publish( + 'MetaMetricsController:stateChange', + { + participateInMetaMetrics: false, + }, + ); + + expect(mockPerformSignIn).not.toHaveBeenCalled(); + expect(mockPerformSignOut).not.toHaveBeenCalled(); + }); + + it('should not sign out the user if MetaMetrics is disabled and profile syncing is enabled', async () => { + arrangeControllerState({ + MetaMetricsController: { + participateInMetaMetrics: true, + }, + AuthenticationController: { + isSignedIn: true, + }, + UserStorageController: { + isProfileSyncingEnabled: true, + }, + }); + + metamaskController.controllerMessenger.publish( + 'MetaMetricsController:stateChange', + { + participateInMetaMetrics: false, + }, + ); + + expect(mockPerformSignIn).not.toHaveBeenCalled(); + expect(mockPerformSignOut).not.toHaveBeenCalled(); + }); + }); }); diff --git a/app/scripts/migrations/105.test.ts b/app/scripts/migrations/105.test.ts index 168fe8dd0916..b7d5ac0303e6 100644 --- a/app/scripts/migrations/105.test.ts +++ b/app/scripts/migrations/105.test.ts @@ -1,6 +1,6 @@ import { v4 as uuid } from 'uuid'; import { sha256FromString } from 'ethereumjs-util'; -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { ETH_EOA_METHODS } from '../../../shared/constants/eth-methods'; import { migrate } from './105'; diff --git a/app/scripts/migrations/105.ts b/app/scripts/migrations/105.ts index a54b3e6457a7..5febcb0479f2 100644 --- a/app/scripts/migrations/105.ts +++ b/app/scripts/migrations/105.ts @@ -1,4 +1,5 @@ -import { EthAccountType, InternalAccount } from '@metamask/keyring-api'; +import { EthAccountType } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { sha256FromString } from 'ethereumjs-util'; import { v4 as uuid } from 'uuid'; import { cloneDeep } from 'lodash'; diff --git a/app/scripts/migrations/119.ts b/app/scripts/migrations/119.ts index 8cb0d2c04b97..606a9e38a31d 100644 --- a/app/scripts/migrations/119.ts +++ b/app/scripts/migrations/119.ts @@ -1,7 +1,7 @@ import { cloneDeep, isObject } from 'lodash'; import { hasProperty } from '@metamask/utils'; import { AccountsControllerState } from '@metamask/accounts-controller'; -import { InternalAccount } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; type VersionedData = { meta: { version: number }; diff --git a/app/scripts/migrations/134.test.ts b/app/scripts/migrations/134.test.ts new file mode 100644 index 000000000000..9b3d31db017f --- /dev/null +++ b/app/scripts/migrations/134.test.ts @@ -0,0 +1,62 @@ +import { cloneDeep } from 'lodash'; +import { migrate, version } from './134'; + +const oldVersion = 133; + +describe(`migration #${version}`, () => { + it('updates the version metadata', async () => { + const oldStorage = { + meta: { version: oldVersion }, + data: {}, + }; + + const newStorage = await migrate(oldStorage); + + expect(newStorage.meta).toStrictEqual({ version }); + }); + + it('Does nothing if `usedNetworks` is not in the `AppStateController` state', async () => { + const oldState = { + AppStateController: { + timeoutMinutes: 0, + }, + }; + + const transformedState = await migrate({ + meta: { version: oldVersion }, + data: cloneDeep(oldState), + }); + + expect(transformedState.data).toStrictEqual(oldState); + }); + + it('Removes `usedNetworks` from the `AppStateController` state', async () => { + const oldState: { + AppStateController: { + timeoutMinutes: number; + usedNetworks?: Record; + }; + } = { + AppStateController: { + timeoutMinutes: 0, + usedNetworks: { + '0x1': true, + '0x5': true, + '0x539': true, + }, + }, + }; + const expectedState = { + AppStateController: { + timeoutMinutes: 0, + }, + }; + + const transformedState = await migrate({ + meta: { version: oldVersion }, + data: cloneDeep(oldState), + }); + + expect(transformedState.data).toStrictEqual(expectedState); + }); +}); diff --git a/app/scripts/migrations/134.ts b/app/scripts/migrations/134.ts new file mode 100644 index 000000000000..e11b2abd9625 --- /dev/null +++ b/app/scripts/migrations/134.ts @@ -0,0 +1,41 @@ +import { hasProperty, isObject } from '@metamask/utils'; +import { cloneDeep } from 'lodash'; + +type VersionedData = { + meta: { version: number }; + data: Record; +}; + +export const version = 134; + +/** + * This migration removes `usedNetworks` from `AppStateController` state. + * + * @param originalVersionedData - Versioned MetaMask extension state, exactly what we persist to dist. + * @param originalVersionedData.meta - State metadata. + * @param originalVersionedData.meta.version - The current state version. + * @param originalVersionedData.data - The persisted MetaMask state, keyed by controller. + * @returns Updated versioned MetaMask extension state. + */ +export async function migrate( + originalVersionedData: VersionedData, +): Promise { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + transformState(versionedData.data); + return versionedData; +} + +function transformState( + state: Record, +): Record { + if ( + hasProperty(state, 'AppStateController') && + isObject(state.AppStateController) && + hasProperty(state.AppStateController, 'usedNetworks') + ) { + console.log('Removing usedNetworks from AppStateController'); + delete state.AppStateController.usedNetworks; + } + return state; +} diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index fbee63b7f7f2..6673d1e62d2f 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -156,6 +156,7 @@ const migrations = [ require('./132'), require('./133'), require('./133.1'), + require('./134'), ]; export default migrations; diff --git a/attribution.txt b/attribution.txt index aaeef31a2fbe..bcf9b961de51 100644 --- a/attribution.txt +++ b/attribution.txt @@ -50,61 +50,6 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -@adraffy/ens-normalize -1.10.1 -MIT License - -Copyright (c) 2021 Andrew Raffensperger - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -aes-js -3.0.0 -The MIT License (MIT) - -Copyright (c) 2015 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - ****************************** aes-js @@ -133,34 +78,6 @@ THE SOFTWARE. -****************************** - -aes-js -4.0.0-beta.5 -The MIT License (MIT) - -Copyright (c) 2022 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - ****************************** agent-base @@ -420,6 +337,21 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +ansi-regex +6.0.1 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ****************************** ansi-styles @@ -450,14 +382,54 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +ansi-styles +6.2.1 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +any-promise +1.3.0 +Copyright (C) 2014-2016 Kevin Beaty + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + ****************************** apg-js -4.4.0 +4.1.1 ## [2-Clause BSD License](https://opensource.org/licenses/BSD-2-Clause)

-Copyright (c) 2024 Lowell D. Thomas
+Copyright (c) 2021 Lowell D. Thomas
All rights reserved. Redistribution and use in source and binary forms, with or without @@ -487,7 +459,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** array-buffer-byte-length -1.0.1 +1.0.0 MIT License Copyright (c) 2023 Inspect JS @@ -562,6 +534,33 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +async-mutex +0.2.6 +The MIT License (MIT) + +Copyright (c) 2016 Christian Speckner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + ****************************** async-mutex @@ -619,7 +618,7 @@ THE SOFTWARE. ****************************** available-typed-arrays -1.0.7 +1.0.5 MIT License Copyright (c) 2020 Inspect JS @@ -673,26 +672,14 @@ SOFTWARE. ****************************** axios -0.28.1 -Copyright (c) 2014-present Matt Zabriskie +1.6.8 +# Copyright (c) 2014-present Matt Zabriskie & Collaborators -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @@ -719,7 +706,7 @@ PERFORMANCE OF THIS SOFTWARE. ****************************** @babel/code-frame -7.25.9 +7.10.4 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -746,8 +733,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/compat-data -7.25.9 +@babel/code-frame +7.24.2 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -774,8 +761,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/core -7.25.9 +@babel/compat-data +7.23.2 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -802,8 +789,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/generator -7.25.9 +@babel/core +7.23.2 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -830,8 +817,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-annotate-as-pure -7.25.9 +@babel/generator +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -858,8 +845,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-compilation-targets -7.25.9 +@babel/helper-annotate-as-pure +7.22.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -886,8 +873,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-create-class-features-plugin -7.25.9 +@babel/helper-compilation-targets +7.22.15 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -914,8 +901,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-member-expression-to-functions -7.25.9 +@babel/helper-create-class-features-plugin +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -942,8 +929,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-module-imports -7.25.9 +@babel/helper-environment-visitor +7.22.20 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -970,8 +957,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-module-transforms -7.25.9 +@babel/helper-function-name +7.23.0 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -998,8 +985,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-optimise-call-expression -7.25.9 +@babel/helper-hoist-variables +7.22.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1026,8 +1013,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-plugin-utils -7.25.9 +@babel/helper-member-expression-to-functions +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1054,8 +1041,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-replace-supers -7.25.9 +@babel/helper-module-imports +7.24.3 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1082,8 +1069,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helpers -7.25.9 +@babel/helper-module-transforms +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1110,8 +1097,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-simple-access -7.25.9 +@babel/helper-optimise-call-expression +7.22.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1138,8 +1125,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-skip-transparent-expression-wrappers -7.25.9 +@babel/helper-plugin-utils +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1166,8 +1153,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-string-parser -7.25.9 +@babel/helper-replace-supers +7.24.1 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1194,8 +1181,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-validator-identifier -7.25.9 +@babel/helpers +7.23.2 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1222,8 +1209,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/helper-validator-option -7.25.9 +@babel/helper-simple-access +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1250,8 +1237,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/highlight -7.25.9 +@babel/helper-skip-transparent-expression-wrappers +7.22.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1278,33 +1265,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/parser -7.25.9 -Copyright (C) 2012-2014 by various contributors (see AUTHORS) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@babel/plugin-syntax-jsx -7.25.9 +@babel/helper-split-export-declaration +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1331,8 +1293,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/plugin-syntax-typescript -7.25.9 +@babel/helper-string-parser +7.24.1 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1359,8 +1321,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/plugin-transform-modules-commonjs -7.25.9 +@babel/helper-validator-identifier +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1387,8 +1349,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/plugin-transform-typescript -7.25.9 +@babel/helper-validator-option +7.23.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1415,8 +1377,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/preset-typescript -7.25.9 +@babel/highlight +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1443,18 +1405,211 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@babel/runtime -7.25.9 -MIT License +@babel/parser +7.24.5 +Copyright (C) 2012-2014 by various contributors (see AUTHORS) -Copyright (c) 2014-present Sebastian McKenzie and other contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +@babel/plugin-syntax-jsx +7.24.1 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@babel/plugin-syntax-typescript +7.24.1 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@babel/plugin-transform-modules-commonjs +7.24.1 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@babel/plugin-transform-typescript +7.24.5 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@babel/preset-typescript +7.24.1 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@babel/runtime +7.24.0 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@babel/runtime +7.24.5 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be @@ -1472,7 +1627,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @babel/template -7.25.9 +7.22.15 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1500,7 +1655,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @babel/traverse -7.25.9 +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1528,7 +1683,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @babel/types -7.26.0 +7.24.5 MIT License Copyright (c) 2014-present Sebastian McKenzie and other contributors @@ -1635,33 +1790,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -base58-js -1.0.5 -MIT License - -Copyright (c) 2021 pur3miish - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** base64-js @@ -1689,34 +1817,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -base-x -3.0.10 -The MIT License (MIT) - -Copyright (c) 2018 base-x contributors -Copyright (c) 2014-2018 The Bitcoin Core developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** base-x @@ -2195,11 +2295,11 @@ SOFTWARE. ****************************** -bitcoin-address-validation -2.2.3 +bitcoin-ops +1.4.1 The MIT License (MIT) -Copyright (c) 2018 Rui Gomes +Copyright (c) 2016 Daniel Cousens Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -2222,11 +2322,11 @@ SOFTWARE. ****************************** -bitcoin-ops -1.4.1 -The MIT License (MIT) +bitwise +2.1.0 +# The MIT License (MIT) -Copyright (c) 2016 Daniel Cousens +Copyright (c) `2019` Florian Wendelborn Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -2249,37 +2349,10 @@ SOFTWARE. ****************************** -bitwise -2.1.0 -# The MIT License (MIT) - -Copyright (c) `2019` Florian Wendelborn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -blake-hash -2.0.0 -license: MIT -authors: Kirill Fomichev (https://github.com/fanatid) +blake-hash +2.0.0 +license: MIT +authors: Kirill Fomichev (https://github.com/fanatid) ****************************** @@ -2337,7 +2410,7 @@ SOFTWARE. ****************************** @blockaid/ppom_release -1.5.3 <> +1.4.6 <> Blockaid BSL License, Version 1.0 (EPL-1.0) Licensor: Blockaid, Inc. @@ -2690,6 +2763,37 @@ programs and associated documentation files created by the Original Author, when distributed with the Software. +****************************** + +bplist-creator +0.1.1 +(The MIT License) + +Copyright (c) 2012 Near Infinity Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +bplist-parser +0.3.2 +license: MIT +authors: Joe Ferner + ****************************** brace-expansion @@ -2717,6 +2821,33 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +brace-expansion +2.0.1 +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** brorand @@ -2830,7 +2961,7 @@ IN THE SOFTWARE. ****************************** browserslist -4.24.2 +4.23.0 The MIT License (MIT) Copyright 2014 Andrey Sitnik and other contributors @@ -3164,7 +3295,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** call-bind -1.0.7 +1.0.6 MIT License Copyright (c) 2020 Jordan Harband @@ -3191,7 +3322,7 @@ SOFTWARE. ****************************** caniuse-lite -1.0.30001669 +1.0.30001600 Attribution 4.0 International ======================================================================= @@ -3960,21 +4091,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -chalk -5.3.0 -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ****************************** character-entities @@ -4059,21 +4175,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -chart.js -4.4.1 -The MIT License (MIT) - -Copyright (c) 2014-2022 Chart.js Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ****************************** cids @@ -4403,7 +4504,7 @@ THE SOFTWARE. ****************************** commander -12.1.0 +2.20.3 (The MIT License) Copyright (c) 2011 TJ Holowaychuk @@ -4431,7 +4532,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** commander -2.20.3 +4.1.1 (The MIT License) Copyright (c) 2011 TJ Holowaychuk @@ -4544,10 +4645,64 @@ ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +contentful +10.8.7 +The MIT License (MIT) + +Copyright (c) 2016 Contentful + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +contentful-resolve-response +1.8.1 +MIT License + +Copyright (c) 2018 Contentful + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** @contentful/rich-text-html-renderer -16.6.8 +16.3.5 MIT License Copyright (c) 2018 Contentful @@ -4574,7 +4729,7 @@ SOFTWARE. ****************************** @contentful/rich-text-types -16.8.3 +16.3.5 MIT License Copyright (c) 2018 Contentful @@ -4598,6 +4753,33 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +contentful-sdk-core +8.1.2 +The MIT License (MIT) + +Copyright (c) 2016 Contentful + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** convert-source-map @@ -5056,7 +5238,7 @@ THE SOFTWARE. ****************************** debug -4.3.5 +4.3.4 (The MIT License) Copyright (c) 2014-2017 TJ Holowaychuk @@ -5155,7 +5337,7 @@ THE SOFTWARE. ****************************** define-data-property -1.1.4 +1.1.2 MIT License Copyright (c) 2023 Jordan Harband @@ -5388,6 +5570,13 @@ authors: Raynos ****************************** +eastasianwidth +0.2.0 +license: MIT +authors: Masaki Komagata + +****************************** + ecdsa-sig-formatter 1.0.11 Apache License @@ -5595,11 +5784,11 @@ Apache License ****************************** -eip55 -2.1.1 +eciesjs +0.3.16 MIT License -Copyright (c) 2018 Daniel Cousens +Copyright (c) 2019-2022 Weiliang Li Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5623,7 +5812,7 @@ SOFTWARE. ****************************** electron-to-chromium -1.5.45 +1.4.715 Copyright 2018 Kilian Valkhof Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. @@ -5640,15 +5829,34 @@ authors: Fedor Indutny ****************************** -elliptic -6.6.1 -license: MIT -authors: Fedor Indutny +emoji-regex +8.0.0 +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ****************************** emoji-regex -8.0.0 +9.2.2 Copyright Mathias Bynens Permission is hereby granted, free of charge, to any person obtaining @@ -5987,6 +6195,32 @@ SOFTWARE. limitations under the License. +****************************** + +end-of-stream +1.4.4 +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ****************************** @ensdomains/content-hash @@ -6042,7 +6276,7 @@ authors: Mike Hall ****************************** escalade -3.2.0 +3.1.1 MIT License Copyright (c) Luke Edwards (lukeed.com) @@ -6111,33 +6345,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -es-define-property -1.0.0 -MIT License - -Copyright (c) 2024 Jordan Harband - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** es-errors @@ -6535,32 +6742,6 @@ eslint-visitor-keys limitations under the License. -****************************** - -eth-chainlist -0.0.498 -The MIT License (MIT) - -Copyright (c) 2022 Zane J. Chua - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - ****************************** eth-eip712-util-browser @@ -6636,7 +6817,7 @@ THE SOFTWARE. ****************************** ethereum-cryptography -2.2.1 +2.1.3 The MIT License (MIT) Copyright (c) 2021 Patricio Palladino, Paul Miller, ethereum-cryptography contributors @@ -6661,6 +6842,13 @@ THE SOFTWARE. ****************************** +ethereum-ens-network-map +1.0.2 +license: ISC +authors: Dan Finlay + +****************************** + @ethereumjs/common 3.1.1 The MIT License (MIT) @@ -6718,7 +6906,7 @@ SOFTWARE. ****************************** @ethereumjs/common -4.4.0 +4.3.0 The MIT License (MIT) Copyright (c) 2015 @@ -8262,7 +8450,7 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ****************************** @ethereumjs/tx -5.4.0 +5.3.0 Mozilla Public License Version 2.0 ================================== @@ -9020,7 +9208,7 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ****************************** @ethereumjs/util -9.1.0 +9.0.3 Mozilla Public License Version 2.0 ================================== @@ -9802,60 +9990,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -ethers -5.7.2 -MIT License - -Copyright (c) 2019 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -ethers -6.13.2 -MIT License - -Copyright (c) 2016-2023 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** @ethersproject/abi @@ -10190,33 +10324,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -@ethersproject/json-wallets -5.7.0 -MIT License - -Copyright (c) 2019 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** @ethersproject/keccak256 @@ -10467,33 +10574,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -@ethersproject/solidity -5.7.0 -MIT License - -Copyright (c) 2019 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** @ethersproject/strings @@ -10548,60 +10628,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -@ethersproject/units -5.7.0 -MIT License - -Copyright (c) 2019 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -@ethersproject/wallet -5.7.0 -MIT License - -Copyright (c) 2019 Richard Moore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** @ethersproject/web @@ -10758,6 +10784,65 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +eth-phishing-detect +1.2.0 +# DON'T BE A DICK PUBLIC LICENSE + +> Version 1.1, December 2016 + +> Copyright (C) 2018 kumavis + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document. + +> DON'T BE A DICK PUBLIC LICENSE +> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +1. Do whatever you like with the original work, just don't be a dick. + + Being a dick includes - but is not limited to - the following instances: + + 1a. Outright copyright infringement - Don't just copy this and change the name. + 1b. Selling the unmodified original with no work done what-so-ever, that's REALLY being a dick. + 1c. Modifying the original work to contain hidden harmful content. That would make you a PROPER dick. + +2. If you become rich through modifications, related works/services, or supporting the original work, +share the love. Only a dick would make loads off this work and not buy the original work's +creator(s) a pint. + +3. Code is provided with no warranty. Using somebody else's code and bitching when it goes wrong makes +you a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix back. + + +****************************** + +eth-rpc-errors +4.0.3 +MIT License + +Copyright (c) 2019 MetaMask + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** eventemitter3 @@ -10889,38 +10974,227 @@ Copyright (C) 2015-present SheetJS ****************************** -extend -3.0.2 +@expo/config +8.5.6 The MIT License (MIT) -Copyright (c) 2014 Stefan Thomas +Copyright (c) 2015-present 650 Industries, Inc. (aka Expo) -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -extension-port-stream -3.0.0 -ISC License +@expo/config-plugins +7.9.2 +The MIT License (MIT) + +Copyright (c) 2015-present 650 Industries, Inc. (aka Expo) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +****************************** + +@expo/config-types +50.0.1 +The MIT License (MIT) + +Copyright (c) 2020-present 650 Industries, Inc. (aka Expo) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +****************************** + +expo-constants +15.4.5 +license: MIT +authors: 650 Industries, Inc. + +****************************** + +@expo/fingerprint +0.6.1 +The MIT License (MIT) + +Copyright (c) 2015-present 650 Industries, Inc. (aka Expo) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +****************************** + +@expo/json-file +8.3.3 +The MIT License (MIT) + +Copyright (c) 2015-present 650 Industries, Inc. (aka Expo) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +****************************** + +@expo/plist +0.1.3 +license: MIT +authors: undefined + +****************************** + +@expo/sdk-runtime-versions +1.0.0 <> +license: MIT +authors: Expo + +****************************** + +@expo/spawn-async +1.7.2 +The MIT License (MIT) + +Copyright (c) 2015 650 Industries + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +****************************** + +extend +3.0.2 +The MIT License (MIT) + +Copyright (c) 2014 Stefan Thomas + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +****************************** + +extension-port-stream +2.1.1 +ISC License Copyright (c) 2020 MetaMask @@ -10940,7 +11214,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** extension-port-stream -4.2.0 +3.0.0 ISC License Copyright (c) 2020 MetaMask @@ -10986,11 +11260,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -fast-deep-equal -3.1.3 +fast-copy +2.1.7 MIT License -Copyright (c) 2017 Evgeny Poberezkin +Copyright (c) 2018 Tony Quetano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11013,11 +11287,11 @@ SOFTWARE. ****************************** -fastest-levenshtein -1.0.16 +fast-deep-equal +3.1.3 MIT License -Copyright (c) 2020 Kasper Unn Weihe +Copyright (c) 2017 Evgeny Poberezkin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11037,6 +11311,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ****************************** fast-fifo @@ -11143,6 +11418,37 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +fast-levenshtein +2.0.6 +(MIT License) + +Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.com/) + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + + ****************************** fast-safe-stringify @@ -11202,7 +11508,7 @@ SOFTWARE. ****************************** fast-xml-parser -4.4.1 +4.3.4 MIT License Copyright (c) 2017 Amit Kumar Gupta @@ -11270,6 +11576,21 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +find-up +5.0.0 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ****************************** firebase @@ -11608,7 +11929,7 @@ SOFTWARE. ****************************** follow-redirects -1.15.9 +1.15.6 Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -11657,6 +11978,27 @@ SOFTWARE. +****************************** + +foreground-child +3.1.1 +The ISC License + +Copyright (c) 2015-2023 Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** form-data @@ -11984,29 +12326,263 @@ fuse.js ****************************** -gensync -1.0.0-beta.2 -Copyright 2018 Logan Smyth +futoin-hkdf +1.5.1 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -****************************** + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -get-caller-file -2.0.5 -ISC License (ISC) -Copyright 2018 Stefan Penner + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +****************************** + +gensync +1.0.0-beta.2 +Copyright 2018 Logan Smyth + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +get-caller-file +2.0.5 +ISC License (ISC) +Copyright 2018 Stefan Penner Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +getenv +1.0.0 +The MIT License (MIT) +Copyright (c) 2012-2019 Christoph Tavan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** get-intrinsic @@ -12112,6 +12688,27 @@ freely, subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. +****************************** + +glob +10.4.1 +The ISC License + +Copyright (c) 2009-2023 Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** globals @@ -12195,14 +12792,35 @@ SOFTWARE. ****************************** -gridplus-sdk -2.5.1 -MIT License +graceful-fs +4.2.11 +The ISC License -Copyright (c) 2019 GridPlus, Inc +Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +gridplus-sdk +2.5.1 +MIT License + +Copyright (c) 2019 GridPlus, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12223,7 +12841,7 @@ SOFTWARE. ****************************** @grpc/grpc-js -1.9.15 +1.9.14 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -12634,6 +13252,13 @@ SOFTWARE. limitations under the License. +****************************** + +gud +1.0.0 +license: MIT +authors: Jamie Kyle + ****************************** has-bigints @@ -12728,7 +13353,7 @@ authors: Fedor Indutny ****************************** hasown -2.0.2 +2.0.0 MIT License Copyright (c) Jordan Harband and contributors @@ -12755,7 +13380,7 @@ SOFTWARE. ****************************** has-property-descriptors -1.0.2 +1.0.1 MIT License Copyright (c) 2022 Inspect JS @@ -12782,7 +13407,7 @@ SOFTWARE. ****************************** has-proto -1.0.3 +1.0.1 MIT License Copyright (c) 2022 Inspect JS @@ -12836,7 +13461,7 @@ SOFTWARE. ****************************** has-tostringtag -1.0.2 +1.0.0 MIT License Copyright (c) 2021 Inspect JS @@ -12940,34 +13565,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -history -5.3.0 -MIT License - -Copyright (c) React Training 2016-2020 -Copyright (c) Remix Software 2020-2021 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** hmac-drbg @@ -13013,7 +13610,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** http-parser-js -0.5.8 +0.4.9 Copyright (c) 2015 Tim Caswell (https://github.com/creationix) and other contributors. All rights reserved. @@ -13358,6 +13955,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +imurmurhash +0.1.4 +license: MIT +authors: Jens Taylor + ****************************** inherits @@ -13418,7 +14022,7 @@ SOFTWARE. ****************************** internal-slot -1.0.7 +1.0.6 MIT License Copyright (c) 2019 Jordan Harband @@ -13467,6 +14071,26 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +@isaacs/cliui +8.0.2 +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** is-alphabetical @@ -13593,7 +14217,7 @@ SOFTWARE. ****************************** is-array-buffer -3.0.4 +3.0.2 MIT License Copyright (c) 2015 Chen Gengyuan, Inspect JS @@ -13823,6 +14447,27 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +isexe +2.0.0 +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** is-fn @@ -14162,7 +14807,7 @@ SOFTWARE. ****************************** is-shared-array-buffer -1.0.3 +1.0.2 MIT License Copyright (c) 2021 Inspect JS @@ -14260,7 +14905,7 @@ SOFTWARE. ****************************** is-typed-array -1.1.13 +1.1.10 The MIT License (MIT) Copyright (c) 2015 Jordan Harband @@ -14339,10 +14984,71 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +jackspeak +3.1.2 +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** + + ****************************** jayson -4.1.1 +4.1.0 (The MIT License) Copyright (c) 2011-2012 Tedde Lundgren @@ -15025,7 +15731,7 @@ Address all questions regarding this license to: ****************************** jsesc -3.0.2 +2.5.2 Copyright Mathias Bynens Permission is hereby granted, free of charge, to any person obtaining @@ -15077,6 +15783,13 @@ SOFTWARE. [others]: https://github.com/json5/json5/contributors +****************************** + +jsonify +0.0.1 +license: Public Domain +authors: Douglas Crockford + ****************************** jsonparse @@ -15107,6 +15820,48 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +json-rpc-engine +6.1.0 +ISC License + +Copyright (c) 2020 MetaMask + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +json-rpc-middleware-stream +5.0.1 +ISC License + +Copyright (c) 2020 MetaMask + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** json-rpc-random-id @@ -15144,7 +15899,7 @@ SOFTWARE. ****************************** jsonschema -1.4.1 +1.2.4 jsonschema is licensed under MIT license. Copyright (C) 2012-2015 Tom de Grunt @@ -15168,6 +15923,33 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +json-stable-stringify +1.1.1 +MIT License + +Copyright (c) 2013 contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** JSONStream @@ -15277,6 +16059,38 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +jssha +3.2.0 +Copyright (c) 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + ****************************** js-sha3 @@ -15477,7 +16291,7 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL ****************************** keccak -3.0.4 +3.0.2 The MIT License (MIT) Copyright (c) 2016-2019 https://github.com/cryptocoinjs/keccak contributors @@ -15752,7 +16566,7 @@ authors: soralit ****************************** @keystonehq/metamask-airgapped-keyring -0.14.1 +0.13.1 license: MIT authors: aaronisme @@ -15771,21 +16585,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -@kurkle/color -0.3.2 -The MIT License (MIT) - -Copyright (c) 2018-2021 Jukka Kurkela - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ****************************** @kwsites/file-exists @@ -15898,7 +16697,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ****************************** @lavamoat/snow -2.0.2 +2.0.1 The MIT License (MIT) Copyright (c) 2020 Consensys Software @@ -15912,38 +16711,23 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ****************************** -@ledgerhq/cryptoassets-evm-signatures -13.5.0 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +lie +3.1.1 +#Copyright (c) 2014 Calvin Metcalf -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** ****************************** -@ledgerhq/devices -8.4.4 -The MIT License +lines-and-columns +1.1.6 +The MIT License (MIT) -Copyright (c) 2017-present Ledger https://www.ledger.com/ +Copyright (c) 2015 Brian Donovan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -15966,247 +16750,12 @@ THE SOFTWARE. ****************************** -@ledgerhq/domain-service -1.2.6 -The MIT License +locale-currency +0.0.1 +license: BSD-2-Clause +authors: Thomas Deegan -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/errors -6.19.1 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/evm-tools -1.2.3 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/hw-app-eth -6.39.0 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/hw-transport -6.31.4 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/hw-transport-mocker -6.29.4 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/live-env -2.3.0 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -@ledgerhq/logs -6.12.0 -license: Apache-2.0 -authors: undefined - -****************************** - -@ledgerhq/types-live -6.52.0 -The MIT License - -Copyright (c) 2017-present Ledger https://www.ledger.com/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -lie -3.1.1 -#Copyright (c) 2014 Calvin Metcalf - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** - -****************************** - -locale-currency -0.0.1 -license: BSD-2-Clause -authors: Thomas Deegan - -****************************** +****************************** localforage 1.10.0 @@ -16413,6 +16962,21 @@ localforage limitations under the License. +****************************** + +locate-path +6.0.0 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ****************************** lodash @@ -16574,28 +17138,109 @@ terms above. ****************************** -loglevel -1.9.1 -Copyright (c) 2013 Tim Perry +lodash.isplainobject +4.0.6 +Copyright jQuery Foundation and other contributors -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + + +****************************** + +lodash.isstring +4.0.1 +Copyright 2012-2016 The Dojo Foundation +Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +loglevel +1.9.1 +Copyright (c) 2013 Tim Perry + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -17045,29 +17690,24 @@ THE SOFTWARE. ****************************** -lottie-web -5.12.2 -The MIT License (MIT) +lru-cache +10.2.2 +The ISC License -Copyright (c) 2015 Bodymovin +Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ****************************** @@ -17090,6 +17730,27 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +lru-cache +6.0.0 +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** luxon @@ -17494,14 +18155,14 @@ authors: Egor Gumenyuk ****************************** @metamask/abi-utils -2.0.4 +2.0.2 license: (Apache-2.0 AND MIT) authors: Maarten Zuidhoorn ****************************** @metamask/accounts-controller -20.0.0 +14.0.0 MIT License Copyright (c) 2018 MetaMask @@ -17526,215 +18187,86 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** -@metamask/account-watcher -4.1.1 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +@metamask/address-book-controller +4.0.1 +MIT License - 1. Definitions. +Copyright (c) 2018 MetaMask - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +****************************** - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +@metamask/announcement-controller +6.1.0 +MIT License - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Copyright (c) 2018 MetaMask - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +****************************** - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +@metamask/approval-controller +6.0.2 +MIT License - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Copyright (c) 2018 MetaMask - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2022 ConsenSys Software Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** -@metamask/address-book-controller -6.0.0 +@metamask/approval-controller +7.0.0 MIT License Copyright (c) 2018 MetaMask @@ -17759,8 +18291,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** -@metamask/announcement-controller -7.0.0 +@metamask/assets-controllers +29.0.0 MIT License Copyright (c) 2018 MetaMask @@ -17785,8 +18317,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** -@metamask/approval-controller -7.1.1 +@metamask/base-controller +3.2.3 MIT License Copyright (c) 2018 MetaMask @@ -17811,8 +18343,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** -@metamask/assets-controllers -45.1.0 +@metamask/base-controller +4.1.1 MIT License Copyright (c) 2018 MetaMask @@ -17838,7 +18370,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/base-controller -6.0.3 +5.0.2 MIT License Copyright (c) 2018 MetaMask @@ -17864,7 +18396,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/base-controller -7.0.2 +6.0.0 MIT License Copyright (c) 2018 MetaMask @@ -17887,13 +18419,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -****************************** - -@metamask/bitcoin-wallet-snap -0.8.2 -license: (MIT-0 OR Apache-2.0) -authors: undefined - ****************************** @metamask/browser-passworder @@ -17939,7 +18464,59 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/controller-utils -11.4.4 +11.0.0 +MIT License + +Copyright (c) 2018 MetaMask + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + + +****************************** + +@metamask/controller-utils +8.0.4 +MIT License + +Copyright (c) 2018 MetaMask + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + + +****************************** + +@metamask/controller-utils +9.1.0 MIT License Copyright (c) 2018 MetaMask @@ -17965,14 +18542,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/design-tokens -4.0.0 +3.0.0 license: MIT authors: undefined ****************************** -@metamask/ens-controller -14.0.1 +@metamask/desktop +0.3.0 MIT License Copyright (c) 2018 MetaMask @@ -17993,265 +18570,59 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@metamask/ens-resolver-snap -0.1.2 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +@metamask/ens-controller +10.0.1 +MIT License - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) 2018 MetaMask - 1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +****************************** - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +@metamask/eth-block-tracker +9.0.3 +MIT License - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Copyright (c) 2018 MetaMask - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2024 ConsenSys Software Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -****************************** - -@metamask/eth-block-tracker -10.0.0 -MIT License - -Copyright (c) 2018 MetaMask - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - - -****************************** - -@metamask/eth-block-tracker -11.0.2 -MIT License - -Copyright (c) 2018 MetaMask - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @@ -18278,7 +18649,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-hd-keyring -7.0.4 +7.0.1 ISC License Copyright (c) 2020 MetaMask @@ -18407,7 +18778,7 @@ THE SOFTWARE. ****************************** @metamask/eth-json-rpc-filters -9.0.0 +7.0.0 ISC License Copyright (c) 2020 MetaMask @@ -18449,28 +18820,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-json-rpc-middleware -13.0.0 -ISC License - -Copyright (c) 2020 MetaMask - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -****************************** - -@metamask/eth-json-rpc-middleware -15.0.0 +12.1.1 ISC License Copyright (c) 2020 MetaMask @@ -18512,7 +18862,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-json-rpc-provider -4.1.6 +3.0.2 ISC License Copyright (c) 2022 MetaMask @@ -18668,7 +19018,7 @@ THE SOFTWARE. ****************************** @metamask/eth-ledger-bridge-keyring -5.0.1 +2.0.1 ISC License Copyright (c) 2020 MetaMask @@ -18689,35 +19039,21 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-query -4.0.0 +3.0.1 license: ISC authors: undefined ****************************** -@metamask/eth-sig-util -7.0.3 -ISC License - -Copyright (c) 2020 MetaMask - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - +@metamask/eth-query +4.0.0 +license: ISC +authors: undefined ****************************** @metamask/eth-sig-util -8.0.0 +7.0.1 ISC License Copyright (c) 2020 MetaMask @@ -18738,7 +19074,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-simple-keyring -6.0.5 +6.0.1 ISC License Copyright (c) 2020 MetaMask @@ -18759,31 +19095,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-snap-keyring -5.0.1 -Copyright ConsenSys Software Inc. 2022. All rights reserved. - -You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. - -Subject to the limited license below, you may not (and you may not permit anyone else to) distribute, publish, copy, modify, merge, combine with another program, create derivative works of, reverse engineer, decompile or otherwise attempt to extract the source code of, the Program or any part thereof, except that you may contribute to this repository. - -You are granted a non-exclusive, non-transferable, non-sublicensable license to distribute, publish, copy, modify, merge, combine with another program or create derivative works of the Program (such resulting program, collectively, the “Resulting Program”) solely for Non-Commercial Use as long as you: - 1. give prominent notice (“Notice”) with each copy of the Resulting Program that the Program is used in the Resulting Program and that the Program is the copyright of ConsenSys; and - 2. subject the Resulting Program and any distribution, publication, copy, modification, merger therewith, combination with another program or derivative works thereof to the same Notice requirement and Non-Commercial Use restriction set forth herein. - -“Non-Commercial Use” means each use as described in clauses (1)-(3) below, as reasonably determined by ConsenSys in its sole discretion: - 1. personal use for research, personal study, private entertainment, hobby projects or amateur pursuits, in each case without any anticipated commercial application; - 2. use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization or government institution; or - 3. the number of monthly active users of the Resulting Program across all versions thereof and platforms globally do not exceed 10,000 at any time. - -You will not use any trade mark, service mark, trade name, logo of ConsenSys or any other company or organization in a way that is likely or intended to cause confusion about the owner or authorized user of such marks, names or logos. - -If you have any questions, comments or interest in pursuing any other use cases, please reach out to us at communications@metamask.io. - +4.2.1 +license: Custom: https://metamask.github.io/eth-snap-keyring/latest/ +authors: undefined ****************************** @metamask/eth-token-tracker -9.0.0 +8.0.0 ISC License Copyright (c) 2020 MetaMask @@ -18804,7 +19123,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/eth-trezor-keyring -3.1.3 +3.1.0 ISC License Copyright (c) 2020 MetaMask @@ -18825,7 +19144,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/gas-fee-controller -21.0.0 +15.1.2 MIT License Copyright (c) 2018 MetaMask @@ -18850,11 +19169,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** -@metamask-institutional/configuration-client -2.0.1 +@metamask/gas-fee-controller +17.0.0 MIT License -Copyright (c) 2023 ConsenSys Vertical Apps +Copyright (c) 2018 MetaMask Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18872,13 +19191,39 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ****************************** -@metamask-institutional/custody-controller -0.3.0 +@metamask-institutional/configuration-client +2.0.1 +MIT License + +Copyright (c) 2023 ConsenSys Vertical Apps + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +@metamask-institutional/custody-controller +0.2.27 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -18905,7 +19250,7 @@ SOFTWARE. ****************************** @metamask-institutional/custody-keyring -2.1.1 +2.0.0 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -18932,7 +19277,7 @@ SOFTWARE. ****************************** @metamask-institutional/extension -0.3.28 +0.3.24 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -18959,7 +19304,7 @@ SOFTWARE. ****************************** @metamask-institutional/institutional-features -1.3.6 +1.3.2 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -19040,7 +19385,7 @@ SOFTWARE. ****************************** @metamask-institutional/sdk -0.2.0 +0.1.27 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -19094,7 +19439,7 @@ SOFTWARE. ****************************** @metamask-institutional/transaction-update -0.2.6 +0.2.2 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -19121,7 +19466,7 @@ SOFTWARE. ****************************** @metamask-institutional/types -1.2.0 +1.1.0 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -19148,7 +19493,7 @@ SOFTWARE. ****************************** @metamask-institutional/websocket-client -0.2.6 +0.2.2 MIT License Copyright (c) 2023 ConsenSys Vertical Apps @@ -19193,27 +19538,6 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -****************************** - -@metamask/json-rpc-engine -10.0.1 -ISC License - -Copyright (c) 2022 MetaMask - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ****************************** @metamask/json-rpc-engine @@ -19238,7 +19562,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/json-rpc-engine -9.0.3 +8.0.2 ISC License Copyright (c) 2022 MetaMask @@ -19259,7 +19583,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/json-rpc-middleware-stream -8.0.5 +7.0.1 ISC License Copyright (c) 2020 MetaMask @@ -19280,45 +19604,21 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/keyring-api -10.1.0 -Copyright ConsenSys Software Inc. 2022. All rights reserved. - -You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. - -Subject to the limited license below, you may not (and you may not permit anyone else to) distribute, publish, copy, modify, merge, combine with another program, create derivative works of, reverse engineer, decompile or otherwise attempt to extract the source code of, the Program or any part thereof, except that you may contribute to this repository. - -You are granted a non-exclusive, non-transferable, non-sublicensable license to distribute, publish, copy, modify, merge, combine with another program or create derivative works of the Program (such resulting program, collectively, the “Resulting Program”) solely for Non-Commercial Use as long as you: - 1. give prominent notice (“Notice”) with each copy of the Resulting Program that the Program is used in the Resulting Program and that the Program is the copyright of ConsenSys; and - 2. subject the Resulting Program and any distribution, publication, copy, modification, merger therewith, combination with another program or derivative works thereof to the same Notice requirement and Non-Commercial Use restriction set forth herein. - -“Non-Commercial Use” means each use as described in clauses (1)-(3) below, as reasonably determined by ConsenSys in its sole discretion: - 1. personal use for research, personal study, private entertainment, hobby projects or amateur pursuits, in each case without any anticipated commercial application; - 2. use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization or government institution; or - 3. the number of monthly active users of the Resulting Program across all versions thereof and platforms globally do not exceed 10,000 at any time. - -You will not use any trade mark, service mark, trade name, logo of ConsenSys or any other company or organization in a way that is likely or intended to cause confusion about the owner or authorized user of such marks, names or logos. - -If you have any questions, comments or interest in pursuing any other use cases, please reach out to us at communications@metamask.io. - - -****************************** - -@metamask/keyring-api -8.1.3 +5.1.0 license: Custom: https://docs.metamask.io/snaps/ authors: undefined ****************************** @metamask/keyring-api -9.0.0 +6.3.1 license: Custom: https://docs.metamask.io/snaps/ authors: undefined ****************************** @metamask/keyring-controller -19.0.0 +15.0.0 MIT License Copyright (c) 2018 MetaMask @@ -19344,7 +19644,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/key-tree -9.1.2 +9.1.1 MIT License Copyright (c) 2021 MetaMask @@ -19371,7 +19671,7 @@ SOFTWARE. ****************************** @metamask/logging-controller -6.0.0 +3.0.1 license: MIT authors: undefined @@ -19399,7 +19699,33 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/message-manager -11.0.1 +7.3.9 +MIT License + +Copyright (c) 2018 MetaMask + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + + +****************************** + +@metamask/message-manager +8.0.2 MIT License Copyright (c) 2018 MetaMask @@ -19425,7 +19751,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/message-signing-snap -0.4.0 +0.3.3 license: Custom: http://localhost authors: undefined @@ -19452,7 +19778,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/name-controller -8.0.0 +6.0.1 MIT License Copyright (c) 2023 MetaMask @@ -19478,7 +19804,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/network-controller -21.0.0 +18.1.2 MIT License Copyright (c) 2018 MetaMask @@ -19504,7 +19830,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/nonce-tracker -6.0.0 +5.0.0 MIT License Copyright (c) 2019 MetaMask @@ -19530,11 +19856,11 @@ SOFTWARE. ****************************** -@metamask/notification-services-controller -0.14.0 +@metamask/notification-controller +3.0.0 MIT License -Copyright (c) 2024 MetaMask +Copyright (c) 2018 MetaMask Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19602,6 +19928,69 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +@metamask/obs-store +5.0.0 +ISC License + +Copyright (c) 2020 MetaMask + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +@metamask/obs-store +7.0.0 +ISC License + +Copyright (c) 2020 MetaMask + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +@metamask/obs-store +8.1.0 +ISC License + +Copyright (c) 2020 MetaMask + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** @metamask/obs-store @@ -19626,7 +20015,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/permission-controller -11.0.3 +9.0.2 MIT License Copyright (c) 2018 MetaMask @@ -19652,7 +20041,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/permission-log-controller -3.0.1 +2.0.1 Copyright ConsenSys Software Inc. 2022. All rights reserved. You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. @@ -19676,7 +20065,7 @@ If you have any questions, comments or interest in pursuing any other use cases, ****************************** @metamask/phishing-controller -12.3.0 +9.0.2 MIT License Copyright (c) 2018 MetaMask @@ -19702,7 +20091,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/polling-controller -11.0.0 +6.0.2 MIT License Copyright (c) 2018 MetaMask @@ -19728,7 +20117,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/polling-controller -12.0.1 +8.0.0 MIT License Copyright (c) 2018 MetaMask @@ -19754,7 +20143,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/post-message-stream -8.1.1 +8.1.0 ISC License Copyright (c) 2020 MetaMask @@ -19775,247 +20164,67 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/ppom-validator -0.35.1 +0.30.0 license: Custom: https://nodejs.org authors: undefined ****************************** -@metamask/preinstalled-example-snap -0.2.0 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +@metamask/preferences-controller +11.0.0 +MIT License - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) 2018 MetaMask - 1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +****************************** - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +@metamask/providers +14.0.2 +MIT License - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Copyright (c) 2020 MetaMask - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2024 Consensys Software Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -****************************** - -@metamask/profile-sync-controller -2.0.0 -MIT License - -Copyright (c) 2024 MetaMask - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @metamask/providers -18.2.0 +16.1.0 MIT License Copyright (c) 2020 MetaMask @@ -20042,7 +20251,7 @@ SOFTWARE. ****************************** @metamask/queued-request-controller -7.0.1 +0.10.0 MIT License Copyright (c) 2023 MetaMask @@ -20068,7 +20277,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/rate-limit-controller -6.0.0 +5.0.1 MIT License Copyright (c) 2018 MetaMask @@ -20094,7 +20303,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/rpc-errors -6.4.0 +6.2.1 MIT License Copyright (c) 2019 MetaMask @@ -20120,29 +20329,23 @@ SOFTWARE. ****************************** -@metamask/rpc-errors -7.0.1 -MIT License - -Copyright (c) 2019 MetaMask +@metamask/safe-event-emitter +2.0.0 <> +ISC License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) 2020 MetaMask -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @@ -20196,7 +20399,7 @@ THE SOFTWARE. ****************************** @metamask/selected-network-controller -18.0.2 +13.0.0 MIT License Copyright (c) 2023 MetaMask @@ -20222,7 +20425,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/signature-controller -23.1.0 +14.0.1 MIT License Copyright (c) 2023 MetaMask @@ -20248,14 +20451,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/slip44 -4.1.0 +3.1.0 license: ISC authors: Dan Finlay ****************************** @metamask/smart-transactions-controller -15.0.0 +10.0.1 Copyright ConsenSys Software Inc. 2020. All rights reserved. You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. @@ -20279,7 +20482,7 @@ If you have any questions, comments or interest in pursuing any other use cases, ****************************** @metamask/snaps-controllers -9.14.0 +8.2.0 Copyright ConsenSys Software Inc. 2021. All rights reserved. You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. @@ -20303,7 +20506,7 @@ If you have any questions, comments or interest in pursuing any other use cases, ****************************** @metamask/snaps-execution-environments -6.10.0 +6.2.0 Copyright ConsenSys Software Inc. 2022. All rights reserved. You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. @@ -20329,7 +20532,7 @@ If you have any questions, comments or interest in pursuing any other use cases, ****************************** @metamask/snaps-registry -3.2.2 +3.1.0 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -20536,7 +20739,7 @@ If you have any questions, comments or interest in pursuing any other use cases, ****************************** @metamask/snaps-rpc-methods -11.6.0 +9.1.0 Copyright ConsenSys Software Inc. 2021. All rights reserved. You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form. @@ -20560,7 +20763,7 @@ If you have any questions, comments or interest in pursuing any other use cases, ****************************** @metamask/snaps-sdk -6.12.0 +4.3.0 ISC License Copyright (c) 2023 MetaMask @@ -20581,7 +20784,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/snaps-utils -8.6.0 +7.4.0 ISC License Copyright (c) 2022 MetaMask @@ -20599,28 +20802,6 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -****************************** - -@metamask/solana-wallet-snap -0.1.9 -license: (MIT-0 OR Apache-2.0) -authors: undefined - -****************************** - -@metamask/superstruct -3.1.0 -The MIT License - -Copyright © 2017, [Ian Storm Taylor](https://ianstormtaylor.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ****************************** @metamask/swappable-obj-proxy @@ -20631,7 +20812,7 @@ authors: undefined ****************************** @metamask/transaction-controller -40.1.0 +32.0.0 MIT License Copyright (c) 2018 MetaMask @@ -20657,7 +20838,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/user-operation-controller -16.0.0 +10.0.0 MIT License Copyright (c) 2023 MetaMask @@ -20683,28 +20864,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ****************************** @metamask/utils -10.0.1 -ISC License - -Copyright (c) 2022 MetaMask - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -****************************** - -@metamask/utils -8.5.0 +5.0.2 ISC License Copyright (c) 2022 MetaMask @@ -20725,7 +20885,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @metamask/utils -9.3.0 +8.4.0 ISC License Copyright (c) 2022 MetaMask @@ -20855,6 +21015,33 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +mini-create-react-context +0.3.2 +Copyright (c) 2019-present StringEpsilon + +Copyright (c) 2017-2019 James Kyle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** minimalistic-assert @@ -20903,8 +21090,50 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** -mkdirp -1.0.4 +minimatch +9.0.4 +The ISC License + +Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +minipass +7.1.2 +The ISC License + +Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +mkdirp +1.0.4 Copyright James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me) This project is free software released under the MIT license: @@ -21116,16 +21345,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -multiformats -13.2.2 -This project is dual licensed under MIT and Apache-2.0. - -MIT: https://www.opensource.org/licenses/mit -Apache-2.0: https://www.apache.org/licenses/license-2.0 - - ****************************** multiformats @@ -21227,6 +21446,34 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +mz +2.7.0 + +The MIT License (MIT) + +Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + ****************************** nan @@ -21328,7 +21575,7 @@ SOFTWARE. ****************************** @noble/ciphers -0.5.3 +0.5.2 The MIT License (MIT) Copyright (c) 2022 Paul Miller (https://paulmillr.com) @@ -21355,7 +21602,7 @@ THE SOFTWARE. ****************************** @noble/curves -1.2.0 +1.3.0 The MIT License (MIT) Copyright (c) 2022 Paul Miller (https://paulmillr.com) @@ -21381,7 +21628,7 @@ THE SOFTWARE. ****************************** @noble/curves -1.4.2 +1.4.0 The MIT License (MIT) Copyright (c) 2022 Paul Miller (https://paulmillr.com) @@ -21458,32 +21705,6 @@ THE SOFTWARE. ****************************** -@noble/hashes -1.3.2 -The MIT License (MIT) - -Copyright (c) 2022 Paul Miller (https://paulmillr.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -****************************** - @noble/hashes 1.3.3 The MIT License (MIT) @@ -21624,24 +21845,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ****************************** -node-addon-api -5.1.0 -The MIT License (MIT) -===================== - -Copyright (c) 2017 Node.js API collaborators ------------------------------------ - -*Node.js API collaborators listed at * - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -****************************** - node-addon-api 7.1.0 The MIT License (MIT) @@ -21713,7 +21916,7 @@ THE SOFTWARE. ****************************** node-releases -2.0.18 +2.0.14 The MIT License Copyright (c) 2017 Sergey Rubanov (https://github.com/chicoxyzzy) @@ -21794,7 +21997,7 @@ THE SOFTWARE. ****************************** object.assign -4.1.5 +4.1.4 The MIT License (MIT) Copyright (c) 2014 Jordan Harband @@ -21820,7 +22023,7 @@ SOFTWARE. ****************************** object-inspect -1.13.2 +1.12.3 MIT License Copyright (c) 2013 James Halliday @@ -21898,6 +22101,13 @@ THE SOFTWARE. ****************************** +obj-multiplex +1.0.0 <> +license: ISC +authors: undefined + +****************************** + once 1.4.0 The ISC License @@ -21917,6 +22127,34 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +otpauth +8.0.3 +The MIT License (MIT) +===================== + +Copyright © 2022 Héctor Molinero Fernández + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ****************************** pako @@ -21972,6 +22210,36 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +path-exists +4.0.0 +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +path-key +3.1.1 +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ****************************** path-parse @@ -21999,10 +22267,71 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +path-scurry +1.11.1 +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** + + ****************************** path-to-regexp -1.9.0 +1.7.0 The MIT License (MIT) Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) @@ -22080,10 +22409,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ****************************** picocolors -1.1.1 +1.0.0 ISC License -Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov +Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -22115,71 +22444,11 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ****************************** -pony-cause -2.1.10 -BSD Zero Clause License (0BSD) - -Copyright (c) 2020 Pelle Wessman - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - -****************************** - -popper.js -1.15.0 -license: MIT -authors: Federico Zivolo - -****************************** - -popper.js -1.16.1-lts -license: MIT -authors: Federico Zivolo - -****************************** - -@popperjs/core -2.9.2 -The MIT License (MIT) - -Copyright (c) 2019 Federico Zivolo - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -****************************** - -possible-typed-array-names -1.0.0 +pirates +4.0.6 MIT License -Copyright (c) 2024 Jordan Harband +Copyright (c) 2016-2018 Ari Porad Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -22202,134 +22471,461 @@ SOFTWARE. ****************************** -printj -1.1.2 -Copyright (C) 2016-present SheetJS - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +@pkgjs/parseargs +0.11.0 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - http://www.apache.org/licenses/LICENSE-2.0 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -****************************** + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -process -0.11.10 -(The MIT License) + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Copyright (c) 2013 Roman Shtylman + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -****************************** + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -process-nextick-args -2.0.1 -# Copyright (c) 2015 Calvin Metcalf + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.** + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -****************************** + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -promise-polyfill -8.3.0 -Copyright (c) 2014 Taylor Hakes -Copyright (c) 2014 Forbes Lindesay + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -****************************** + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -promise-to-callback -1.0.0 -The MIT License (MIT) + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Copyright (c) Steve Mao (github.com/stevemao) + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + END OF TERMS AND CONDITIONS -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + APPENDIX: How to apply the Apache License to your work. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] -****************************** + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -property-information -5.6.0 -(The MIT License) + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +****************************** + +p-limit +3.1.0 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +plist +3.1.0 +(The MIT License) + +Copyright (c) 2010-2017 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +p-locate +5.0.0 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +pony-cause +2.1.10 +BSD Zero Clause License (0BSD) + +Copyright (c) 2020 Pelle Wessman + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +popper.js +1.15.0 +license: MIT +authors: Federico Zivolo + +****************************** + +popper.js +1.16.1-lts +license: MIT +authors: Federico Zivolo + +****************************** + +@popperjs/core +2.9.2 +The MIT License (MIT) + +Copyright (c) 2019 Federico Zivolo + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +printj +1.1.2 +Copyright (C) 2016-present SheetJS + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +****************************** + +process +0.11.10 +(The MIT License) + +Copyright (c) 2013 Roman Shtylman + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +process-nextick-args +2.0.1 +# Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** + + +****************************** + +promise-polyfill +8.3.0 +Copyright (c) 2014 Taylor Hakes +Copyright (c) 2014 Forbes Lindesay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +****************************** + +promise-to-callback +1.0.0 +The MIT License (MIT) + +Copyright (c) Steve Mao (github.com/stevemao) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +property-information +5.6.0 +(The MIT License) Copyright (c) 2015 Titus Wormer @@ -22773,11 +23369,26 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -punycode -2.1.0 -Copyright Mathias Bynens +p-throttle +4.1.1 +MIT License -Permission is hereby granted, free of charge, to any person obtaining +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +punycode +2.1.0 +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, @@ -22860,7 +23471,7 @@ authors: Kazuhiko Arase ****************************** qrcode.react -3.1.0 +1.0.1 ISC License Copyright (c) 2015, Paul O’Shannessy @@ -22877,8 +23488,53 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -This product bundles QR Code Generator, which is available under a -"MIT" license. For details, see src/third-party/qrcodegen. + +****************************** + +qr.js +0.0.0 +Copyright (c) 2013 Roman Shtylman + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +qs +6.11.2 +BSD 3-Clause License + +Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @@ -22996,33 +23652,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -react -18.2.0 -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** react-beautiful-dnd @@ -23042,19 +23671,6 @@ See the License for the specific language governing permissions and limitations under the License. -****************************** - -react-chartjs-2 -5.2.0 -Copyright 2020 Jeremy Ayerst - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - ****************************** react-clientside-effect @@ -23110,33 +23726,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -react-dom -18.2.0 -MIT License - -Copyright (c) Facebook, Inc. and its affiliates. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** react-easy-swipe @@ -23362,6 +23951,13 @@ SOFTWARE. +****************************** + +@react-native/normalize-color +2.1.0 +license: MIT +authors: undefined + ****************************** react-popper @@ -23392,7 +23988,7 @@ SOFTWARE. ****************************** react-redux -7.2.9 +7.2.0 The MIT License (MIT) Copyright (c) 2015-present Dan Abramov @@ -23446,40 +24042,10 @@ SOFTWARE. ****************************** react-router -5.3.4 -MIT License - -Copyright (c) React Training 2015-2019 -Copyright (c) Remix Software 2020-2022 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -react-router -6.26.2 +5.1.2 MIT License -Copyright (c) React Training LLC 2015-2019 -Copyright (c) Remix Software Inc. 2020-2021 -Copyright (c) Shopify Inc. 2022-2023 +Copyright (c) React Training 2016-2018 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23503,40 +24069,10 @@ SOFTWARE. ****************************** react-router-dom -5.3.4 -MIT License - -Copyright (c) React Training 2015-2019 -Copyright (c) Remix Software 2020-2022 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -react-router-dom-v5-compat -6.26.2 +5.1.2 MIT License -Copyright (c) React Training LLC 2015-2019 -Copyright (c) Remix Software Inc. 2020-2021 -Copyright (c) Shopify Inc. 2022-2023 +Copyright (c) React Training 2016-2018 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23918,7 +24454,7 @@ SOFTWARE. ****************************** regexp.prototype.flags -1.5.2 +1.5.1 The MIT License (MIT) Copyright (C) 2014 Jordan Harband @@ -23978,35 +24514,6 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -****************************** - -@remix-run/router -1.19.2 -MIT License - -Copyright (c) React Training LLC 2015-2019 -Copyright (c) Remix Software Inc. 2020-2021 -Copyright (c) Shopify Inc. 2022-2023 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ****************************** remove-trailing-slash @@ -24071,11 +24578,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -reselect -3.0.1 +require-from-string +2.0.2 The MIT License (MIT) -Copyright (c) 2015-2016 Reselect Contributors +Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24084,25 +24591,25 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** reselect -4.1.8 +3.0.1 The MIT License (MIT) -Copyright (c) 2015-2018 Reselect Contributors +Copyright (c) 2015-2016 Reselect Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24126,7 +24633,7 @@ SOFTWARE. ****************************** reselect -5.1.1 +4.1.8 The MIT License (MIT) Copyright (c) 2015-2018 Reselect Contributors @@ -24177,6 +24684,21 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +resolve-from +5.0.0 +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ****************************** resolve-pathname @@ -25315,234 +25837,895 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ****************************** rpc-websockets -8.0.1 +7.11.1 Copyright (c) Elpheria j.d.o.o. -rpc-websockets is an Open Source project licensed under the terms of -the LGPLv3 license. Please see -for license text. +rpc-websockets is an Open Source project licensed under the terms of +the LGPLv3 license. Please see +for license text. + +rpc-websockets Pro has a commercial-friendly license allowing private forks +and modifications of rpc-websockets. +Please see https://www.elpheria.com/products/rpc-websockets-pro.html +or email us at info@elpheria.com for more detail. + + +****************************** + +safe-buffer +5.1.2 +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +safe-buffer +5.2.1 +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +safer-buffer +2.1.2 +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +safe-stable-stringify +2.4.3 +The MIT License (MIT) + +Copyright (c) Ruben Bridgewater + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +sax +1.3.0 +The ISC License + +Copyright (c) 2010-2022 Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + +Copyright (c) 2010-2022 Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +scheduler +0.18.0 +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +****************************** + +scrypt-js +3.0.1 +The MIT License (MIT) + +Copyright (c) 2016 Richard Moore + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +****************************** + +@scure/base +1.1.6 +The MIT License (MIT) + +Copyright (c) 2022 Paul Miller (https://paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +@scure/bip32 +1.1.0 +The MIT License (MIT) + +Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +@scure/bip32 +1.3.3 +The MIT License (MIT) + +Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +@scure/bip39 +1.1.0 +The MIT License (MIT) + +Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +@scure/bip39 +1.2.2 +The MIT License (MIT) + +Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +secp256k1 +4.0.2 +The MIT License (MIT) + +Copyright (c) 2014-2016 secp256k1-node contributors + +Parts of this software are based on bn.js, elliptic, hash.js +Copyright (c) 2014-2016 Fedor Indutny + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +secp256k1 +4.0.3 +The MIT License (MIT) + +Copyright (c) 2014-2016 secp256k1-node contributors + +Parts of this software are based on bn.js, elliptic, hash.js +Copyright (c) 2014-2016 Fedor Indutny + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +@segment/loosely-validate-event +2.0.0 <> +The MIT License + +Copyright (c) 2017 Segment.io friends@segment.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +****************************** + +semver +6.3.1 +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +semver +7.5.3 +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +semver +7.6.2 +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +@sentry/browser +7.53.0 +Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sentry/core +7.53.0 +Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sentry/integrations +7.53.0 +Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sentry-internal/tracing +7.53.0 +Copyright (c) 2020 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sentry/replay +7.53.0 +Copyright (c) 2022 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sentry/types +7.53.0 +Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sentry/utils +7.53.0 +Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +ses +1.1.0 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +****************************** + +set-function-length +1.2.1 +MIT License -rpc-websockets Pro has a commercial-friendly license allowing private forks -and modifications of rpc-websockets. -Please see https://www.elpheria.com/products/rpc-websockets-pro.html -or email us at info@elpheria.com for more detail. +Copyright (c) Jordan Harband and contributors +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -****************************** +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -rxjs -7.8.1 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -safe-buffer -5.1.2 -The MIT License (MIT) +set-function-name +2.0.1 +MIT License -Copyright (c) Feross Aboukhadijeh +Copyright (c) Jordan Harband and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25551,25 +26734,56 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -safe-buffer -5.2.1 -The MIT License (MIT) +setimmediate +1.0.5 +Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola -Copyright (c) Feross Aboukhadijeh +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +set-immediate-shim +1.0.1 +license: MIT +authors: Sindre Sorhus + +****************************** + +sha.js +2.4.11 +Copyright (c) 2013-2018 sha.js contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25578,25 +26792,85 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Copyright (c) 1998 - 2009, Paul Johnston & Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +Neither the name of the author nor the names of its contributors may be used to +endorse or promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ****************************** -safer-buffer -2.1.2 +shebang-command +2.0.0 MIT License -Copyright (c) 2018 Nikita Skovoroda +Copyright (c) Kevin Mårtensson (github.com/kevva) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +shebang-regex +3.0.0 +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +side-channel +1.0.4 +MIT License + +Copyright (c) 2019 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25619,11 +26893,90 @@ SOFTWARE. ****************************** -safe-stable-stringify -2.4.3 +signal-exit +3.0.7 +The ISC License + +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +signal-exit +4.0.2 +The ISC License + +Copyright (c) 2015-2023 Benjamin Coe, Isaac Z. Schlueter, and Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +****************************** + +simple-git +3.20.0 +license: MIT +authors: Steve King + +****************************** + +simple-plist +1.4.0 The MIT License (MIT) -Copyright (c) Ruben Bridgewater +Copyright (c) 2013 Joe Wollard + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +@sinclair/typebox +0.31.28 +TypeBox: JSON Schema Type Builder with Static Type Resolution for TypeScript + +The MIT License (MIT) + +Copyright (c) 2017-2023 Haydn Paterson (sinclair) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25632,25 +26985,46 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +****************************** +single-call-balance-checker-abi +1.0.0 <> +license: MIT +authors: Will O'Beirne ****************************** -scheduler -0.18.0 +slash +3.0.0 MIT License -Copyright (c) Facebook, Inc. and its affiliates. +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +slugify +1.6.6 +The MIT License (MIT) + +Copyright (c) Simeon Velichkov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25673,69 +27047,73 @@ SOFTWARE. ****************************** -scheduler -0.23.0 -MIT License +smart-buffer +4.2.0 +The MIT License (MIT) -Copyright (c) Facebook, Inc. and its affiliates. +Copyright (c) 2013-2017 Josh Glazebrook -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -scrypt-js -3.0.1 +socks +2.8.1 The MIT License (MIT) -Copyright (c) 2016 Richard Moore +Copyright (c) 2013 Josh Glazebrook -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +socks-proxy-agent +6.1.1 +license: MIT +authors: Nathan Rajlich (http://n8.io/) ****************************** -@scure/base -1.1.7 +@solana/buffer-layout +4.0.1 The MIT License (MIT) -Copyright (c) 2022 Paul Miller (https://paulmillr.com) +Copyright (c) 2015-2018 Peter A. Bigot Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -25744,7 +27122,7 @@ furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER @@ -25755,68 +27133,189 @@ THE SOFTWARE. ****************************** -@scure/bip32 -1.1.0 -The MIT License (MIT) +@solana/web3.js +1.91.8 +Copyright (c) 2023 Solana Labs, Inc -Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + +****************************** + +space-separated-tokens +1.1.5 +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@scure/bip32 -1.4.0 -The MIT License (MIT) +sprintf-js +1.1.3 +Copyright (c) 2007-present, Alexandru Mărășteanu +All rights reserved. -Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of this software nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +****************************** + +@spruceid/siwe-parser +2.1.0 +license: Apache-2.0 +authors: Spruce Systems Inc. + +****************************** + +stop-iteration-iterator +1.0.0 +MIT License + +Copyright (c) 2023 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@scure/bip39 -1.1.0 +stream-browserify +3.0.0 +MIT License + +Copyright (c) James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +stream-buffers +2.2.0 +license: Unlicense +authors: Sam Day + +****************************** + +stream-splicer +2.0.0 +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +streamx +2.15.1 The MIT License (MIT) -Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) +Copyright (c) 2019 Mathias Buus Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -25825,7 +27324,7 @@ furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER @@ -25836,47 +27335,42 @@ THE SOFTWARE. ****************************** -@scure/bip39 -1.3.0 -The MIT License (MIT) +string_decoder +1.1.1 +Node.js is licensed for use as follows: -Copyright (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) +""" +Copyright Node.js contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -secp256k1 -4.0.4 -The MIT License (MIT) - -Copyright (c) 2014-2016 secp256k1-node contributors +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" -Parts of this software are based on bn.js, elliptic, hash.js -Copyright (c) 2014-2016 Fedor Indutny +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -25886,24 +27380,27 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + ****************************** -@segment/loosely-validate-event -2.0.0 <> -The MIT License +string_decoder +1.3.0 +Node.js is licensed for use as follows: -Copyright (c) 2017 Segment.io friends@segment.com +""" +Copyright Node.js contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -25913,148 +27410,138 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + ****************************** -semver -6.3.1 -The ISC License +string-width +4.2.3 +MIT License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -semver -7.6.3 -The ISC License +string-width +5.1.2 +MIT License -Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@sentry/browser -8.33.1 +strip-ansi +6.0.1 MIT License -Copyright (c) 2019-2024 Functional Software, Inc. dba Sentry +Copyright (c) Sindre Sorhus (sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@sentry/core -8.33.1 +strip-ansi +7.1.0 MIT License -Copyright (c) 2019-2024 Functional Software, Inc. dba Sentry +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@sentry-internal/browser-utils -8.33.1 -MIT License +strip-hex-prefix +1.0.0 +The MIT License -Copyright (c) 2020-2024 Functional Software, Inc. dba Sentry +Copyright (c) 2016 Nick Dodson. nickdodson.com -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -@sentry-internal/feedback -8.33.1 +strnum +1.0.5 MIT License -Copyright (c) 2023-2024 Functional Software, Inc. dba Sentry +Copyright (c) 2021 Natural Intelligence -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -26070,45 +27557,46 @@ SOFTWARE. ****************************** -@sentry-internal/replay -8.33.1 -MIT License - -Copyright (c) 2022-2024 Functional Software, Inc. dba Sentry +style-to-object +0.3.0 +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Copyright (c) 2017 Menglin "Mark" Xu -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@sentry-internal/replay-canvas -8.33.1 -MIT License +sucrase +3.35.0 +The MIT License (MIT) -Copyright (c) 2024 Functional Software, Inc. dba Sentry +Copyright (c) 2012-2018 various contributors (see AUTHORS) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -26124,272 +27612,160 @@ SOFTWARE. ****************************** -@sentry/types -8.33.1 -MIT License +superstruct +0.14.2 +The MIT License -Copyright (c) 2019-2024 Functional Software, Inc. dba Sentry +Copyright © 2017, [Ian Storm Taylor](https://ianstormtaylor.com) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@sentry/utils -8.33.1 -MIT License +superstruct +1.0.3 +The MIT License -Copyright (c) 2019-2024 Functional Software, Inc. dba Sentry +Copyright © 2017, [Ian Storm Taylor](https://ianstormtaylor.com) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -ses -1.1.0 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +supports-color +5.5.0 +MIT License - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) Sindre Sorhus (sindresorhus.com) - 1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +****************************** - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +supports-color +7.1.0 +MIT License - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Copyright (c) Sindre Sorhus (sindresorhus.com) - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +****************************** - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +supports-preserve-symlinks-flag +1.0.0 +MIT License - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +Copyright (c) 2022 Inspect JS - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +****************************** - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +tar-stream +3.1.7 +The MIT License (MIT) - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Copyright (c) 2014 Mathias Buus - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +****************************** - END OF TERMS AND CONDITIONS +text-encoding-utf-8 +1.0.2 +The encoding indexes, algorithms, and many comments in the code +derive from the Encoding Standard https://encoding.spec.whatwg.org/ - APPENDIX: How to apply the Apache License to your work. +Otherwise... - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +This is free and unencumbered software released into the public domain. - Copyright [yyyy] [name of copyright owner] +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. - http://www.apache.org/licenses/LICENSE-2.0 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +For more information, please refer to ****************************** -set-function-length -1.2.2 -MIT License +thenify +3.3.1 -Copyright (c) Jordan Harband and contributors +The MIT License (MIT) + +Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26398,25 +27774,26 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -set-function-name -2.0.2 -MIT License +thenify-all +1.6.0 -Copyright (c) Jordan Harband and contributors +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26425,58 +27802,61 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -setimmediate -1.0.5 -Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola +through +2.3.8 +Apache License, Version 2.0 -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) 2011 Dominic Tarr -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ****************************** -set-immediate-shim -1.0.1 -license: MIT -authors: Sindre Sorhus +through2 +2.0.5 +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ****************************** -sha256-uint8array -0.10.7 +tiny-invariant +1.3.3 MIT License -Copyright (c) 2020-2023 Yusuke Kawasaki +Copyright (c) 2019 Alexander Reardon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26496,12 +27876,13 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ****************************** -sha.js -2.4.11 -Copyright (c) 2013-2018 sha.js contributors +tiny-secp256k1 +1.1.6 +MIT License + +Copyright (c) 2018 bitcoinjs contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26522,43 +27903,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Copyright (c) 1998 - 2009, Paul Johnston & Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of the author nor the names of its contributors may be used to -endorse or promote products derived from this software without specific prior -written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - ****************************** -side-channel -1.0.4 +tiny-warning +1.0.3 MIT License -Copyright (c) 2019 Jordan Harband +Copyright (c) 2019 Alexander Reardon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -26578,646 +27929,567 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +****************************** + +to-data-view +1.1.0 +license: MIT +authors: undefined + +****************************** + +to-fast-properties +2.0.0 +MIT License + +Copyright (c) 2014 Petka Antonov + 2015 Sindre Sorhus + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +toggle-selection +1.0.6 +license: MIT +authors: sudodoki (sudodoki.name) + +****************************** + +tr46 +0.0.3 +license: MIT +authors: Sebastian Mayr + +****************************** + +@trezor/analytics +1.0.16 <> +license: Custom: https://data.trezor.io +authors: undefined + +****************************** + +@trezor/blockchain-link +2.1.28 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) + +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. + +## 1. Definitions + +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. + +"You" means the licensee of the software. + +"Your company" means the company you worked for when you downloaded the +software. + +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -****************************** +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -simple-git -3.20.0 -license: MIT -authors: Steve King +## 2. Grant of Rights -****************************** +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. -@sinclair/typebox -0.31.28 -TypeBox: JSON Schema Type Builder with Static Type Resolution for TypeScript +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -The MIT License (MIT) +## 3. Limitations -Copyright (c) 2017-2023 Haydn Paterson (sinclair) +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. ****************************** -single-call-balance-checker-abi -1.0.0 <> -license: MIT -authors: Will O'Beirne +@trezor/blockchain-link-types +1.0.15 <> +license: UNKNOWN +authors: undefined ****************************** -siwe -2.3.2 -license: Apache-2.0 -authors: Spruce Systems Inc. +@trezor/blockchain-link-utils +1.0.16 <> +license: UNKNOWN +authors: undefined ****************************** -smart-buffer -4.2.0 -The MIT License (MIT) - -Copyright (c) 2013-2017 Josh Glazebrook - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - +@trezor/connect +9.2.2 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -****************************** +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. -socks -2.8.1 -The MIT License (MIT) +## 1. Definitions -Copyright (c) 2013 Josh Glazebrook +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +"You" means the licensee of the software. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +"Your company" means the company you worked for when you downloaded the +software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -****************************** +## 2. Grant of Rights -socks-proxy-agent -6.1.1 -license: MIT -authors: Nathan Rajlich (http://n8.io/) +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. -****************************** +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -@solana/addresses -2.0.0-rc.4 -Copyright (c) 2023 Solana Labs, Inc +## 3. Limitations -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. ****************************** -@solana/assertions -2.0.0-rc.4 -Copyright (c) 2023 Solana Labs, Inc +@trezor/connect-analytics +1.0.14 <> +license: UNKNOWN +authors: undefined -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +****************************** -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +@trezor/connect-common +0.0.31 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. +## 1. Definitions -****************************** +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. -@solana/buffer-layout -4.0.1 -The MIT License (MIT) +"You" means the licensee of the software. -Copyright (c) 2015-2018 Peter A. Bigot +"Your company" means the company you worked for when you downloaded the +software. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +## 2. Grant of Rights +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. -****************************** +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -@solana/codecs-core -2.0.0-rc.4 -Copyright (c) 2023 Solana Labs, Inc +## 3. Limitations -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. ****************************** -@solana/codecs-numbers -2.0.0-rc.4 -Copyright (c) 2023 Solana Labs, Inc - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +@trezor/connect-plugin-ethereum +9.0.3 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## 1. Definitions +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. -****************************** +"You" means the licensee of the software. -@solana/codecs-strings -2.0.0-rc.4 -Copyright (c) 2023 Solana Labs, Inc +"Your company" means the company you worked for when you downloaded the +software. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## 2. Grant of Rights +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. -****************************** +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -@solana/errors -2.0.0-rc.4 -Copyright (c) 2023 Solana Labs, Inc +## 3. Limitations -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. ****************************** -@solana/web3.js -1.95.4 -Copyright (c) 2023 Solana Labs, Inc - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +@trezor/connect-web +9.2.2 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## 1. Definitions +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. -****************************** +"You" means the licensee of the software. -space-separated-tokens -1.1.5 -(The MIT License) +"Your company" means the company you worked for when you downloaded the +software. -Copyright (c) 2016 Titus Wormer +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +## 2. Grant of Rights -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -****************************** +## 3. Limitations -sprintf-js -1.1.3 -Copyright (c) 2007-present, Alexandru Mărășteanu -All rights reserved. +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of this software nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. ****************************** -@spruceid/siwe-parser -2.1.0 -license: Apache-2.0 -authors: Spruce Systems Inc. +@trezor/env-utils +1.0.15 +license: UNKNOWN +authors: undefined ****************************** -@spruceid/siwe-parser -2.1.2 -license: Apache-2.0 -authors: Spruce Systems Inc. +@trezor/protobuf +1.0.11 +license: UNKNOWN +authors: undefined ****************************** -@stablelib/binary -1.0.1 -This software is licensed under the MIT license: - -Copyright (C) 2016 Dmitry Chestnykh - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - +@trezor/protocol +1.0.7 +license: UNKNOWN +authors: undefined ****************************** -@stablelib/int -1.0.1 -This software is licensed under the MIT license: +@trezor/schema-utils +1.0.3 <> +license: Custom: https://github.com/sinclairzx81/typebox +authors: undefined -Copyright (C) 2016 Dmitry Chestnykh +****************************** -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +@trezor/transport +1.1.27 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +## 1. Definitions +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. -****************************** +"You" means the licensee of the software. -@stablelib/random -1.0.2 -This software is licensed under the MIT license: +"Your company" means the company you worked for when you downloaded the +software. -Copyright (C) 2016 Dmitry Chestnykh +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +## 2. Grant of Rights -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -****************************** +## 3. Limitations -@stablelib/wipe -1.0.1 -This software is licensed under the MIT license: +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -Copyright (C) 2016 Dmitry Chestnykh +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +****************************** +@trezor/type-utils +1.0.5 <> +license: UNKNOWN +authors: undefined ****************************** -stop-iteration-iterator -1.0.0 -MIT License +@trezor/utils +9.0.23 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -Copyright (c) 2023 Jordan Harband +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +## 1. Definitions -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +"You" means the licensee of the software. +"Your company" means the company you worked for when you downloaded the +software. -****************************** +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -stream-browserify -3.0.0 -MIT License +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -Copyright (c) James Halliday +## 2. Grant of Rights -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## 3. Limitations + +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. + +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. + +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. ****************************** -stream-splicer -2.0.0 -This software is released under the MIT license: +@trezor/utxo-lib +2.0.8 +# TREZOR REFERENCE SOURCE LICENSE (T-RSL) -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +This license governs use of the accompanying software. If you use the software, +you accept this license. If you do not accept the license, do not use the +software. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +## 1. Definitions -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The terms "reproduce," "reproduction" and "distribution" have the same meaning +here as under U.S. copyright law. +"You" means the licensee of the software. -****************************** +"Your company" means the company you worked for when you downloaded the +software. -streamx -2.15.1 -The MIT License (MIT) +"Reference use" means use of the software within your company as a reference, +in read only form, for the sole purposes of debugging your products, +maintaining your products, or enhancing the interoperability of your products +with the software, and specifically excludes the right to distribute the +software outside of your company. -Copyright (c) 2019 Mathias Buus +"Licensed patents" means any Licensor patent claims which read directly on the +software as distributed by the Licensor under this license. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +## 2. Grant of Rights -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +(A) Copyright Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free copyright +license to reproduce the software for reference use. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +(B) Patent Grant - Subject to the terms of this license, the Licensor grants +you a non-transferable, non-exclusive, worldwide, royalty-free patent license +under licensed patents for reference use. +## 3. Limitations -****************************** +(A) No Trademark License - This license does not grant you any rights to use +the Licensor's name, logo, or trademarks. -string_decoder -1.1.1 -Node.js is licensed for use as follows: +(B) If you begin patent litigation against the Licensor over patents that you +think may apply to the software (including a cross-claim or counterclaim in +a lawsuit), your license to the software ends automatically. -""" -Copyright Node.js contributors. All rights reserved. +(C) The software is licensed "as-is." You bear the risk of using it. The +Licensor gives no express warranties, guarantees or conditions. You may have +additional consumer rights under your local laws which this license cannot +change. To the extent permitted under your local laws, the Licensor excludes +the implied warranties of merchantability, fitness for a particular purpose and +non-infringement. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +****************************** -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" +trough +1.0.1 +(The MIT License) -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: +Copyright (c) 2016 Titus Wormer -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -27227,27 +28499,24 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" - +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -string_decoder -1.3.0 -Node.js is licensed for use as follows: +ts-custom-error +3.3.1 +The MIT License -""" -Copyright Node.js contributors. All rights reserved. +Copyright (c) 2019 Adrien Gibrat https://github.com/adriengibrat Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -27257,101 +28526,259 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: -""" -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +****************************** -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +ts-interface-checker +0.1.13 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -""" + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -****************************** + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -string-width -4.2.3 -MIT License + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Copyright (c) Sindre Sorhus (sindresorhus.com) + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -****************************** + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -strip-ansi -6.0.1 -MIT License + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Copyright (c) Sindre Sorhus (sindresorhus.com) + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ****************************** -strip-hex-prefix -1.0.0 -The MIT License +tslib +1.14.1 +Copyright (c) Microsoft Corporation. -Copyright (c) 2016 Nick Dodson. nickdodson.com +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +****************************** -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +tslib +2.6.2 +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. ****************************** -strnum -1.0.5 +ts-mixer +6.0.4 MIT License -Copyright (c) 2021 Natural Intelligence +Copyright (c) 2024 Tanner Nielsen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -27374,69 +28801,112 @@ SOFTWARE. ****************************** -style-to-object -0.3.0 -The MIT License (MIT) - -Copyright (c) 2017 Menglin "Mark" Xu +tweetnacl +1.0.3 +This is free and unencumbered software released into the public domain. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to ****************************** -superstruct -2.0.2 -The MIT License +tweetnacl-util +0.15.1 +This is free and unencumbered software released into the public domain. -Copyright © 2017, [Ian Storm Taylor](https://ianstormtaylor.com) +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +For more information, please refer to ****************************** -supports-color -5.5.0 -MIT License +typedarray +0.0.6 +/* + Copyright (c) 2010, Linden Research, Inc. + Copyright (c) 2012, Joshua Bell -Copyright (c) Sindre Sorhus (sindresorhus.com) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + $/LicenseInfo$ + */ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// Original can be found at: +// https://bitbucket.org/lindenlab/llsd +// Modifications by Joshua Bell inexorabletash@gmail.com +// https://github.com/inexorabletash/polyfill + +// ES3/ES5 implementation of the Krhonos Typed Array Specification +// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ +// Date: 2011-02-01 +// +// Variations: +// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) ****************************** -supports-color -7.1.0 +type-fest +0.20.2 MIT License -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) Sindre Sorhus (https:/sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -27447,11 +28917,18 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ****************************** -supports-preserve-symlinks-flag -1.0.0 +type-fest +4.15.0 +license: (MIT OR CC0-1.0) +authors: Sindre Sorhus + +****************************** + +typeforce +1.18.0 MIT License -Copyright (c) 2022 Inspect JS +Copyright (c) 2018 Daniel Cousens Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -27474,1316 +28951,1038 @@ SOFTWARE. ****************************** -@swc/core -1.4.11 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +@types/bn.js +5.1.5 + MIT License -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + Copyright (c) Microsoft Corporation. -1. Definitions. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -END OF TERMS AND CONDITIONS + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +****************************** + +@types/color-name +1.1.1 + MIT License -Copyright [yyyy] [name of copyright owner] + Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. ****************************** -@swc/core-linux-x64-gnu -1.4.11 -license: Apache-2.0 AND MIT -authors: 강동윤 +@types/connect +3.4.38 + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + ****************************** -@swc/counter -0.1.3 -license: Apache-2.0 -authors: 강동윤 +@types/debug +4.1.7 + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -****************************** + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -@swc/types -0.1.12 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -1. Definitions. +****************************** - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +@types/deep-freeze-strict +1.1.0 +license: MIT +authors: Mohamed Hegazy -END OF TERMS AND CONDITIONS +****************************** -APPENDIX: How to apply the Apache License to your work. +@types/hast +2.3.1 + MIT License - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. + Copyright (c) Microsoft Corporation. -Copyright [yyyy] [name of copyright owner] + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. - http://www.apache.org/licenses/LICENSE-2.0 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. ****************************** -tar-stream -3.1.7 -The MIT License (MIT) - -Copyright (c) 2014 Mathias Buus +@types/jsonwebtoken +9.0.2 + MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Copyright (c) Microsoft Corporation. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -****************************** + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -text-encoding-utf-8 -1.0.2 -The encoding indexes, algorithms, and many comments in the code -derive from the Encoding Standard https://encoding.spec.whatwg.org/ -Otherwise... +****************************** -This is free and unencumbered software released into the public domain. +@types/lodash +4.14.184 + MIT License -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. + Copyright (c) Microsoft Corporation. -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -For more information, please refer to + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE ****************************** -through -2.3.8 -Apache License, Version 2.0 +@types/mdast +3.0.10 + MIT License -Copyright (c) 2011 Dominic Tarr + Copyright (c) Microsoft Corporation. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE ****************************** -tiny-invariant -1.3.3 -MIT License +@types/ms +0.7.31 + MIT License -Copyright (c) 2019 Alexander Reardon + Copyright (c) Microsoft Corporation. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ****************************** -tiny-secp256k1 -1.1.6 -MIT License +@types/node +12.20.55 + MIT License -Copyright (c) 2018 bitcoinjs contributors + Copyright (c) Microsoft Corporation. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE ****************************** -tiny-warning -1.0.3 -MIT License +@types/node +20.12.7 + MIT License -Copyright (c) 2019 Alexander Reardon + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ****************************** -to-data-view -1.1.0 -license: MIT -authors: undefined +@types/pbkdf2 +3.1.0 + MIT License -****************************** + Copyright (c) Microsoft Corporation. -toggle-selection -1.0.6 -license: MIT -authors: sudodoki (sudodoki.name) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -****************************** + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -tr46 -0.0.3 -license: MIT -authors: Sebastian Mayr ****************************** -@trezor/analytics -1.2.0 <> -license: Custom: https://data.trezor.io -authors: undefined +@types/prop-types +15.7.3 + MIT License -****************************** + Copyright (c) Microsoft Corporation. All rights reserved. -@trezor/blockchain-link -2.3.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -## 1. Definitions + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. -"You" means the licensee of the software. +****************************** -"Your company" means the company you worked for when you downloaded the -software. +@types/punycode +2.1.0 + MIT License -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. + Copyright (c) Microsoft Corporation. All rights reserved. -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -## 2. Grant of Rights + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. -## 3. Limitations +****************************** -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +@types/react +16.9.53 + MIT License -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. + Copyright (c) Microsoft Corporation. -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -****************************** + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -@trezor/blockchain-link-types -1.2.0 <> -license: UNKNOWN -authors: undefined ****************************** -@trezor/blockchain-link-utils -1.2.0 <> -license: UNKNOWN -authors: undefined +@types/react-transition-group +4.4.6 + MIT License -****************************** + Copyright (c) Microsoft Corporation. -@trezor/connect -9.4.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -## 1. Definitions + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. -"You" means the licensee of the software. +****************************** -"Your company" means the company you worked for when you downloaded the -software. +@types/secp256k1 +4.0.3 + MIT License -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. + Copyright (c) Microsoft Corporation. -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -## 2. Grant of Rights + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. -## 3. Limitations +****************************** -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +@types/unist +2.0.6 + MIT License -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. + Copyright (c) Microsoft Corporation. -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -****************************** + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -@trezor/connect-analytics -1.2.0 <> -license: UNKNOWN -authors: undefined ****************************** -@trezor/connect-common -0.2.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) +@types/uuid +8.3.0 + MIT License -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. + Copyright (c) Microsoft Corporation. -## 1. Definitions + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -"You" means the licensee of the software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -"Your company" means the company you worked for when you downloaded the -software. -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. +****************************** -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. +@types/uuid +9.0.8 + MIT License -## 2. Grant of Rights + Copyright (c) Microsoft Corporation. -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -## 3. Limitations + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. +****************************** -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. +@types/w3c-web-usb +1.0.10 + MIT License + Copyright (c) Microsoft Corporation. -****************************** + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -@trezor/connect-plugin-ethereum -9.0.3 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -## 1. Definitions -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. +****************************** -"You" means the licensee of the software. +@types/web +0.0.138 +Apache License -"Your company" means the company you worked for when you downloaded the -software. +Version 2.0, January 2004 -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. +http://www.apache.org/licenses/ -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -## 2. Grant of Rights +1. Definitions. -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. -## 3. Limitations +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). -****************************** +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. -@trezor/connect-web -9.4.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -## 1. Definitions +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -"You" means the licensee of the software. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -"Your company" means the company you worked for when you downloaded the -software. +You must give any other recipients of the Work or Derivative Works a copy of this License; and -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. +You must cause any modified files to carry prominent notices stating that You changed the files; and -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -## 2. Grant of Rights +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -## 3. Limitations +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. +END OF TERMS AND CONDITIONS ****************************** -@trezor/env-utils -1.2.0 -license: UNKNOWN -authors: undefined - -****************************** +@types/ws +7.4.7 + MIT License -@trezor/protobuf -1.2.0 -license: Custom: https://github.com/trezor/trezor-firmware/tree/main/common/protob -authors: undefined + Copyright (c) Microsoft Corporation. -****************************** + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -@trezor/protocol -1.2.0 -license: UNKNOWN -authors: undefined + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -****************************** + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE -@trezor/schema-utils -1.2.0 <> -license: Custom: https://github.com/sinclairzx81/typebox -authors: undefined ****************************** -@trezor/transport -1.3.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) +ua-parser-js +1.0.37 +MIT License + +Copyright (c) 2012-2023 Faisal Salman <> -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -## 1. Definitions +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -"You" means the licensee of the software. -"Your company" means the company you worked for when you downloaded the -software. +****************************** -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. +uint8arrays +2.1.5 +license: MIT +authors: Alex Potsides -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. +****************************** -## 2. Grant of Rights +uint8arrays +3.1.1 +license: MIT +authors: Alex Potsides -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. +****************************** -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. +undici +5.28.4 +MIT License -## 3. Limitations +Copyright (c) Matteo Collina and Undici contributors -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@trezor/type-utils -1.1.0 <> -license: UNKNOWN -authors: undefined +undici-types +5.26.5 +license: MIT +authors: Daniele Belardi , Ethan Arrowood , Matteo Collina , Matthew Aitken , Robert Nagy , Szymon Marczak , Tomas Della Vedova ****************************** -@trezor/utils -9.2.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) - -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. +unicode-confusables +0.1.1 <> +MIT License -## 1. Definitions +Copyright (c) 2020 Ty -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -"You" means the licensee of the software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -"Your company" means the company you worked for when you downloaded the -software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. +****************************** -## 2. Grant of Rights +unified +9.2.0 +(The MIT License) -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. +Copyright (c) 2015 Titus Wormer -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -## 3. Limitations +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. +****************************** +unist-builder +2.0.3 +The MIT License (MIT) -****************************** +Copyright (c) 2015 Eugene Sharygin -@trezor/utxo-lib -2.2.0 -# TREZOR REFERENCE SOURCE LICENSE (T-RSL) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -## 1. Definitions +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -The terms "reproduce," "reproduction" and "distribution" have the same meaning -here as under U.S. copyright law. -"You" means the licensee of the software. +****************************** -"Your company" means the company you worked for when you downloaded the -software. +unist-util-generated +1.1.6 +(The MIT License) -"Reference use" means use of the software within your company as a reference, -in read only form, for the sole purposes of debugging your products, -maintaining your products, or enhancing the interoperability of your products -with the software, and specifically excludes the right to distribute the -software outside of your company. +Copyright (c) 2016 Titus Wormer -"Licensed patents" means any Licensor patent claims which read directly on the -software as distributed by the Licensor under this license. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -## 2. Grant of Rights +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -(A) Copyright Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free copyright -license to reproduce the software for reference use. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -(B) Patent Grant - Subject to the terms of this license, the Licensor grants -you a non-transferable, non-exclusive, worldwide, royalty-free patent license -under licensed patents for reference use. -## 3. Limitations +****************************** -(A) No Trademark License - This license does not grant you any rights to use -the Licensor's name, logo, or trademarks. +unist-util-is +4.0.2 +(The MIT license) -(B) If you begin patent litigation against the Licensor over patents that you -think may apply to the software (including a cross-claim or counterclaim in -a lawsuit), your license to the software ends automatically. +Copyright (c) 2015 Titus Wormer -(C) The software is licensed "as-is." You bear the risk of using it. The -Licensor gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the Licensor excludes -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -trough -1.0.1 +unist-util-position +3.1.0 (The MIT License) -Copyright (c) 2016 Titus Wormer +Copyright (c) 2015 Titus Wormer -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -ts-custom-error -3.3.1 -The MIT License +unist-util-stringify-position +2.0.1 +(The MIT License) -Copyright (c) 2019 Adrien Gibrat https://github.com/adriengibrat +Copyright (c) 2016 Titus Wormer -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -tslib -2.4.0 -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. +unist-util-visit +2.0.3 +(The MIT License) -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. +Copyright (c) 2015 Titus Wormer -****************************** +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -tslib -2.6.2 -Copyright (c) Microsoft Corporation. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. ****************************** -ts-mixer -6.0.4 -MIT License +unist-util-visit-parents +3.1.0 +(The MIT License) -Copyright (c) 2024 Tanner Nielsen +Copyright (c) 2016 Titus Wormer -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -tweetnacl -1.0.3 -This is free and unencumbered software released into the public domain. +update-browserslist-db +1.0.13 +The MIT License (MIT) -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. +Copyright 2022 Andrey Sitnik and other contributors -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -For more information, please refer to +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -typedarray -0.0.6 -/* - Copyright (c) 2010, Linden Research, Inc. - Copyright (c) 2012, Joshua Bell - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +uri-js +4.4.1 +Copyright 2011 Gary Court. All rights reserved. - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - $/LicenseInfo$ - */ +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -// Original can be found at: -// https://bitbucket.org/lindenlab/llsd -// Modifications by Joshua Bell inexorabletash@gmail.com -// https://github.com/inexorabletash/polyfill +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -// ES3/ES5 implementation of the Krhonos Typed Array Specification -// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ -// Date: 2011-02-01 -// -// Variations: -// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) +THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. -****************************** -type-fest -0.20.2 -MIT License +****************************** -Copyright (c) Sindre Sorhus (https:/sindresorhus.com) +usb +2.12.0 +Copyright (c) 2012 Nonolith Labs, LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: @@ -28791,14 +29990,13 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ****************************** -typeforce -1.18.0 +use-callback-ref +1.3.0 MIT License -Copyright (c) 2018 Daniel Cousens +Copyright (c) 2017 Anton Korzunov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -28821,1263 +30019,1258 @@ SOFTWARE. ****************************** -@types/bn.js -5.1.5 - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - -****************************** - -@types/color-name -1.1.1 - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - -****************************** - -@types/connect -3.4.38 - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - -****************************** - -@types/debug -4.1.7 - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - - -****************************** - -@types/deep-freeze-strict -1.1.0 -license: MIT -authors: Mohamed Hegazy - -****************************** - -@types/hast -2.3.1 - MIT License - - Copyright (c) Microsoft Corporation. +use-memo-one +1.1.3 +MIT License - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Copyright (c) 2019 Alexander Reardon - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@types/hoist-non-react-statics -3.3.1 - MIT License +use-sidecar +1.1.2 +MIT License - Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) 2017 Anton Korzunov - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@types/jsonwebtoken -9.0.2 - MIT License - - Copyright (c) Microsoft Corporation. +utf8 +3.0.0 +Copyright Mathias Bynens - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@types/lodash -4.17.0 - MIT License +utf-8-validate +5.0.10 +This project is licensed for use as follows: - Copyright (c) Microsoft Corporation. +""" +Copyright (c) 2011 Einar Otto Stangvik (http://2x.io) - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" +This license applies to parts originating from +https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c: -****************************** +""" +Markus Kuhn -- 2005-03-30 +License: http://www.cl.cam.ac.uk/~mgk25/short-license.html +""" -@types/mdast -3.0.10 - MIT License - Copyright (c) Microsoft Corporation. +****************************** - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +util +0.12.5 +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. ****************************** -@types/ms -0.7.31 - MIT License +util-deprecate +1.0.2 +(The MIT License) - Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) 2014 Nathan Rajlich - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. ****************************** -@types/node -12.20.55 - MIT License +uuid +7.0.3 +The MIT License (MIT) - Copyright (c) Microsoft Corporation. +Copyright (c) 2010-2016 Robert Kieffer and other contributors - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@types/node -18.15.13 - MIT License +uuid +8.3.2 +The MIT License (MIT) - Copyright (c) Microsoft Corporation. +Copyright (c) 2010-2020 Robert Kieffer and other contributors - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@types/node -20.16.11 - MIT License +uuid +9.0.1 +The MIT License (MIT) - Copyright (c) Microsoft Corporation. +Copyright (c) 2010-2020 Robert Kieffer and other contributors - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@types/pbkdf2 -3.1.0 - MIT License - - Copyright (c) Microsoft Corporation. +validate-npm-package-name +5.0.0 +Copyright (c) 2015, npm, Inc - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** -@types/prop-types -15.7.3 - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. +valid-url +1.0.9 +Copyright (c) 2013 Odysseas Tsatalos and oDesk Corporation - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@types/punycode -2.1.0 - MIT License +value-equal +1.0.1 +MIT License - Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Michael Jackson 2016-2018 - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@types/react -16.9.53 - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +varint +5.0.2 +license: MIT +authors: Chris Dickinson - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +****************************** +varint +6.0.0 +license: MIT +authors: Chris Dickinson ****************************** -@types/react-redux -7.1.33 - MIT License +varuint-bitcoin +1.1.2 +The MIT License (MIT) - Copyright (c) Microsoft Corporation. +Copyright (c) 2016 Kirill Fomichev - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Parts of this software are based on https://github.com/mappum/bitcoin-protocol +Copyright (c) 2016 Matt Bell - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -@types/react-transition-group -4.4.6 - MIT License +vfile +4.0.1 +(The MIT License) - Copyright (c) Microsoft Corporation. +Copyright (c) 2015 Titus Wormer - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -@types/secp256k1 -4.0.3 - MIT License +vfile-message +2.0.1 +(The MIT License) - Copyright (c) Microsoft Corporation. +Copyright (c) 2017 Titus Wormer - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -@types/unist -2.0.6 - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +warning +3.0.0 +BSD License +For React software -****************************** +Copyright (c) 2013-2015, Facebook, Inc. +All rights reserved. -@types/uuid -8.3.0 - MIT License +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: - Copyright (c) Microsoft Corporation. + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** -@types/uuid -9.0.8 - MIT License +warning +4.0.3 +MIT License - Copyright (c) Microsoft Corporation. +Copyright (c) 2013-present, Facebook, Inc. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -@types/w3c-web-usb -1.0.10 - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE - +web3-stream-provider +5.0.0 +license: ISC +authors: kumavis ****************************** -@types/web -0.0.138 -Apache License +web-encoding +1.1.5 <> +license: MIT +authors: Irakli Gozalishvili -Version 2.0, January 2004 +****************************** -http://www.apache.org/licenses/ +webextension-polyfill +0.10.0 +Mozilla Public License Version 2.0 +================================== -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions +-------------- -1. Definitions. +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +1.3. "Contribution" + means Covered Software of a particular Contributor. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +1.5. "Incompatible With Secondary Licenses" + means -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +1.6. "Executable Form" + means any form of the work other than Source Code Form. -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +1.8. "License" + means this document. -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +1.10. "Modifications" + means any of the following: -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + (b) any new file in Source Code Form that contains any Covered + Software. -You must give any other recipients of the Work or Derivative Works a copy of this License; and +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. -You must cause any modified files to carry prominent notices stating that You changed the files; and +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +1.13. "Source Code Form" + means the form of the work preferred for making modifications. -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +2. License Grants and Conditions +-------------------------------- -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +2.1. Grants -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. -END OF TERMS AND CONDITIONS +2.2. Effective Date +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. -****************************** +2.3. Limitations on Grant Scope -@types/ws -7.4.7 - MIT License +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: - Copyright (c) Microsoft Corporation. +(a) for any code that a Contributor has removed from Covered Software; + or - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). +2.4. Subsequent Licenses -****************************** +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). -ua-parser-js -1.0.37 -MIT License +2.5. Representation -Copyright (c) 2012-2023 Faisal Salman <> +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +2.6. Fair Use -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +2.7. Conditions +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. -****************************** +3. Responsibilities +------------------- -uint8arrays -2.1.5 -license: MIT -authors: Alex Potsides +3.1. Distribution of Source Form -****************************** +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. -uint8arrays -3.1.1 -license: MIT -authors: Alex Potsides +3.2. Distribution of Executable Form -****************************** +If You distribute Covered Software in Executable Form then: -undici -5.28.4 -MIT License +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and -Copyright (c) Matteo Collina and Undici contributors +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +3.3. Distribution of a Larger Work -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +3.4. Notices +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. -****************************** +3.5. Application of Additional Terms -undici-types -6.19.8 -MIT License +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. -Copyright (c) Matteo Collina and Undici contributors +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +5. Termination +-------------- -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. -****************************** +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. -unicode-confusables -0.1.1 <> -MIT License +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ -Copyright (c) 2020 Ty +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +8. Litigation +------------- -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +9. Miscellaneous +---------------- +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. -****************************** +10. Versions of the License +--------------------------- -unified -9.2.0 -(The MIT License) +10.1. New Versions -Copyright (c) 2015 Titus Wormer +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +10.2. Effect of New Versions -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +10.3. Modified Versions +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). -****************************** +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses -unist-builder -2.0.3 -The MIT License (MIT) +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. -Copyright (c) 2015 Eugene Sharygin +Exhibit A - Source Code Form License Notice +------------------------------------------- -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +You may add additional accurate notices of copyright ownership. +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- -****************************** + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. -unist-util-generated -1.1.6 -(The MIT License) -Copyright (c) 2016 Titus Wormer +****************************** -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +webextension-polyfill +0.8.0 +Mozilla Public License Version 2.0 +================================== -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +1. Definitions +-------------- -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. -****************************** +1.3. "Contribution" + means Covered Software of a particular Contributor. -unist-util-is -4.0.2 -(The MIT license) +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. -Copyright (c) 2015 Titus Wormer +1.5. "Incompatible With Secondary Licenses" + means -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +1.6. "Executable Form" + means any form of the work other than Source Code Form. +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. -****************************** +1.8. "License" + means this document. -unist-util-position -3.1.0 -(The MIT License) +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. -Copyright (c) 2015 Titus Wormer +1.10. "Modifications" + means any of the following: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + (b) any new file in Source Code Form that contains any Covered + Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. -****************************** +1.13. "Source Code Form" + means the form of the work preferred for making modifications. -unist-util-stringify-position -2.0.1 -(The MIT License) +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. -Copyright (c) 2016 Titus Wormer +2. License Grants and Conditions +-------------------------------- -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +2.1. Grants -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. -****************************** +2.2. Effective Date -unist-util-visit -2.0.3 -(The MIT License) +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. -Copyright (c) 2015 Titus Wormer +2.3. Limitations on Grant Scope -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +(a) for any code that a Contributor has removed from Covered Software; + or -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. -****************************** +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). -unist-util-visit-parents -3.1.0 -(The MIT License) +2.4. Subsequent Licenses -Copyright (c) 2016 Titus Wormer +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +2.5. Representation -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +2.6. Fair Use +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. -****************************** +2.7. Conditions -update-browserslist-db -1.1.1 -The MIT License (MIT) +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. -Copyright 2022 Andrey Sitnik and other contributors +3. Responsibilities +------------------- -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +3.1. Distribution of Source Form -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +3.2. Distribution of Executable Form +If You distribute Covered Software in Executable Form then: -****************************** +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and -uri-js -4.4.1 -Copyright 2011 Gary Court. All rights reserved. +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +3.3. Distribution of a Larger Work -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3.4. Notices -THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. -The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. +3.5. Application of Additional Terms +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. -****************************** +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- -usb -2.12.0 -Copyright (c) 2012 Nonolith Labs, LLC +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +5. Termination +-------------- -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. -****************************** +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. -use-callback-ref -1.3.0 -MIT License +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ -Copyright (c) 2017 Anton Korzunov +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +8. Litigation +------------- -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +9. Miscellaneous +---------------- +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. -****************************** +10. Versions of the License +--------------------------- -use-memo-one -1.1.3 -MIT License +10.1. New Versions -Copyright (c) 2019 Alexander Reardon +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +10.2. Effect of New Versions -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses -****************************** +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. -use-sidecar -1.1.2 -MIT License +Exhibit A - Source Code Form License Notice +------------------------------------------- -Copyright (c) 2017 Anton Korzunov + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +You may add additional accurate notices of copyright ownership. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. ****************************** -utf8 -3.0.0 -Copyright Mathias Bynens +webidl-conversions +3.0.1 +# The BSD 2-Clause License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) 2014, Domenic Denicola +All rights reserved. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** -utf-8-validate -5.0.10 -This project is licensed for use as follows: +websocket-driver +0.7.0 +# The MIT License -""" -Copyright (c) 2011 Einar Otto Stangvik (http://2x.io) +Copyright (c) 2010-2017 James Coglan Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in +this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, @@ -30086,84 +31279,39 @@ subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -""" - -This license applies to parts originating from -https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c: - -""" -Markus Kuhn -- 2005-03-30 -License: http://www.cl.cam.ac.uk/~mgk25/short-license.html -""" - - -****************************** - -util -0.12.5 -Copyright Joyent, Inc. and other Node contributors. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. ****************************** -util-deprecate -1.0.2 -(The MIT License) - -Copyright (c) 2014 Nathan Rajlich +websocket-extensions +0.1.4 +Copyright 2014-2020 James Coglan -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. ****************************** -utility-types -3.11.0 -MIT License +whatwg-url +5.0.0 +The MIT License (MIT) -Copyright (c) 2016 Piotr Witek (http://piotrwitek.github.io) +Copyright (c) 2015–2016 Sebastian Mayr Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30172,93 +31320,46 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -uuid -8.3.2 -The MIT License (MIT) - -Copyright (c) 2010-2020 Robert Kieffer and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -****************************** - -uuid -9.0.1 -The MIT License (MIT) - -Copyright (c) 2010-2020 Robert Kieffer and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -****************************** - -validate-npm-package-name -5.0.0 -Copyright (c) 2015, npm, Inc - - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -valid-url -1.0.9 -Copyright (c) 2013 Odysseas Tsatalos and oDesk Corporation +which +2.0.2 +The ISC License -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Copyright (c) Isaac Z. Schlueter and Contributors -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** -value-equal -1.0.1 +which-boxed-primitive +1.0.2 MIT License -Copyright (c) Michael Jackson 2016-2018 +Copyright (c) 2019 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30281,28 +31382,11 @@ SOFTWARE. ****************************** -varint -5.0.2 -license: MIT -authors: Chris Dickinson - -****************************** - -varint -6.0.0 -license: MIT -authors: Chris Dickinson - -****************************** - -varuint-bitcoin -1.1.2 -The MIT License (MIT) - -Copyright (c) 2016 Kirill Fomichev +which-collection +1.0.1 +MIT License -Parts of this software are based on https://github.com/mappum/bitcoin-protocol -Copyright (c) 2016 Matt Bell +Copyright (c) 2019 Inspect JS Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30311,25 +31395,25 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** -vfile -4.0.1 -(The MIT License) +which-typed-array +1.1.9 +The MIT License (MIT) -Copyright (c) 2015 Titus Wormer +Copyright (c) 2015 Jordan Harband Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30338,90 +31422,26 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -****************************** - -vfile-message -2.0.1 -(The MIT License) - -Copyright (c) 2017 Titus Wormer - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -****************************** - -warning -3.0.0 -BSD License - -For React software - -Copyright (c) 2013-2015, Facebook, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** -warning -4.0.3 -MIT License +wif +4.0.0 +The MIT License (MIT) -Copyright (c) 2013-present, Facebook, Inc. +Copyright (c) 2015 Daniel Cousens Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30444,492 +31464,367 @@ SOFTWARE. ****************************** -web3-stream-provider -5.0.0 -license: ISC -authors: kumavis - -****************************** - -web-encoding -1.1.5 <> -license: MIT -authors: Irakli Gozalishvili - -****************************** - -webextension-polyfill -0.12.0 -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). +wrap-ansi +7.0.0 +MIT License -2.5. Representation +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -2.6. Fair Use +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -2.7. Conditions -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. +****************************** -3. Responsibilities -------------------- +wrap-ansi +8.1.0 +MIT License -3.1. Distribution of Source Form +Copyright (c) Sindre Sorhus (https://sindresorhus.com) -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -3.2. Distribution of Executable Form +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -If You distribute Covered Software in Executable Form then: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. +****************************** -3.3. Distribution of a Larger Work +wrappy +1.0.2 +The ISC License -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). +Copyright (c) Isaac Z. Schlueter and Contributors -3.4. Notices +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -3.5. Application of Additional Terms -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. +****************************** -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- +write-file-atomic +2.4.3 +Copyright (c) 2015, Rebecca Turner -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. -5. Termination --------------- +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. +****************************** -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ +ws +7.4.6 +The MIT License (MIT) -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ +Copyright (c) 2011 Einar Otto Stangvik -8. Litigation -------------- +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -9. Miscellaneous ----------------- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. -10. Versions of the License ---------------------------- +****************************** -10.1. New Versions +ws +7.5.9 +The MIT License (MIT) -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. +Copyright (c) 2011 Einar Otto Stangvik -10.2. Effect of New Versions +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -10.3. Modified Versions +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses +****************************** -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. +ws +8.16.0 +Copyright (c) 2011 Einar Otto Stangvik +Copyright (c) 2013 Arnout Kazemier and contributors +Copyright (c) 2016 Luigi Pinca and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Exhibit A - Source Code Form License Notice -------------------------------------------- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. +****************************** -You may add additional accurate notices of copyright ownership. +xcode +3.0.1 -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. -****************************** + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -webidl-conversions -3.0.1 -# The BSD 2-Clause License + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Copyright (c) 2014, Domenic Denicola -All rights reserved. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -****************************** + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -websocket-driver -0.7.4 -Copyright 2010-2020 James Coglan + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - http://www.apache.org/licenses/LICENSE-2.0 + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -****************************** + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -websocket-extensions -0.1.4 -Copyright 2014-2020 James Coglan + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - http://www.apache.org/licenses/LICENSE-2.0 + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -****************************** + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -whatwg-url -5.0.0 -The MIT License (MIT) + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Copyright (c) 2015–2016 Sebastian Mayr + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + END OF TERMS AND CONDITIONS -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + APPENDIX: How to apply the Apache License to your work. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] -****************************** + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -which-boxed-primitive -1.0.2 -MIT License + http://www.apache.org/licenses/LICENSE-2.0 -Copyright (c) 2019 Jordan Harband + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + +****************************** + +xhr2 +0.2.1 +Copyright (c) 2013 Victor Costan + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -30945,38 +31840,64 @@ SOFTWARE. ****************************** -which-collection -1.0.1 -MIT License +xml +1.0.1 +(The MIT License) -Copyright (c) 2019 Inspect JS +Copyright (c) 2011-2016 Dylan Greene + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +xml2js +0.6.0 +Copyright 2010, 2011, 2012, 2013. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. ****************************** -which-typed-array -1.1.15 +xmlbuilder +11.0.1 The MIT License (MIT) -Copyright (c) 2015 Jordan Harband +Copyright (c) 2013 Ozgur Ozcitak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30985,26 +31906,25 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -wif -4.0.0 +xmlbuilder +14.0.0 The MIT License (MIT) -Copyright (c) 2015 Daniel Cousens +Copyright (c) 2013 Ozgur Ozcitak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -31013,61 +31933,25 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -wrap-ansi -7.0.0 -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -****************************** - -wrappy -1.0.2 -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -ws -7.5.10 +xmlbuilder +15.1.1 The MIT License (MIT) -Copyright (c) 2011 Einar Otto Stangvik +Copyright (c) 2013 Ozgur Ozcitak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -31076,121 +31960,44 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -****************************** - -ws -8.17.1 -Copyright (c) 2011 Einar Otto Stangvik -Copyright (c) 2013 Arnout Kazemier and contributors -Copyright (c) 2016 Luigi Pinca and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -****************************** - -ws -8.18.0 -Copyright (c) 2011 Einar Otto Stangvik -Copyright (c) 2013 Arnout Kazemier and contributors -Copyright (c) 2016 Luigi Pinca and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** -xhr2 -0.2.1 -Copyright (c) 2013 Victor Costan +@xmldom/xmldom +0.7.13 +Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors +Copyright 2012 - 2017 @jindw and other contributors, as listed in: https://github.com/jindw/xmldom/graphs/contributors -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** -xml -1.0.1 -(The MIT License) - -Copyright (c) 2011-2016 Dylan Greene +@xmldom/xmldom +0.8.10 +Copyright 2019 - present Christopher J. Brody and other contributors, as listed in: https://github.com/xmldom/xmldom/graphs/contributors +Copyright 2012 - 2017 @jindw and other contributors, as listed in: https://github.com/jindw/xmldom/graphs/contributors -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @@ -31287,6 +32094,27 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +yallist +4.0.0 +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ****************************** yargs @@ -31334,10 +32162,25 @@ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +****************************** + +yocto-queue +0.1.0 +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ****************************** zod -3.23.8 +3.22.4 MIT License Copyright (c) 2020 Colin McDonnell diff --git a/builds.yml b/builds.yml index 5bbe17480496..e8c7f5a28d93 100644 --- a/builds.yml +++ b/builds.yml @@ -64,6 +64,7 @@ buildTypes: features: - build-flask - keyring-snaps + - solana env: - INFURA_FLASK_PROJECT_ID - SEGMENT_FLASK_WRITE_KEY @@ -276,8 +277,6 @@ env: - NODE_DEBUG: '' # Used by react-devtools-core - EDITOR_URL: '' - # Determines if feature flagged Multichain Transactions should be used - - TRANSACTION_MULTICHAIN: '' # Determines if Barad Dur features should be used - BARAD_DUR: '' # Determines if feature flagged Chain permissions diff --git a/coverage.json b/coverage.json index 9887e06e2db6..6035036ba23b 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{ "coverage": 71 } +{ "coverage": 72 } diff --git a/development/build/README.md b/development/build/README.md index 9d5df1e149fc..3aecead0cb25 100644 --- a/development/build/README.md +++ b/development/build/README.md @@ -4,7 +4,7 @@ > Add `--build-type flask` to build Flask, our canary distribution with more experimental features. This directory contains the MetaMask build system, which is used to build the MetaMask Extension such that it can be used in a supported browser. -From the repository root, the build system entry file is located at [`./development/build/index.js`](https://github.com/MetaMask/metamask-extension/blob/develop/development/build/index.js). +From the repository root, the build system entry file is located at [`./development/build/index.js`](https://github.com/MetaMask/metamask-extension/blob/main/development/build/index.js). Several package scripts invoke the build system. For example, `yarn start` creates a watched development build, and `yarn dist` creates a production build. @@ -20,7 +20,7 @@ are written to the `./dist` directory. Our JavaScript source files are transformed using [Babel](https://babeljs.io/), specifically using the [`babelify`](https://npmjs.com/package/babelify) Browserify transform. -Source file bundling tasks are implemented in the [`./development/build/scripts.js`](https://github.com/MetaMask/metamask-extension/blob/develop/development/build/scripts.js). +Source file bundling tasks are implemented in the [`./development/build/scripts.js`](https://github.com/MetaMask/metamask-extension/blob/main/development/build/scripts.js). > Locally implemented Browserify transforms, _some of which affect how we write JavaScript_, are listed and documented [here](./transforms/README.md). diff --git a/development/build/task.js b/development/build/task.js index cbbc1ea22578..edb1b6761cd8 100644 --- a/development/build/task.js +++ b/development/build/task.js @@ -1,5 +1,5 @@ const EventEmitter = require('events'); -const spawn = require('cross-spawn'); +const { spawn } = require('node:child_process'); const tasks = {}; const taskEvents = new EventEmitter(); @@ -84,6 +84,7 @@ function runInChildProcess( ], { env: process.env, + shell: true, }, ); diff --git a/development/build/utils.js b/development/build/utils.js index 626aacd588c7..301c998534ad 100644 --- a/development/build/utils.js +++ b/development/build/utils.js @@ -130,7 +130,7 @@ function getEnvironment({ buildTarget }) { /^Version-v(\d+)[.](\d+)[.](\d+)/u.test(process.env.CIRCLE_BRANCH) ) { return ENVIRONMENT.RELEASE_CANDIDATE; - } else if (process.env.CIRCLE_BRANCH === 'develop') { + } else if (process.env.CIRCLE_BRANCH === 'main') { return ENVIRONMENT.STAGING; } else if (process.env.CIRCLE_PULL_REQUEST) { return ENVIRONMENT.PULL_REQUEST; diff --git a/development/fitness-functions/rules/index.ts b/development/fitness-functions/rules/index.ts index 6ba0f1198684..5afb72fa5343 100644 --- a/development/fitness-functions/rules/index.ts +++ b/development/fitness-functions/rules/index.ts @@ -6,7 +6,7 @@ const RULES: IRule[] = [ name: "Don't use `sinon` or `assert` in unit tests", fn: preventSinonAssertSyntax, errorMessage: - '`sinon` or `assert` was detected in the diff. Please use Jest instead. For more info: https://github.com/MetaMask/metamask-extension/blob/develop/docs/testing.md#favor-jest-instead-of-mocha', + '`sinon` or `assert` was detected in the diff. Please use Jest instead. For more info: https://github.com/MetaMask/metamask-extension/blob/main/docs/testing.md#favor-jest-instead-of-mocha', }, { name: "Don't add JS or JSX files", diff --git a/development/highlights/index.js b/development/highlights/index.js index 2b263005fb96..2616d602633e 100644 --- a/development/highlights/index.js +++ b/development/highlights/index.js @@ -6,11 +6,11 @@ module.exports = { getHighlights }; async function getHighlights({ artifactBase }) { let highlights = ''; - // here we assume the PR base branch ("target") is `develop` in lieu of doing + // here we assume the PR base branch ("target") is `main` in lieu of doing // a query against the github api which requires an access token // see https://discuss.circleci.com/t/how-to-retrieve-a-pull-requests-base-branch-name-github/36911 - const changedFiles = await getChangedFiles({ target: 'develop' }); - console.log(`detected changed files vs develop:`); + const changedFiles = await getChangedFiles({ target: 'main' }); + console.log(`detected changed files vs main:`); for (const filename of changedFiles) { console.log(` ${filename}`); } diff --git a/development/lib/get-manifest-flag.ts b/development/lib/get-manifest-flag.ts new file mode 100644 index 000000000000..225b3a05121c --- /dev/null +++ b/development/lib/get-manifest-flag.ts @@ -0,0 +1,101 @@ +import path from 'node:path'; +import fs from 'node:fs/promises'; +import { promisify } from 'node:util'; +import { exec as callbackExec } from 'node:child_process'; + +import { hasProperty } from '@metamask/utils'; +import { merge } from 'lodash'; + +import type { ManifestFlags } from '../../app/scripts/lib/manifestFlags'; + +const exec = promisify(callbackExec); +const PR_BODY_FILEPATH = path.resolve( + __dirname, + '..', + '..', + 'changed-files', + 'pr-body.txt', +); + +/** + * Search a string for `flags = {...}` and return ManifestFlags if it exists + * + * @param str - The string to search + * @param errorType - The type of error to log if parsing fails + * @returns The ManifestFlags object if valid, otherwise undefined + */ +function regexSearchForFlags(str: string, errorType: string): ManifestFlags { + // Search str for `flags = {...}` + const flagsMatch = str.match(/flags\s*=\s*(\{.*\})/u); + + if (flagsMatch) { + try { + // Get 1st capturing group from regex + return JSON.parse(flagsMatch[1]); + } catch (error) { + console.error( + `Error parsing flags from ${errorType}, ignoring flags\n`, + error, + ); + } + } + + return {}; +} + +/** + * Get flags from the GitHub PR body if they are set + * + * To use this feature, add a line to your PR body like: + * `flags = {"sentry": {"tracesSampleRate": 0.1}}` + * (must be valid JSON) + * + * @returns Any manifest flags found in the PR body + */ +async function getFlagsFromPrBody(): Promise { + let body: string; + try { + body = await fs.readFile(PR_BODY_FILEPATH, 'utf8'); + } catch (error) { + if ( + error instanceof Error && + hasProperty(error, 'code') && + error.code === 'ENOENT' + ) { + return {}; + } + throw error; + } + + return regexSearchForFlags(body, 'PR body'); +} + +/** + * Get flags from the Git message if they are set + * + * To use this feature, add a line to your commit message like: + * `flags = {"sentry": {"tracesSampleRate": 0.1}}` + * (must be valid JSON) + * + * @returns Any manifest flags found in the commit message + */ +async function getFlagsFromGitMessage(): Promise { + const gitMessage = (await exec(`git show --format='%B' --no-patch "HEAD"`)) + .stdout; + + return regexSearchForFlags(gitMessage, 'git message'); +} + +/** + * Get any manifest flags found in the PR body and git message. + * + * @returns Any manifest flags found + */ +export async function fetchManifestFlagsFromPRAndGit(): Promise { + const [prBodyFlags, gitMessageFlags] = await Promise.all([ + getFlagsFromPrBody(), + getFlagsFromGitMessage(), + ]); + + return merge(prBodyFlags, gitMessageFlags); +} diff --git a/development/lib/run-command.js b/development/lib/run-command.js index 62fe2284ea6d..12e917eb128b 100644 --- a/development/lib/run-command.js +++ b/development/lib/run-command.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const spawn = require('cross-spawn'); +const { spawn } = require('node:child_process'); /** * Run a command to completion using the system shell. diff --git a/development/master-sync.js b/development/master-sync.js index 548ae6611c2f..dc1d474eaebe 100644 --- a/development/master-sync.js +++ b/development/master-sync.js @@ -51,8 +51,8 @@ async function runGitCommands() { console.log('Executed: git reset --hard origin/master'); try { - await exec('git merge origin/develop'); - console.log('Executed: git merge origin/develop'); + await exec('git merge origin/main'); + console.log('Executed: git merge origin/main'); } catch (error) { // Handle the error but continue script execution if ( @@ -70,11 +70,11 @@ async function runGitCommands() { } await exec('git add .'); - await exec('git restore --source origin/develop .'); - console.log('Executed: it restore --source origin/develop .'); + await exec('git restore --source origin/main .'); + console.log('Executed: it restore --source origin/main .'); - await exec('git checkout origin/develop -- .'); - console.log('Executed: git checkout origin/develop -- .'); + await exec('git checkout origin/main -- .'); + console.log('Executed: git checkout origin/main -- .'); await exec('git checkout origin/master -- CHANGELOG.md'); console.log('Executed: git checkout origin/master -- CHANGELOG.md'); @@ -91,7 +91,7 @@ async function runGitCommands() { await exec('git add .'); console.log('Executed: git add .'); - await exec('git commit -m "Merge origin/develop into master-sync"'); + await exec('git commit -m "Merge origin/main into master-sync"'); console.log('Executed: git commit'); console.log('Your local master-sync branch is now ready to become a PR.'); diff --git a/development/webpack/build.ts b/development/webpack/build.ts index 12ce2c95e693..4c102512ed0b 100644 --- a/development/webpack/build.ts +++ b/development/webpack/build.ts @@ -1,7 +1,7 @@ import { webpack } from 'webpack'; import type WebpackDevServerType from 'webpack-dev-server'; import { noop, logStats, __HMR_READY__ } from './utils/helpers'; -import config from './webpack.config.js'; +import config from './webpack.config'; // disable browserslist stats as it needlessly traverses the filesystem multiple // times looking for a stats file that doesn't exist. diff --git a/development/webpack/utils/plugins/ManifestPlugin/index.ts b/development/webpack/utils/plugins/ManifestPlugin/index.ts index bd18541cc1e3..a29219084de6 100644 --- a/development/webpack/utils/plugins/ManifestPlugin/index.ts +++ b/development/webpack/utils/plugins/ManifestPlugin/index.ts @@ -25,16 +25,6 @@ type Assets = Compilation['assets']; const NAME = 'ManifestPlugin'; const BROWSER_TEMPLATE_RE = /\[browser\]/gu; -/** - * Clones a Buffer or Uint8Array and returns it - * - * @param data - * @returns - */ -function clone(data: Buffer | Uint8Array): Buffer { - return Buffer.from(data); -} - /** * Adds the given asset to the zip file * @@ -54,12 +44,23 @@ function addAssetToZip( zip: Zip, ): void { const zipFile = compress - ? new AsyncZipDeflate(assetName, compressionOptions) - : new ZipPassThrough(assetName); + ? // AsyncZipDeflate uses workers + new AsyncZipDeflate(assetName, compressionOptions) + : // ZipPassThrough doesn't use workers + new ZipPassThrough(assetName); zipFile.mtime = mtime; zip.add(zipFile); - // use a copy of the Buffer, as Zip will consume it - zipFile.push(asset, true); + // Use a copy of the Buffer via `Buffer.from(asset)`, as Zip will *consume* + // it, which breaks things if we are compiling for multiple browsers at once. + // `Buffer.from` uses the internal pool, so it's superior to `new Uint8Array` + // if we don't need to pass it off to a worker thread. + // + // Additionally, in Node.js 22+ a Buffer marked as "Untransferable" (like + // ours) can't be passed to a worker, which `AsyncZipDeflate` uses. + // See: https://github.com/101arrowz/fflate/issues/227#issuecomment-2540024304 + // this can probably be simplified to `zipFile.push(Buffer.from(asset), true);` + // if the above issue is resolved. + zipFile.push(compress ? new Uint8Array(asset) : Buffer.from(asset), true); } /** @@ -145,7 +146,7 @@ export class ManifestPlugin { errored = true; reject(error); } else { - zipSource.add(new RawSource(clone(data))); + zipSource.add(new RawSource(Buffer.from(data))); // we've received our final bit of data, return the zipSource if (final) resolve(zipSource); } @@ -171,9 +172,7 @@ export class ManifestPlugin { if (excludeExtensions.includes(extName)) continue; addAssetToZip( - // make a copy of the asset Buffer as Zipping will *consume* it, - // which breaks things if we are compiling for multiple browsers. - clone(asset.buffer()), + asset.buffer(), assetName, ManifestPlugin.compressibleFileTypes.has(extName), compressionOptions, diff --git a/docs/QA_MIGRATIONS_GUIDE.md b/docs/QA_MIGRATIONS_GUIDE.md index fbd2c38a182a..beb3a239dea8 100644 --- a/docs/QA_MIGRATIONS_GUIDE.md +++ b/docs/QA_MIGRATIONS_GUIDE.md @@ -2,7 +2,7 @@ Migrations are needed to change top-level state data, this can be found in the browser's storage. This can look like removing specific keys/value pairs from state, changing objects to an array of objects, changing the name of a controller, etc. Steps - 1. Create a new MetaMask directory\* folder locally with the source files before the migration, and load it as an unpacked extension in Chrome\*. If the migration is in a pull request, then build the `develop` branch to load. If the migration is already in `develop`, get a commit before the migration was added to build. + 1. Create a new MetaMask directory\* folder locally with the source files before the migration, and load it as an unpacked extension in Chrome\*. If the migration is in a pull request, then build the `main` branch to load. If the migration is already in `main`, get a commit before the migration was added to build. ![Load unpacked extension to chrome](./assets/load-build-chrome.gif) diff --git a/docs/confirmation-refactoring/confirmation-backend-architecture/README.md b/docs/confirmation-refactoring/confirmation-backend-architecture/README.md index a3f30eb88a56..b927b5789801 100644 --- a/docs/confirmation-refactoring/confirmation-backend-architecture/README.md +++ b/docs/confirmation-refactoring/confirmation-backend-architecture/README.md @@ -5,13 +5,13 @@ Current confirmation implementation in the background consists of following pieces: 1. `TransactionController` and utility, helper classes used by it: - `TransactionController` is very important piece in transaction processing. It is described [here](https://github.com/MetaMask/metamask-extension/tree/develop/app/scripts/controllers/transactions#transaction-controller). It consists of 4 important parts: + `TransactionController` is very important piece in transaction processing. It is described [here](https://github.com/MetaMask/metamask-extension/tree/main/app/scripts/controllers/transactions#transaction-controller). It consists of 4 important parts: - `txStateManager`: responsible for the state of a transaction and storing the transaction - `pendingTxTracker`: watching blocks for transactions to be include and emitting confirmed events - `txGasUtil`: gas calculations and safety buffering - `nonceTracker`: calculating nonces 2. `MessageManagers`: - There are 3 different message managers responsible for processing signature requests. These are detailed [here](https://github.com/MetaMask/metamask-extension/tree/develop/docs/refactoring/signature-request#proposed-refactoring). + There are 3 different message managers responsible for processing signature requests. These are detailed [here](https://github.com/MetaMask/metamask-extension/tree/main/docs/refactoring/signature-request#proposed-refactoring). 3. `MetamaskController `: `MetamaskController ` is responsible for gluing together the different pieces in transaction processing. It is responsible to inject dependencies in `TransactionController`, `MessageManagers`, handling different events, responses to DAPP requests, etc. @@ -19,8 +19,8 @@ Current confirmation implementation in the background consists of following piec 1. Migrating to `@metamask/transaction-controller`. `TransactionController` in extension repo should eventually get replaced by core repo [TransactionController](https://github.com/MetaMask/core/tree/main/packages/transaction-controller). This controller is maintained by core team and also used in Metamask Mobile App. 2. Migrating to `@metamask/message-manager`. Message Managers in extension repo should be deprecated in favor of core repo [MessageManagers](https://github.com/MetaMask/core/tree/main/packages/message-manager). -3. Cleanup Code in `MetamaskController`. [Metamaskcontroller](https://github.com/MetaMask/metamask-extension/blob/develop/app/scripts/metamask-controller.js) is where `TransactionController` and different `MessageManagers` are initialized. It is responsible for injecting required dependencies. Also, it is responsible for handling incoming DAPP requests and invoking appropriate methods in these background classes. Over the period of time lot of code that should have been part of `TransactionController` and `MessageManagers` has ended up in `MetamaskController`. We need to cleanup this code and move to the appropriate classes. - - Code [here](https://github.com/MetaMask/metamask-extension/blob/bc19856d5d9ad1831e1722c84fe6161bed7a0a5a/app/scripts/metamask-controller.js#L3097) to check if `eth_sign` is enabled in preferences and perform other validation on the incoming request should be part of [MessageManager](https://github.com/MetaMask/metamask-extension/blob/develop/app/scripts/lib/message-manager.js) +3. Cleanup Code in `MetamaskController`. [Metamaskcontroller](https://github.com/MetaMask/metamask-extension/blob/main/app/scripts/metamask-controller.js) is where `TransactionController` and different `MessageManagers` are initialized. It is responsible for injecting required dependencies. Also, it is responsible for handling incoming DAPP requests and invoking appropriate methods in these background classes. Over the period of time lot of code that should have been part of `TransactionController` and `MessageManagers` has ended up in `MetamaskController`. We need to cleanup this code and move to the appropriate classes. + - Code [here](https://github.com/MetaMask/metamask-extension/blob/bc19856d5d9ad1831e1722c84fe6161bed7a0a5a/app/scripts/metamask-controller.js#L3097) to check if `eth_sign` is enabled in preferences and perform other validation on the incoming request should be part of [MessageManager](https://github.com/MetaMask/metamask-extension/blob/main/app/scripts/lib/message-manager.js) - Method to sign messages [signMessage](https://github.com/MetaMask/metamask-extension/blob/bc19856d5d9ad1831e1722c84fe6161bed7a0a5a/app/scripts/metamask-controller.js#L3158), [signPersonalMessage](https://github.com/MetaMask/metamask-extension/blob/bc19856d5d9ad1831e1722c84fe6161bed7a0a5a/app/scripts/metamask-controller.js#L3217), [signTypedMessage](https://github.com/MetaMask/metamask-extension/blob/bc19856d5d9ad1831e1722c84fe6161bed7a0a5a/app/scripts/metamask-controller.js#L3470) can be simplified by injecting `KeyringController` into `MessageManagers`. - There are about 11 different methods to `add`, `approve`, `reject` different types of signature requests. These can probably be moved to a helper class, thus reducing lines of code from `MetamaskController `. - This [code](https://github.com/MetaMask/metamask-extension/blob/bc19856d5d9ad1831e1722c84fe6161bed7a0a5a/app/scripts/metamask-controller.js#L959) can better be placed in `TransactionController`. diff --git a/docs/confirmation-refactoring/confirmation-page-structure/README.md b/docs/confirmation-refactoring/confirmation-page-structure/README.md index a0ecc658836d..3ef31d0e0607 100644 --- a/docs/confirmation-refactoring/confirmation-page-structure/README.md +++ b/docs/confirmation-refactoring/confirmation-page-structure/README.md @@ -11,7 +11,7 @@ Currently we have following confirmation pages mapping to confirmation routes: 5. `pages/confirm-token-transaction-base` 6. `pages/confirm-contract-interaction` -![Confirmation Pages structure](https://raw.githubusercontent.com/MetaMask/metamask-extension/develop/docs/confirmation-refactoring/confirmation-page-structure/current.png) +![Confirmation Pages structure](https://raw.githubusercontent.com/MetaMask/metamask-extension/main/docs/confirmation-refactoring/confirmation-page-structure/current.png) `confirm-page-container` component helps to define a structure for confirmation pages it includes: @@ -26,7 +26,7 @@ Other confirmation components listed above map to different types of transaction ## Areas of Refactoring: -1. ### [confirm-transaction-base](https://github.com/MetaMask/metamask-extension/tree/develop/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js) cleanup: +1. ### [confirm-transaction-base](https://github.com/MetaMask/metamask-extension/tree/main/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js) cleanup: The `confirm-transaction-base` component is huge 1200 lines component taking care of lot of complexity. We need to break it down into smaller components and move logic to hooks or utility classes. Layout related part can be moved to `confirm-page-container`. - Extract out code to render data into separate component from [here](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js#L641). - Extract out component to render hex data from [here](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js#L675). @@ -37,11 +37,11 @@ Other confirmation components listed above map to different types of transaction - Code to get error key [getErrorKey](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js#L230) can be moved to a util function. - As new component for gas selection popups is created this code [handleEditGas, handleCloseEditGas](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js#L276) can be moved to it. - Convert `confirm-transaction-base` into a functional components and extract out all of these functions into a hook - `handleEdit`, `handleCancelAll`, `handleCancel`, `handleSubmit`, `handleSetApprovalForAll`, etc. -2. ### [confirm-transaction-base-container](https://github.com/MetaMask/metamask-extension/tree/develop/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js) cleanup: +2. ### [confirm-transaction-base-container](https://github.com/MetaMask/metamask-extension/tree/main/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js) cleanup: This container is doing much work to query and get required transaction related values from state and pass over to `confirm-transaction-base` component. As we refactor state we should get rid of this component. - remove the use of `state.confirmTransaction` from the component - create hook to get values derived from metamask state and active transaction. - State cleanup is detailed more in a separate document [here](https://github.com/MetaMask/metamask-extension/tree/develop/docs/confirmation-refactoring/confirmation-state-management). + State cleanup is detailed more in a separate document [here](https://github.com/MetaMask/metamask-extension/tree/main/docs/confirmation-refactoring/confirmation-state-management). 3. ### [confirm-page-container](https://github.com/MetaMask/metamask-extension/tree/03ccc5366cf31c9fa0fedc2fac533ebc64e6f2b4/ui/components/app/confirm-page-container) cleanup: As described we should continue to have `confirm-page-container` components taking care of layout. Also wherever possible more re-usable smaller layout components for different part of confirmation page like gas details, gas selection popover, etc should be added. `confirm-page-container` defines a layout which is used by most comfirmation pages, but some pages like new token allowance implementation for `ERC20` differ from this layout. We will be able to use more and more of these re-usable components for other confirmation pages layouts also. @@ -53,9 +53,9 @@ Other confirmation components listed above map to different types of transaction There are 2 different versions popovers for gas editing: - - Legacy gas popover - [component](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/edit-gas-popover) - - EIP-1559 V2 gas popover - [component1](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/edit-gas-fee-popover), [component2](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/advanced-gas-fee-popover). - Context [transaction-modal-context](https://github.com/MetaMask/metamask-extension/blob/develop/ui/contexts/transaction-modal.js) is used to show hide EIP-1559 gas popovers. + - Legacy gas popover - [component](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/edit-gas-popover) + - EIP-1559 V2 gas popover - [component1](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/edit-gas-fee-popover), [component2](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/advanced-gas-fee-popover). + Context [transaction-modal-context](https://github.com/MetaMask/metamask-extension/blob/main/ui/contexts/transaction-modal.js) is used to show hide EIP-1559 gas popovers. A parent component can be created for gas editing popover which will wrap both the legacy and EIP-1559 gas popover. Depending on the type of transaction appropriate gas popover can be shown. `transaction-modal-context` can be used to take care to open/close both popovers. This parent component can be added to `confirm-transaction-base` and `token-allowance` components and thus will be available on all confirmation pages using gas editing. diff --git a/docs/confirmation-refactoring/confirmation-pages-routing/README.md b/docs/confirmation-refactoring/confirmation-pages-routing/README.md index ed4d7aef0788..a6abfcaf31ca 100644 --- a/docs/confirmation-refactoring/confirmation-pages-routing/README.md +++ b/docs/confirmation-refactoring/confirmation-pages-routing/README.md @@ -6,7 +6,7 @@ This document details how routing to confirmation pages is currently done and th The current flow of routing to confirmation pages is un-necessarily complicated and have issues. -![Confirmation Pages Routing - Current](https://raw.githubusercontent.com/MetaMask/metamask-extension/develop/docs/confirmation-refactoring/confirmation-pages-routing/current.png) +![Confirmation Pages Routing - Current](https://raw.githubusercontent.com/MetaMask/metamask-extension/main/docs/confirmation-refactoring/confirmation-pages-routing/current.png) - There are 2 ways in which confirmation pages can be opened: 1. User triggers send flow from within Metamask @@ -24,7 +24,7 @@ The current flow of routing to confirmation pages is un-necessarily complicated The proposed routing of confirmation pages looks like. -![Confirmation Pages Routing - Proposed](https://raw.githubusercontent.com/MetaMask/metamask-extension/develop/docs/confirmation-refactoring/confirmation-pages-routing/proposed.png) +![Confirmation Pages Routing - Proposed](https://raw.githubusercontent.com/MetaMask/metamask-extension/main/docs/confirmation-refactoring/confirmation-pages-routing/proposed.png) - There are 2 ways in which confirmation pages can be opened: 1. User triggers send flow from within Metamask @@ -52,14 +52,14 @@ The proposed routing of confirmation pages looks like. ## Areas of code refactoring -Current routing code is complicated, it is also currently tied to state change in confirmation pages that makes it more complicated. State refactoring as discussed in this [document](https://github.com/MetaMask/metamask-extension/tree/develop/docs/confirmation-refactoring/confirmation-state-management) will also help simplify it. +Current routing code is complicated, it is also currently tied to state change in confirmation pages that makes it more complicated. State refactoring as discussed in this [document](https://github.com/MetaMask/metamask-extension/tree/main/docs/confirmation-refactoring/confirmation-state-management) will also help simplify it. -- Any re-usable routing related code should be moved to [useRouting](https://github.com/MetaMask/metamask-extension/blob/develop/ui/hooks/useRouting.js) hook. +- Any re-usable routing related code should be moved to [useRouting](https://github.com/MetaMask/metamask-extension/blob/main/ui/hooks/useRouting.js) hook. - Logic to initially check state and redirect to `/pages/confirm-transaction` can be moved from `/pages/home` to `pages/routes` - All the route mapping code should be moved to `/pages/confirm-transaction`, this will require getting rid of route mappings in `/pages/confirm-transaction/confirm-token-transaction-switch`, `/pages/confirm-transaction-switch`. - `/pages/confirm-transaction-switch` has the code that checks the un-approved transaction / message in the state, and based on its type and asset redirect to a specific route, a utility method can be created to do this mapping and can be included in `/pages/confirm-transaction` component. - During the send flow initiated within metamask user can be redirected to specific confirmations route **`/confirm-transaction/${id}/XXXX`** -- Confirmation components have lot of props passing which needs to be reduced. Values can be obtained from redux state or other contexts directly using hooks. Component [confirm-token-transaction-switch](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction/confirm-token-transaction-switch.js) has a lot of un-necessary props passing which should be removed and will help to further refactor routing. +- Confirmation components have lot of props passing which needs to be reduced. Values can be obtained from redux state or other contexts directly using hooks. Component [confirm-token-transaction-switch](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction/confirm-token-transaction-switch.js) has a lot of un-necessary props passing which should be removed and will help to further refactor routing. - **Routing to mostRecentOverviewPage** Across confirmation pages there is code to re-direct to `mostRecentOverviewPage`. `mostRecentOverviewPage` is equal to default route `/` or `/asset` whichever was last opened. diff --git a/docs/confirmation-refactoring/confirmation-state-management/README.md b/docs/confirmation-refactoring/confirmation-state-management/README.md index a24184154e5a..da9cf143a754 100644 --- a/docs/confirmation-refactoring/confirmation-state-management/README.md +++ b/docs/confirmation-refactoring/confirmation-state-management/README.md @@ -12,11 +12,11 @@ State Management is very important piece to keep frontend confirmation code simp Refactorings: -- There are confirmations related ducks [here](https://github.com/MetaMask/metamask-extension/tree/develop/ui/ducks): - - [confirm-transaction](https://github.com/MetaMask/metamask-extension/tree/develop/ui/ducks/confirm-transaction): this is redundant and we should be able to get rid of it. - - [gas](https://github.com/MetaMask/metamask-extension/tree/develop/ui/ducks/gas): this is not used anywhere and can be removed. - - [send](https://github.com/MetaMask/metamask-extension/tree/develop/ui/ducks/send): this duck is important state machine for send flow and we should continue to maintain. -- [gasFeeContext](https://github.com/MetaMask/metamask-extension/blob/develop/ui/contexts/gasFee.js) is huge context written on top of [gasFeeInput](https://github.com/MetaMask/metamask-extension/tree/develop/ui/hooks/gasFeeInput) hook. The context / hook provides about 20 different values used in different places in confirmation pages. We need to break this down: +- There are confirmations related ducks [here](https://github.com/MetaMask/metamask-extension/tree/main/ui/ducks): + - [confirm-transaction](https://github.com/MetaMask/metamask-extension/tree/main/ui/ducks/confirm-transaction): this is redundant and we should be able to get rid of it. + - [gas](https://github.com/MetaMask/metamask-extension/tree/main/ui/ducks/gas): this is not used anywhere and can be removed. + - [send](https://github.com/MetaMask/metamask-extension/tree/main/ui/ducks/send): this duck is important state machine for send flow and we should continue to maintain. +- [gasFeeContext](https://github.com/MetaMask/metamask-extension/blob/main/ui/contexts/gasFee.js) is huge context written on top of [gasFeeInput](https://github.com/MetaMask/metamask-extension/tree/main/ui/hooks/gasFeeInput) hook. The context / hook provides about 20 different values used in different places in confirmation pages. We need to break this down: - Context is required only to provide temporary UI state for confirmation pages which includes: @@ -38,10 +38,10 @@ Refactorings: - `gasFeeEstimates` - `isNetworkBusy` - `minimumGasLimitDec` is a constant value 21000 should be removed from the context, this can be moved to constants file. - - Create separate hook for transaction functions [here](https://github.com/MetaMask/metamask-extension/blob/develop/ui/hooks/gasFeeInput/useTransactionFunctions.js), this hook can consume GasFeeContext. - - Setters and manual update functions are only used by legacy gas component [edit-gas-fee-popover](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/edit-gas-popover). This component uses useGasFeeInputs hook. We need to create a smaller hook just for this component using the above context and hooks. + - Create separate hook for transaction functions [here](https://github.com/MetaMask/metamask-extension/blob/main/ui/hooks/gasFeeInput/useTransactionFunctions.js), this hook can consume GasFeeContext. + - Setters and manual update functions are only used by legacy gas component [edit-gas-fee-popover](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/edit-gas-popover). This component uses useGasFeeInputs hook. We need to create a smaller hook just for this component using the above context and hooks. -* [confirm-transaction-base.container.js](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js) and [confirm-transaction-base.component.js](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js) has a lot of code to derive values from state and selected transactions. This can be simplified by using hooks that will he created. +* [confirm-transaction-base.container.js](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js) and [confirm-transaction-base.component.js](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js) has a lot of code to derive values from state and selected transactions. This can be simplified by using hooks that will he created. * We will have a lot of hooks for transaction related fields, these can be grouped into same file / folder. As we work on the components we will be able to identify more areas of improvement. diff --git a/docs/confirmation-refactoring/signature-request/README.md b/docs/confirmation-refactoring/signature-request/README.md index a80cc046ca6c..3585ef4a9c4e 100644 --- a/docs/confirmation-refactoring/signature-request/README.md +++ b/docs/confirmation-refactoring/signature-request/README.md @@ -6,35 +6,35 @@ This document details the plan to refactor and cleanup Signature Request pages i 1. Simple ETH Signature - + 1. Personal Signature - + 1. Typed Data - V1 - + 1. Typed Data - V3 - + 1. Typed Data - V4 - + 1. SIWE Signature - + ## The current flow of control for Signature Request looks like: -![Signature Request Flow - Current](https://raw.githubusercontent.com/MetaMask/metamask-extension/develop/docs/confirmation-refactoring/signature-request/signature_request_old.png) +![Signature Request Flow - Current](https://raw.githubusercontent.com/MetaMask/metamask-extension/main/docs/confirmation-refactoring/signature-request/signature_request_old.png) ## The proposed flow of control: -![Signature Request Flow - Proposed](https://raw.githubusercontent.com/MetaMask/metamask-extension/develop/docs/confirmation-refactoring/signature-request/signature_request_proposed.png) +![Signature Request Flow - Proposed](https://raw.githubusercontent.com/MetaMask/metamask-extension/main/docs/confirmation-refactoring/signature-request/signature_request_proposed.png) ## Proposed Refactoring: @@ -44,9 +44,9 @@ There are many areas in above flow where the code can be improved upon to cleanu Currently we have 3 different message managers: - - [MessageManager](https://github.com/MetaMask/metamask-extension/blob/develop/app/scripts/lib/message-manager.js) - - [PersonalMessageManager](https://github.com/MetaMask/metamask-extension/blob/develop/app/scripts/lib/personal-message-manager.js) - - [TypedMessageManager](https://github.com/MetaMask/metamask-extension/blob/develop/app/scripts/lib/typed-message-manager.js) + - [MessageManager](https://github.com/MetaMask/metamask-extension/blob/main/app/scripts/lib/message-manager.js) + - [PersonalMessageManager](https://github.com/MetaMask/metamask-extension/blob/main/app/scripts/lib/personal-message-manager.js) + - [TypedMessageManager](https://github.com/MetaMask/metamask-extension/blob/main/app/scripts/lib/typed-message-manager.js) Above message managers handle different types of message requests sent by DAPP. There is a lot of code duplication between the 3 classes. @@ -56,14 +56,14 @@ There are many areas in above flow where the code can be improved upon to cleanu Current navigation to Signature Request pages is un-necessarily complicated. It can be simplified to great extent. - - To the navigation code in [Home](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/home/home.component.js#L181) component add condition to check if there are unapproved messages and route to path `/singature-request`. - - In [Routes](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/routes/routes.component.js) component render pages/confirm-signature-request for path `/singature-request`. - - Refactor out [conf-tx.js](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction/conf-tx.js) into pages/confirm-signature-request component. [#17240](https://github.com/MetaMask/metamask-extension/issues/17240) + - To the navigation code in [Home](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/home/home.component.js#L181) component add condition to check if there are unapproved messages and route to path `/singature-request`. + - In [Routes](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/routes/routes.component.js) component render pages/confirm-signature-request for path `/singature-request`. + - Refactor out [conf-tx.js](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction/conf-tx.js) into pages/confirm-signature-request component. [#17240](https://github.com/MetaMask/metamask-extension/issues/17240) -3. ### Refactoring in [conf-tx.js](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction/conf-tx.js) +3. ### Refactoring in [conf-tx.js](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction/conf-tx.js) - - [conf-tx.js](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction/conf-tx.js) to be renamed to `pages/confirm-signature-request component` - - Get rid of [confirm-transaction](https://github.com/MetaMask/metamask-extension/blob/develop/ui/pages/confirm-transaction/confirm-transaction.component.js) component from signature request routing. Thus, we need to ensure that any required logic from the component is extracted into a reusable hook and included in pages/confirm-signature-request. + - [conf-tx.js](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction/conf-tx.js) to be renamed to `pages/confirm-signature-request component` + - Get rid of [confirm-transaction](https://github.com/MetaMask/metamask-extension/blob/main/ui/pages/confirm-transaction/confirm-transaction.component.js) component from signature request routing. Thus, we need to ensure that any required logic from the component is extracted into a reusable hook and included in pages/confirm-signature-request. - Convert to functional react component and use selectors to get state and get rid of `mapStateToProps`. [#17239](https://github.com/MetaMask/metamask-extension/issues/17239) - Various callbacks to `sign message`, `cancel request`, etc for different types of messages can be moved to respective child components. - On component `mount/update` if there are no unapproved messages redirect to `mostRecentlyOverviewedPage` as [here](https://github.com/MetaMask/metamask-extension/blob/76a2a9bb8b6ea04025328d36404ac3b59121dfc8/ui/app/pages/confirm-transaction/conf-tx.js#L187). @@ -74,12 +74,12 @@ There are many areas in above flow where the code can be improved upon to cleanu There are 3 different signature request components responsible to render different signature request pages: - 1. [signature-request-original](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/signature-request-original) - ETH sign, personal sign, sign typed data V1 - 2. [signature-request](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/signature-request) - Sign typed data V3, V4 - 3. [signature-request-siwe](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/signature-request-siwe) - SignatureRequestSIWE (Sign-In with Ethereum) + 1. [signature-request-original](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/signature-request-original) - ETH sign, personal sign, sign typed data V1 + 2. [signature-request](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/signature-request) - Sign typed data V3, V4 + 3. [signature-request-siwe](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/signature-request-siwe) - SignatureRequestSIWE (Sign-In with Ethereum) All, the signature request pages (except SIWE) are very similar, the differing part in these pages is the message section. - And there is a lot of code duplication between components - [signature-request-original](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/signature-request-original) and [signature-request](https://github.com/MetaMask/metamask-extension/tree/develop/ui/components/app/signature-request). + And there is a lot of code duplication between components - [signature-request-original](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/signature-request-original) and [signature-request](https://github.com/MetaMask/metamask-extension/tree/main/ui/components/app/signature-request). 5. ### Refactoring in signature-request-original @@ -89,12 +89,12 @@ There are many areas in above flow where the code can be improved upon to cleanu - Move this [metrics event](https://github.com/MetaMask/metamask-extension/blob/71a0bc8b3ff94478e61294c815770e6bc12a72f5/ui/app/components/app/signature-request-original/signature-request-original.component.js#L50) to pages/confirm-signature-request as it is applicable to all the signature requests types. - Header or we can say upper half of the page of all signature request pages (except SIWE) are very similar, this can be extracted into a reusable component used across both signature-request-original and signature-request: - + - [LedgerInstructions](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/components/app/signature-request-original/signature-request-original.component.js#L312) can also be moved to the header. - Create a reuable footer component and use it across all confirmation pages. [#17237](https://github.com/MetaMask/metamask-extension/issues/17237) - + - Create a reusable component for Cancel All requests for use across signature request pages [Code](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/components/app/signature-request-original/signature-request-original.component.js#L326). - Extract [getNetrowkName](https://github.com/MetaMask/metamask-extension/blob/e07ec9dcf3d3f341f83e6b29a29d30edaf7f5b5b/ui/components/app/signature-request-original/signature-request-original.component.js#L60) into a reusable hook / utility method. diff --git a/docs/publishing.md b/docs/publishing.md index fdf1ab1850a7..5915f1873a88 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -30,9 +30,9 @@ In the case that a new release has sensitive changes that cannot be fully verifi ## Building -While we develop on the main `develop` branch, our production version is maintained on the `master` branch. +While we develop on the `main` branch, our production version is maintained on the `master` branch. -With each pull request, the @MetaMaskBot will comment with a build of that new pull request, so after bumping the version on `develop`, open a pull request against `master`, and once the pull request is reviewed and merged, you can download those builds for publication. +With each pull request, the @MetaMaskBot will comment with a build of that new pull request, so after bumping the version on `main`, open a pull request against `master`, and once the pull request is reviewed and merged, you can download those builds for publication. ## Publishing @@ -45,7 +45,7 @@ With each pull request, the @MetaMaskBot will comment with a build of that new p ## Hotfix Differences -Our `develop` branch is usually not yet fully tested for quality assurance, and so should be treated as if it is in an unstable state. +Our `main` branch is usually not yet fully tested for quality assurance, and so should be treated as if it is in an unstable state. For this reason, when an urgent change is needed in production, its pull request should: @@ -53,4 +53,4 @@ For this reason, when an urgent change is needed in production, its pull request - Use a hotfix tag. - Should be proposed against the `master` branch. -The version and changelog bump should then be made off the `master` branch, and then merged to `develop` to bring the two branches back into sync. Further time can be saved by incorporating the version/changelog bump into the PR against `master`, since we rely on @MetaMaskBot to run tests before merging. +The version and changelog bump should then be made off the `master` branch, and then merged to `main` to bring the two branches back into sync. Further time can be saved by incorporating the version/changelog bump into the PR against `master`, since we rely on @MetaMaskBot to run tests before merging. diff --git a/jest.integration.config.js b/jest.integration.config.js index 685080330fb3..5a110d7a5632 100644 --- a/jest.integration.config.js +++ b/jest.integration.config.js @@ -25,8 +25,7 @@ module.exports = { setupFilesAfterEnv: ['/test/integration/config/setupAfter.js'], testMatch: ['/test/integration/**/*.test.(js|ts|tsx)'], testPathIgnorePatterns: ['/test/integration/config/*'], - // This was increased from 5500 to 10000 to when lazy loading was introduced - testTimeout: 10000, + testTimeout: 15000, // We have to specify the environment we are running in, which is jsdom. The // default is 'node'. This can be modified *per file* using a comment at the // head of the file. So it may be worthwhile to switch to 'node' in any diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index b3b118eb6bb8..82075f709022 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -5,144 +5,124 @@ "regeneratorRuntime": "write" } }, - "@ensdomains/content-hash": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { "globals": { - "console.warn": true + "WeakRef": true }, "packages": { - "@ensdomains/content-hash>cids": true, - "@ensdomains/content-hash>js-base64": true, - "@ensdomains/content-hash>multicodec": true, - "@ensdomains/content-hash>multihashes": true, - "browserify>buffer": true + "browserify": true } }, - "@ensdomains/content-hash>cids": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes": true, - "@ensdomains/content-hash>cids>uint8arrays": true, - "@ensdomains/content-hash>multicodec": true + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, + "browserify": true, + "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true } }, - "@ensdomains/content-hash>cids>multibase": { + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "SuppressedError": true + } + }, + "@ensdomains/content-hash": { + "globals": { + "console.warn": true }, "packages": { - "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true + "browserify>buffer": true, + "@ensdomains/content-hash>cids": true, + "@ensdomains/content-hash>js-base64": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>multihashes": true } }, - "@ensdomains/content-hash>cids>multihashes": { + "@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes>varint": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>cids>uint8arrays": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "webpack>events": true } }, - "@ensdomains/content-hash>js-base64": { - "globals": { - "Base64": "write", - "TextDecoder": true, - "TextEncoder": true, - "atob": true, - "btoa": true, - "define": true - }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "browserify>buffer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays": true, - "sass-embedded>varint": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays": { + "@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "Buffer": true, - "TextDecoder": true, "TextEncoder": true - }, - "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "TextDecoder": true, - "TextEncoder": true, - "console.warn": true, - "crypto.subtle.digest": true - } - }, - "@ensdomains/content-hash>multihashes": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase": true, - "@ensdomains/content-hash>multihashes>varint": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase>base-x": { + "@ethereumjs/tx": { "packages": { - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, - "@ensdomains/content-hash>multihashes>web-encoding": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx": { "packages": { - "browserify>util": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@ethereumjs/tx": { + "eth-lattice-keyring>@ethereumjs/tx": { "packages": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, "@ethereumjs/tx>@ethereumjs/common": true, "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, + "@ethersproject/providers": true, "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true, "browserify>insert-module-globals>is-buffer": true } }, - "@ethereumjs/tx>@ethereumjs/common": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/providers": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@ethereumjs/tx>@ethereumjs/common>crc-32": { - "globals": { - "DO_NOT_EXPORT_CRC": true, - "define": true - } - }, - "@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, "@ethereumjs/tx>@ethereumjs/util": { @@ -151,70 +131,83 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, - "@ethereumjs/tx>ethereum-cryptography": true, "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true, "browserify>insert-module-globals>is-buffer": true, - "webpack>events": true + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true } }, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { + "@metamask/smart-transactions-controller>@ethereumjs/util": { "globals": { - "Headers": true, - "TextDecoder": true, - "URL": true, - "btoa": true, + "console.warn": true, "fetch": true }, "packages": { - "browserify>browserify-zlib": true, - "browserify>buffer": true, - "browserify>url": true, - "browserify>util": true, - "https-browserify": true, - "process": true, - "stream-http": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true } }, - "@ethereumjs/tx>ethereum-cryptography": { + "@ethersproject/abi": { "globals": { - "TextDecoder": true, - "crypto": true + "console.log": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true, - "@metamask/message-signing-snap>@noble/curves": true, - "@noble/hashes": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { + "ethers>@ethersproject/abstract-provider": { "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "@ethersproject/abi": { - "globals": { - "console.log": true - }, + "ethers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/address": { "packages": { "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/basex": { + "packages": { + "@ethersproject/bytes": true, + "ethers>@ethersproject/properties": true } }, "@ethersproject/bignumber": { "packages": { "@ethersproject/bytes": true, - "bn.js": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/logger": true, + "bn.js": true } }, "@ethersproject/bytes": { @@ -222,17 +215,22 @@ "ethers>@ethersproject/logger": true } }, + "ethers>@ethersproject/constants": { + "packages": { + "@ethersproject/bignumber": true + } + }, "@ethersproject/contracts": { "globals": { "setTimeout": true }, "packages": { "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/abstract-provider": true, "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/transactions": true @@ -240,10 +238,10 @@ }, "@ethersproject/hash": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/address": true, "ethers>@ethersproject/base64": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, @@ -252,9 +250,9 @@ }, "@ethersproject/hdnode": { "packages": { + "ethers>@ethersproject/basex": true, "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "ethers>@ethersproject/basex": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, @@ -265,1235 +263,719 @@ "ethers>@ethersproject/wordlists": true } }, - "@ethersproject/providers": { - "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true - }, + "ethers>@ethersproject/json-wallets": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/providers>bech32": true, - "@metamask/test-bundler>@ethersproject/networks": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true - } - }, - "@ethersproject/providers>@ethersproject/random": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true - } - }, - "@ethersproject/wallet": { - "packages": { "@ethersproject/bytes": true, - "@ethersproject/hash": true, "@ethersproject/hdnode": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@keystonehq/bc-ur-registry-eth": { + "ethers>@ethersproject/keccak256": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "uuid": true + "@ethersproject/bytes": true, + "@metamask/ethjs>js-sha3": true } }, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { + "ethers>@ethersproject/logger": { "globals": { - "define": true - }, + "console": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { "packages": { - "@ngraveio/bc-ur": true, - "@swc/helpers>tslib": true, - "browserify>buffer": true, - "buffer": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring": { + "@metamask/test-bundler>@ethersproject/networks": { "packages": { - "@ethereumjs/tx": true, - "@keystonehq/bc-ur-registry-eth": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>rlp": true, - "@metamask/obs-store": true, - "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "ethers>@ethersproject/pbkdf2": { "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "eth-lattice-keyring>rlp": true, - "uuid": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/sha2": true } }, - "@keystonehq/metamask-airgapped-keyring>rlp": { + "ethers>@ethersproject/properties": { "packages": { - "bn.js": true, - "browserify>buffer": true + "ethers>@ethersproject/logger": true } }, - "@lavamoat/lavadome-react": { + "@ethersproject/providers": { "globals": { - "Document.prototype": true, - "DocumentFragment.prototype": true, - "Element.prototype": true, - "Node.prototype": true, + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, "console.warn": true, - "document": true + "setInterval": true, + "setTimeout": true }, "packages": { - "react": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "@metamask/test-bundler>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "@ethersproject/providers>@ethersproject/web": true, + "@ethersproject/providers>bech32": true } }, - "@material-ui/core": { + "ethers>@ethersproject/providers": { "globals": { - "Image": true, - "_formatMuiErrorMessage": true, - "addEventListener": true, + "WebSocket": true, "clearInterval": true, "clearTimeout": true, - "console.error": true, + "console.log": true, "console.warn": true, - "document": true, - "getComputedStyle": true, - "getSelection": true, - "innerHeight": true, - "innerWidth": true, - "matchMedia": true, - "navigator": true, - "performance.now": true, - "removeEventListener": true, - "requestAnimationFrame": true, "setInterval": true, "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles": true, - "@material-ui/core>@material-ui/system": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "@material-ui/core>popper.js": true, - "@material-ui/core>react-transition-group": true, - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true } }, - "@material-ui/core>@material-ui/styles": { + "@ethersproject/providers>@ethersproject/random": { "globals": { - "console.error": true, - "console.warn": true, - "document.createComment": true, - "document.head": true - }, + "crypto.getRandomValues": true + } + }, + "ethers>@ethersproject/random": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, - "@material-ui/core>@material-ui/styles>jss-plugin-global": true, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, - "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "prop-types": true, - "react": true, - "react-redux>hoist-non-react-statics": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss": { - "globals": { - "CSS": true, - "document.createElement": true, - "document.querySelector": true - }, + "ethers>@ethersproject/rlp": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { + "ethers>@ethersproject/sha2": { "packages": { - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { - "globals": { - "CSS": true - }, + "ethers>@ethersproject/signing-key": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-global": { + "ethers>@ethersproject/solidity": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": { + "ethers>@ethersproject/strings": { "packages": { - "@babel/runtime": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { + "ethers>@ethersproject/transactions": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "react-router-dom>tiny-warning": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/signing-key": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { + "ethers>@ethersproject/units": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true + "@ethersproject/bignumber": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { - "globals": { - "document.createElement": true, - "document.documentElement": true, - "getComputedStyle": true - }, + "@ethersproject/wallet": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true - } - }, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": { - "globals": { - "document": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/transactions": true } }, - "@material-ui/core>@material-ui/system": { + "@ethersproject/providers>@ethersproject/web": { "globals": { - "console.error": true + "clearTimeout": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/utils": true, - "prop-types": true - } - }, - "@material-ui/core>@material-ui/utils": { - "packages": { - "@babel/runtime": true, - "prop-types": true, - "prop-types>react-is": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>popper.js": { + "ethers>@ethersproject/providers>@ethersproject/web": { "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator": true, - "requestAnimationFrame": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>react-transition-group": { + "ethers>@ethersproject/web": { "globals": { - "Element": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true }, "packages": { - "@material-ui/core>react-transition-group>dom-helpers": true, - "prop-types": true, - "react": true, - "react-dom": true - } - }, - "@material-ui/core>react-transition-group>dom-helpers": { - "packages": { - "@babel/runtime": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask/abi-utils": { + "ethers>@ethersproject/wordlists": { "packages": { - "@metamask/abi-utils>@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask/abi-utils>@metamask/utils": { + "@metamask/notification-services-controller>firebase>@firebase/app": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "FinalizationRegistry": true, + "console.warn": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/accounts-controller": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/base-controller": true, - "@metamask/eth-snap-keyring": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/utils": true, - "uuid": true - } - }, - "@metamask/address-book-controller": { - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask/announcement-controller": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { "packages": { - "@metamask/announcement-controller>@metamask/base-controller": true + "@metamask/notification-services-controller>firebase>@firebase/util": true } }, - "@metamask/announcement-controller>@metamask/base-controller": { + "@metamask/notification-services-controller>firebase>@firebase/installations": { "globals": { + "BroadcastChannel": true, + "Headers": true, + "btoa": true, + "console.error": true, + "crypto": true, + "fetch": true, + "msCrypto": true, + "navigator.onLine": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask/approval-controller": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { "globals": { - "console.info": true + "console": true }, "packages": { - "@metamask/approval-controller>nanoid": true, - "@metamask/base-controller": true, - "@metamask/rpc-errors": true - } - }, - "@metamask/approval-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@swc/helpers>tslib": true } }, - "@metamask/assets-controllers": { + "@metamask/notification-services-controller>firebase>@firebase/messaging": { "globals": { - "AbortController": true, "Headers": true, + "Notification.maxActions": true, + "Notification.permission": true, + "Notification.requestPermission": true, + "PushSubscription.prototype.hasOwnProperty": true, + "ServiceWorkerRegistration": true, "URL": true, - "URLSearchParams": true, - "clearInterval": true, - "clearTimeout": true, - "console.error": true, - "console.log": true, - "setInterval": true, + "addEventListener": true, + "atob": true, + "btoa": true, + "clients.matchAll": true, + "clients.openWindow": true, + "console.warn": true, + "document": true, + "fetch": true, + "indexedDB": true, + "location.href": true, + "location.origin": true, + "navigator": true, + "origin.replace": true, + "registration.showNotification": true, "setTimeout": true }, "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/bignumber": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/abi-utils": true, - "@metamask/assets-controllers>@metamask/polling-controller": true, - "@metamask/base-controller": true, - "@metamask/contract-metadata": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "bn.js": true, - "cockatiel": true, - "ethers>@ethersproject/address": true, - "lodash": true, - "single-call-balance-checker-abi": true, - "uuid": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/installations": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, + "@swc/helpers>tslib": true } }, - "@metamask/assets-controllers>@metamask/polling-controller": { + "@metamask/notification-services-controller>firebase>@firebase/util": { "globals": { - "clearTimeout": true, - "console.error": true, + "atob": true, + "browser": true, + "btoa": true, + "chrome": true, + "console": true, + "document": true, + "indexedDB": true, + "navigator": true, + "process": true, + "self": true, "setTimeout": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, + "process": true + } + }, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "eth-lattice-keyring>rlp": true, "uuid": true } }, - "@metamask/base-controller": { - "globals": { - "setTimeout": true - }, + "@keystonehq/bc-ur-registry-eth": { "packages": { - "immer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "uuid": true } }, - "@metamask/browser-passworder": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { "globals": { - "CryptoKey": true, - "btoa": true, - "crypto.getRandomValues": true, - "crypto.subtle.decrypt": true, - "crypto.subtle.deriveKey": true, - "crypto.subtle.encrypt": true, - "crypto.subtle.exportKey": true, - "crypto.subtle.importKey": true - }, - "packages": { - "@metamask/browser-passworder>@metamask/utils": true, - "browserify>buffer": true - } - }, - "@metamask/browser-passworder>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/controller-utils": { - "globals": { - "URL": true, - "console.error": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/controller-utils>@spruceid/siwe-parser": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/utils": true, - "bn.js": true, - "browserify>buffer": true, - "eslint>fast-deep-equal": true, - "eth-ens-namehash": true - } - }, - "@metamask/controller-utils>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { - "packages": { - "browserify>buffer": true - } - }, - "@metamask/controllers>web3": { - "globals": { - "XMLHttpRequest": true - } - }, - "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { - "globals": { - "fetch": true - } - }, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { - "globals": { - "fetch": true - } - }, - "@metamask/ens-controller": { - "packages": { - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/ens-controller>@metamask/utils": true, - "punycode": true - } - }, - "@metamask/ens-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-json-rpc-filters": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/eth-query": true, - "@metamask/json-rpc-engine": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/safe-event-emitter": true, - "pify": true - } - }, - "@metamask/eth-json-rpc-middleware": { - "globals": { - "URL": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true - } - }, - "@metamask/eth-json-rpc-middleware>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-json-rpc-provider": { - "packages": { - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "uuid": true - } - }, - "@metamask/eth-ledger-bridge-keyring": { - "globals": { - "addEventListener": true, - "console.error": true, - "document.createElement": true, - "document.head.appendChild": true, - "fetch": true, - "removeEventListener": true - }, - "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, - "@metamask/eth-sig-util": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { - "globals": { - "console.warn": true - }, - "packages": { - "@ethersproject/abi": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, - "browserify>buffer": true, - "ethers>@ethersproject/rlp": true, - "semver": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { - "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { - "globals": { - "console.warn": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { - "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true, - "@metamask/ppom-validator>crypto-js": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { - "globals": { - "console.warn": true - }, - "packages": { - "wait-on>rxjs": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/providers": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/wordlists": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { - "globals": { - "__ledgerLogsListen": "write", - "console.error": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { - "globals": { - "crypto": true, "define": true - } - }, - "@metamask/eth-query": { - "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "watchify>xtend": true - } - }, - "@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-sig-util>tweetnacl": { - "globals": { - "crypto": true, - "msCrypto": true, - "nacl": "write" - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/eth-snap-keyring": { - "globals": { - "URL": true, - "console.error": true - }, - "packages": { - "@ethereumjs/tx": true, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/eth-snap-keyring>uuid": true, - "@metamask/keyring-api": true, - "@metamask/utils>@metamask/superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-snap-keyring>uuid": { - "globals": { - "crypto": true - } - }, - "@metamask/eth-token-tracker": { - "globals": { - "console.warn": true - }, - "packages": { - "@babel/runtime": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/eth-token-tracker>deep-equal": true, - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/safe-event-emitter": true, - "bn.js": true, - "human-standard-token-abi": true - } - }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, - "@metamask/safe-event-emitter": true, - "pify": true - } - }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@ngraveio/bc-ur": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "buffer": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-token-tracker>deep-equal": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, - "@metamask/eth-token-tracker>deep-equal>is-date-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, - "@metamask/eth-token-tracker>deep-equal>which-collection": true, - "@ngraveio/bc-ur>assert>object-is": true, - "browserify>util>is-arguments": true, - "browserify>util>which-typed-array": true, - "gulp>vinyl-fs>object.assign": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true, - "string.prototype.matchall>es-abstract>is-regex": true, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>regexp.prototype.flags": true, - "string.prototype.matchall>side-channel": true - } - }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true, - "browserify>util>is-arguments": true, - "eslint-plugin-react>array-includes>is-string": true, - "process": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>has-symbols": true - } - }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { - "globals": { - "StopIteration": true - }, - "packages": { - "string.prototype.matchall>internal-slot": true - } - }, - "@metamask/eth-token-tracker>deep-equal>is-date-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, - "eslint-plugin-react>array-includes>is-string": true, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { - "packages": { - "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "@swc/helpers>tslib": true } }, - "@metamask/eth-trezor-keyring": { - "globals": { - "setTimeout": true - }, + "@keystonehq/metamask-airgapped-keyring": { "packages": { "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "@trezor/connect-web": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { - "packages": { - "@metamask/eth-sig-util": true, - "@swc/helpers>tslib": true - } - }, - "@metamask/eth-trezor-keyring>hdkey": { - "packages": { - "browserify>assert": true, - "crypto-browserify": true, - "ethereumjs-util>create-hash>ripemd160": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "webpack>events": true, + "@keystonehq/metamask-airgapped-keyring>rlp": true, + "uuid": true } }, - "@metamask/etherscan-link": { + "chart.js>@kurkle/color": { "globals": { - "URL": true + "define": true } }, - "@metamask/ethjs": { + "@lavamoat/lavadome-react": { "globals": { - "clearInterval": true, - "setInterval": true + "Document.prototype": true, + "DocumentFragment.prototype": true, + "Element.prototype": true, + "Node.prototype": true, + "console.warn": true, + "document": true }, "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-provider-http": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/number-to-bn": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true + "react": true } }, - "@metamask/ethjs-contract": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { "packages": { - "@babel/runtime": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "promise-to-callback": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true } }, - "@metamask/ethjs-query": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { "globals": { - "console": true - }, + "console.warn": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format": true, - "@metamask/ethjs-query>@metamask/ethjs-rpc": true, - "promise-to-callback": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, + "@metamask/ppom-validator>crypto-js": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true } }, - "@metamask/ethjs-query>@metamask/ethjs-format": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { + "globals": { + "console.warn": true + }, "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "@metamask/ethjs>@metamask/number-to-bn": true + "@ethersproject/abi": true, + "ethers>@ethersproject/rlp": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, + "browserify>buffer": true, + "semver": true } }, - "@metamask/ethjs-query>@metamask/ethjs-rpc": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { + "globals": { + "console.warn": true + }, "packages": { - "promise-to-callback": true + "wait-on>rxjs": true } }, - "@metamask/ethjs>@metamask/ethjs-filter": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { "globals": { - "clearInterval": true, - "setInterval": true + "__ledgerLogsListen": "write", + "console.error": true } }, - "@metamask/ethjs>@metamask/ethjs-provider-http": { + "@material-ui/core": { + "globals": { + "Image": true, + "_formatMuiErrorMessage": true, + "addEventListener": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "getSelection": true, + "innerHeight": true, + "innerWidth": true, + "matchMedia": true, + "navigator": true, + "performance.now": true, + "removeEventListener": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles": true, + "@material-ui/core>@material-ui/system": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>popper.js": true, + "prop-types": true, + "react": true, + "react-dom": true, + "prop-types>react-is": true, + "@material-ui/core>react-transition-group": true } }, - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { + "@material-ui/core>@material-ui/styles": { "globals": { - "XMLHttpRequest": true + "console.error": true, + "console.warn": true, + "document.createComment": true, + "document.head": true + }, + "packages": { + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, + "@material-ui/core>@material-ui/styles>jss-plugin-global": true, + "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, + "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, + "@material-ui/core>@material-ui/styles>jss": true, + "prop-types": true, + "react": true } }, - "@metamask/ethjs>@metamask/ethjs-unit": { + "@material-ui/core>@material-ui/system": { + "globals": { + "console.error": true + }, "packages": { - "@metamask/ethjs>@metamask/number-to-bn": true, - "bn.js": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "prop-types": true } }, - "@metamask/ethjs>@metamask/ethjs-util": { + "@material-ui/core>@material-ui/utils": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "browserify>buffer": true + "@babel/runtime": true, + "prop-types": true, + "prop-types>react-is": true } }, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "@metamask/abi-utils": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + "@metamask/utils>@metamask/superstruct": true, + "@metamask/abi-utils>@metamask/utils": true } }, - "@metamask/ethjs>@metamask/number-to-bn": { + "@metamask/accounts-controller": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, + "@metamask/eth-snap-keyring": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "uuid": true } }, - "@metamask/ethjs>ethjs-abi": { + "@metamask/address-book-controller": { "packages": { - "@metamask/ethjs>ethjs-abi>number-to-bn": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true } }, - "@metamask/ethjs>ethjs-abi>number-to-bn": { + "@metamask/announcement-controller": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true + "@metamask/announcement-controller>@metamask/base-controller": true } }, - "@metamask/ethjs>js-sha3": { + "@metamask/approval-controller": { "globals": { - "define": true + "console.info": true }, "packages": { - "process": true + "@metamask/base-controller": true, + "@metamask/rpc-errors": true, + "nanoid": true } }, - "@metamask/gas-fee-controller": { + "@metamask/assets-controllers": { "globals": { + "AbortController": true, + "Headers": true, + "URL": true, + "URLSearchParams": true, "clearInterval": true, + "clearTimeout": true, "console.error": true, - "setInterval": true + "console.log": true, + "setInterval": true, + "setTimeout": true }, "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/abi-utils": true, + "@metamask/base-controller": true, + "@metamask/contract-metadata": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, + "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, "bn.js": true, + "cockatiel": true, + "lodash": true, + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, + "single-call-balance-checker-abi": true, "uuid": true } }, - "@metamask/jazzicon": { + "@metamask/base-controller": { "globals": { - "document.createElement": true, - "document.createElementNS": true + "setTimeout": true }, "packages": { - "@metamask/jazzicon>color": true, - "@metamask/jazzicon>mersenne-twister": true + "immer": true } }, - "@metamask/jazzicon>color": { + "@metamask/announcement-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/jazzicon>color>clone": true, - "@metamask/jazzicon>color>color-convert": true, - "@metamask/jazzicon>color>color-string": true + "immer": true } }, - "@metamask/jazzicon>color>clone": { + "@metamask/name-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "browserify>buffer": true + "immer": true } }, - "@metamask/jazzicon>color>color-convert": { + "@metamask/rate-limit-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/jazzicon>color>color-convert>color-name": true + "immer": true } }, - "@metamask/jazzicon>color>color-string": { + "@metamask/browser-passworder": { + "globals": { + "CryptoKey": true, + "btoa": true, + "crypto.getRandomValues": true, + "crypto.subtle.decrypt": true, + "crypto.subtle.deriveKey": true, + "crypto.subtle.encrypt": true, + "crypto.subtle.exportKey": true, + "crypto.subtle.importKey": true + }, "packages": { - "jest-canvas-mock>moo-color>color-name": true + "@metamask/browser-passworder>@metamask/utils": true, + "browserify>buffer": true } }, - "@metamask/json-rpc-engine": { - "packages": { - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "@metamask/utils": true + "eth-keyring-controller>@metamask/browser-passworder": { + "globals": { + "crypto": true } }, - "@metamask/json-rpc-middleware-stream": { + "@metamask/controller-utils": { "globals": { - "console.warn": true, + "URL": true, + "console.error": true, + "fetch": true, "setTimeout": true }, "packages": { - "@metamask/safe-event-emitter": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, "@metamask/utils": true, - "readable-stream": true + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "bn.js": true, + "browserify>buffer": true, + "eth-ens-namehash": true, + "eslint>fast-deep-equal": true } }, - "@metamask/keyring-api": { - "globals": { - "URL": true - }, + "@metamask/ens-controller": { "packages": { - "@metamask/keyring-api>@metamask/utils": true, - "@metamask/keyring-api>bech32": true, - "@metamask/keyring-api>uuid": true, - "@metamask/utils>@metamask/superstruct": true + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "punycode": true } }, - "@metamask/keyring-api>@metamask/utils": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "clearTimeout": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/safe-event-emitter": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true, + "pify": true } }, - "@metamask/keyring-api>uuid": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { - "crypto": true - } - }, - "@metamask/keyring-controller": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/base-controller": true, - "@metamask/browser-passworder": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, - "@metamask/keyring-controller>@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, - "@metamask/keyring-controller>ethereumjs-wallet": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/utils": true + "@metamask/safe-event-emitter": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { @@ -1502,518 +984,459 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, "@metamask/scure-bip39": true, - "browserify>buffer": true + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { + "@metamask/eth-json-rpc-filters": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "console.error": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/safe-event-emitter": true, + "@metamask/name-controller>async-mutex": true, + "pify": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "globals": { + "fetch": true, + "setTimeout": true + }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true + "@metamask/eth-json-rpc-provider": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { + "@metamask/eth-json-rpc-middleware": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "URL": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/eth-sig-util": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/eth-json-rpc-middleware>@metamask/utils": true, + "@metamask/eth-json-rpc-middleware>klona": true, + "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": { + "@metamask/eth-json-rpc-provider": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, - "browserify>buffer": true, - "crypto-browserify>randombytes": true + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "uuid": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "@metamask/eth-ledger-bridge-keyring": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "addEventListener": true, + "console.error": true, + "document.createElement": true, + "document.head.appendChild": true, + "fetch": true, + "removeEventListener": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, + "@metamask/eth-sig-util": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/keyring-controller>ethereumjs-wallet": { + "@metamask/eth-query": { "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, - "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, - "browserify>buffer": true, - "crypto-browserify": true, - "crypto-browserify>randombytes": true, - "eth-lattice-keyring>gridplus-sdk>aes-js": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "uuid": true + "@metamask/eth-query>json-rpc-random-id": true, + "watchify>xtend": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "@metamask/eth-sig-util": { "packages": { - "browserify>assert": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ethers>@ethersproject/sha2>hash.js": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true, - "bn.js": true, - "browserify>assert": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true - } - }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { - "packages": { - "bn.js": true, - "browserify>buffer": true - } - }, - "@metamask/logging-controller": { - "packages": { - "@metamask/base-controller": true, - "uuid": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/logo": { - "globals": { - "addEventListener": true, - "document.body.appendChild": true, - "document.createElementNS": true, - "innerHeight": true, - "innerWidth": true, - "requestAnimationFrame": true - }, + "@metamask/keyring-controller>@metamask/eth-sig-util": { "packages": { - "@metamask/logo>gl-mat4": true, - "@metamask/logo>gl-vec3": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/message-manager": { + "@metamask/signature-controller>@metamask/eth-sig-util": { "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/utils": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/message-manager>jsonschema": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring": { "packages": { - "browserify>url": true - } - }, - "@metamask/message-signing-snap>@noble/ciphers": { - "globals": { - "TextDecoder": true, - "TextEncoder": true, - "crypto": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "crypto-browserify>randombytes": true } }, - "@metamask/message-signing-snap>@noble/curves": { + "@metamask/eth-snap-keyring": { "globals": { - "TextEncoder": true + "URL": true, + "console.error": true }, "packages": { - "@noble/hashes": true + "@ethereumjs/tx": true, + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, + "@metamask/keyring-api": true, + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, + "webpack>events": true, + "@metamask/eth-snap-keyring>uuid": true } }, - "@metamask/name-controller": { + "@metamask/eth-token-tracker": { "globals": { - "fetch": true + "console.warn": true }, "packages": { - "@metamask/controller-utils": true, - "@metamask/name-controller>@metamask/base-controller": true, - "@metamask/name-controller>@metamask/utils": true, - "@metamask/name-controller>async-mutex": true + "@babel/runtime": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true, + "@metamask/safe-event-emitter": true, + "bn.js": true, + "@metamask/eth-token-tracker>deep-equal": true, + "human-standard-token-abi": true } }, - "@metamask/name-controller>@metamask/base-controller": { + "@metamask/eth-trezor-keyring": { "globals": { "setTimeout": true }, "packages": { - "immer": true + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, + "@trezor/connect-web": true, + "browserify>buffer": true, + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/name-controller>@metamask/utils": { + "@metamask/etherscan-link": { "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "URL": true } }, - "@metamask/name-controller>async-mutex": { + "@metamask/ethjs": { "globals": { - "clearTimeout": true, - "setTimeout": true + "clearInterval": true, + "setInterval": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-provider-http": true, + "@metamask/ethjs-query": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true } }, - "@metamask/network-controller": { - "globals": { - "btoa": true, - "fetch": true, - "setTimeout": true - }, + "@metamask/ethjs-contract": { "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-json-rpc-provider": true, - "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/network-controller>reselect": true, - "browserify>assert": true, - "browserify>util": true, - "uri-js": true, - "uuid": true + "@babel/runtime": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true, + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "@metamask/ethjs>@metamask/ethjs-filter": { "globals": { - "setTimeout": true - }, + "clearInterval": true, + "setInterval": true + } + }, + "@metamask/ethjs-query>@metamask/ethjs-format": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "node-fetch": true + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": { + "@metamask/ethjs>@metamask/ethjs-provider-http": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/safe-event-emitter": true + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": { + "@metamask/ethjs-query": { + "globals": { + "console": true + }, "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/ethjs-query>@metamask/ethjs-format": true, + "@metamask/ethjs-query>@metamask/ethjs-rpc": true, + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": { + "@metamask/ethjs-query>@metamask/ethjs-rpc": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/ethjs>@metamask/ethjs-unit": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/ethjs>@metamask/ethjs-util": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": { + "@metamask/gas-fee-controller": { "globals": { - "URL": true, + "clearInterval": true, "console.error": true, - "setTimeout": true + "setInterval": true }, "packages": { - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/polling-controller": true, "bn.js": true, - "pify": true + "uuid": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { + "@metamask/jazzicon": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "document.createElement": true, + "document.createElementNS": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/jazzicon>color": true, + "@metamask/jazzicon>mersenne-twister": true } }, - "@metamask/network-controller>@metamask/json-rpc-engine": { + "@metamask/json-rpc-engine": { "packages": { - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "@metamask/utils": true } }, - "@metamask/network-controller>@metamask/rpc-errors": { + "@metamask/json-rpc-middleware-stream": { + "globals": { + "console.warn": true, + "setTimeout": true + }, "packages": { - "@metamask/network-controller>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true + "@metamask/safe-event-emitter": true, + "@metamask/utils": true, + "readable-stream": true } }, - "@metamask/network-controller>@metamask/utils": { + "@metamask/snaps-sdk>@metamask/key-tree": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "crypto.subtle": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, + "@metamask/scure-bip39": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>reselect": { - "globals": { - "WeakRef": true, - "console.warn": true, - "unstable_autotrackMemoize": true + "@metamask/utils>@scure/base": true } }, - "@metamask/notification-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/keyring-api": { + "packages": { + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-api>@metamask/utils": true, + "@metamask/keyring-api>bech32": true } }, - "@metamask/notification-services-controller": { - "globals": { - "Intl.NumberFormat": true, - "addEventListener": true, - "fetch": true, - "registration": true, - "removeEventListener": true - }, + "@metamask/keyring-controller": { "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, - "@metamask/notification-services-controller>bignumber.js": true, - "@metamask/notification-services-controller>firebase": true, - "@metamask/profile-sync-controller": true, + "@metamask/browser-passworder": true, + "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, + "@metamask/keyring-controller>@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/utils": true, - "loglevel": true, - "uuid": true + "@metamask/name-controller>async-mutex": true, + "@metamask/keyring-controller>ethereumjs-wallet": true } }, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { - "globals": { - "SuppressedError": true + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": { + "packages": { + "@metamask/keyring-snap-client": true } }, - "@metamask/notification-services-controller>bignumber.js": { + "@metamask/keyring-snap-client": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-snap-client>uuid": true + } + }, + "@metamask/keyring-api>@metamask/keyring-utils": { "globals": { - "crypto": true, - "define": true + "URL": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": true } }, - "@metamask/notification-services-controller>firebase": { + "@metamask/logging-controller": { "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/messaging": true + "@metamask/base-controller": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app": { - "globals": { - "FinalizationRegistry": true, - "console.warn": true + "@metamask/logo": { + "globals": { + "addEventListener": true, + "document.body.appendChild": true, + "document.createElementNS": true, + "innerHeight": true, + "innerWidth": true, + "requestAnimationFrame": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/logo>gl-mat4": true, + "@metamask/logo>gl-vec3": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { + "@metamask/message-manager": { "packages": { - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "browserify>buffer": true, + "webpack>events": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { + "@metamask/name-controller": { "globals": { - "console": true + "fetch": true }, "packages": { - "@swc/helpers>tslib": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": { - "globals": { - "DOMException": true, - "IDBCursor": true, - "IDBDatabase": true, - "IDBIndex": true, - "IDBObjectStore": true, - "IDBRequest": true, - "IDBTransaction": true, - "indexedDB.deleteDatabase": true, - "indexedDB.open": true + "@metamask/name-controller>@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/name-controller>@metamask/utils": true, + "@metamask/name-controller>async-mutex": true } }, - "@metamask/notification-services-controller>firebase>@firebase/installations": { + "@metamask/network-controller": { "globals": { - "BroadcastChannel": true, - "Headers": true, "btoa": true, - "console.error": true, - "crypto": true, "fetch": true, - "msCrypto": true, - "navigator.onLine": true, "setTimeout": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, + "@metamask/eth-json-rpc-middleware": true, + "@metamask/eth-json-rpc-provider": true, + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/utils": true, + "eslint>fast-deep-equal": true, + "reselect": true, + "uri-js": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/messaging": { + "@metamask/transaction-controller>@metamask/nonce-tracker": { + "packages": { + "@ethersproject/providers": true, + "browserify>assert": true, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true + } + }, + "@metamask/notification-services-controller": { "globals": { - "Headers": true, - "Notification.maxActions": true, - "Notification.permission": true, - "Notification.requestPermission": true, - "PushSubscription.prototype.hasOwnProperty": true, - "ServiceWorkerRegistration": true, - "URL": true, + "Intl.NumberFormat": true, "addEventListener": true, - "atob": true, - "btoa": true, - "clients.matchAll": true, - "clients.openWindow": true, - "console.warn": true, - "document": true, "fetch": true, - "indexedDB": true, - "location.href": true, - "location.origin": true, - "navigator": true, - "origin.replace": true, - "registration.showNotification": true, - "setTimeout": true + "registration": true, + "removeEventListener": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/installations": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true, - "@swc/helpers>tslib": true + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/profile-sync-controller": true, + "@metamask/utils": true, + "@metamask/notification-services-controller>bignumber.js": true, + "@metamask/notification-services-controller>firebase": true, + "loglevel": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/util": { - "globals": { - "atob": true, - "browser": true, - "btoa": true, - "chrome": true, - "console": true, - "document": true, - "indexedDB": true, - "navigator": true, - "process": true, - "self": true, - "setTimeout": true - }, + "@metamask/ethjs>@metamask/number-to-bn": { "packages": { - "process": true + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, "@metamask/object-multiplex": { @@ -2025,11 +1448,6 @@ "readable-stream": true } }, - "@metamask/object-multiplex>once": { - "packages": { - "@metamask/object-multiplex>once>wrappy": true - } - }, "@metamask/obs-store": { "packages": { "@metamask/safe-event-emitter": true, @@ -2044,16 +1462,11 @@ "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/json-rpc-engine": true, - "@metamask/permission-controller>nanoid": true, "@metamask/rpc-errors": true, "@metamask/utils": true, "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/permission-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "immer": true, + "nanoid": true } }, "@metamask/permission-log-controller": { @@ -2062,21 +1475,6 @@ "@metamask/permission-log-controller>@metamask/utils": true } }, - "@metamask/permission-log-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/phishing-controller": { "globals": { "TextEncoder": true, @@ -2085,12 +1483,12 @@ "fetch": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/base-controller": true, "@metamask/controller-utils": true, "@noble/hashes": true, - "punycode": true, - "webpack-cli>fastest-levenshtein": true + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack-cli>fastest-levenshtein": true, + "punycode": true } }, "@metamask/polling-controller": { @@ -2121,21 +1519,6 @@ "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2145,48 +1528,11 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, - "@metamask/eth-query>json-rpc-random-id": true, + "await-semaphore": true, + "browserify>buffer": true, "@metamask/ppom-validator>crypto-js": true, "@metamask/ppom-validator>elliptic": true, - "await-semaphore": true, - "browserify>buffer": true - } - }, - "@metamask/ppom-validator>crypto-js": { - "globals": { - "crypto": true, - "define": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "@metamask/ppom-validator>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic>hmac-drbg": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "ethers>@ethersproject/sha2>hash.js": true + "@metamask/eth-query>json-rpc-random-id": true } }, "@metamask/preferences-controller": { @@ -2208,55 +1554,18 @@ "dispatchEvent": true, "fetch": true, "removeEventListener": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/message-signing-snap>@noble/ciphers": true, - "@metamask/profile-sync-controller>siwe": true, - "@noble/hashes": true, - "browserify>buffer": true, - "loglevel": true - } - }, - "@metamask/profile-sync-controller>siwe": { - "globals": { - "console.error": true, - "console.warn": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random": true, - "ethers": true - } - }, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, - "browserify>browser-resolve": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "setTimeout": true + }, "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + "@metamask/base-controller": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/network-controller": true, + "@metamask/profile-sync-controller>@noble/ciphers": true, + "@noble/hashes": true, + "browserify>buffer": true, + "loglevel": true, + "@metamask/profile-sync-controller>siwe": true } }, "@metamask/queued-request-controller": { @@ -2278,64 +1587,22 @@ "@metamask/rate-limit-controller>@metamask/utils": true } }, - "@metamask/rate-limit-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, + "@metamask/remote-feature-flag-controller": { "packages": { - "immer": true + "@metamask/base-controller": true, + "cockatiel": true } }, - "@metamask/rate-limit-controller>@metamask/rpc-errors": { + "@metamask/rpc-errors": { "packages": { - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/utils": true, "@metamask/rpc-errors>fast-safe-stringify": true } }, - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rate-limit-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rpc-errors": { + "@metamask/rate-limit-controller>@metamask/rpc-errors": { "packages": { - "@metamask/rpc-errors>fast-safe-stringify": true, - "@metamask/utils": true - } - }, - "@metamask/rpc-methods-flask>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/rpc-methods>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/rpc-errors>fast-safe-stringify": true } }, "@metamask/safe-event-emitter": { @@ -2355,12 +1622,6 @@ "@metamask/utils>@scure/base": true } }, - "@metamask/scure-bip39>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true - } - }, "@metamask/selected-network-controller": { "packages": { "@metamask/base-controller": true, @@ -2374,40 +1635,14 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/keyring-controller": true, "@metamask/logging-controller": true, - "@metamask/message-manager>jsonschema": true, - "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/utils": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/message-manager>jsonschema": true, + "uuid": true } }, "@metamask/smart-transactions-controller": { @@ -2420,72 +1655,19 @@ "setInterval": true }, "packages": { + "@metamask/smart-transactions-controller>@ethereumjs/tx": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, "@ethersproject/bytes": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "@metamask/smart-transactions-controller>@metamask/polling-controller": true, - "@metamask/smart-transactions-controller>bignumber.js": true, + "@metamask/polling-controller": true, "@metamask/transaction-controller": true, + "@metamask/smart-transactions-controller>bignumber.js": true, "browserify>buffer": true, "fast-json-patch": true, "lodash": true } }, - "@metamask/smart-transactions-controller>@ethereumjs/tx": { - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { - "packages": { - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/util": { - "globals": { - "console.warn": true, - "fetch": true - }, - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/smart-transactions-controller>@metamask/polling-controller": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "uuid": true - } - }, - "@metamask/smart-transactions-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, "@metamask/snaps-controllers": { "globals": { "DecompressionStream": true, @@ -2503,364 +1685,498 @@ "@metamask/permission-controller": true, "@metamask/post-message-stream": true, "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@xstate/fsm": true, - "@metamask/snaps-controllers>concat-stream": true, - "@metamask/snaps-controllers>get-npm-tarball-url": true, - "@metamask/snaps-controllers>nanoid": true, - "@metamask/snaps-controllers>readable-web-to-node-stream": true, - "@metamask/snaps-controllers>tar-stream": true, + "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/snaps-rpc-methods": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/utils": true, + "@metamask/snaps-controllers>@xstate/fsm": true, "browserify>browserify-zlib": true, + "@metamask/snaps-controllers>concat-stream": true, "eslint>fast-deep-equal": true, + "@metamask/snaps-controllers>get-npm-tarball-url": true, "immer": true, + "nanoid": true, "readable-stream": true, - "semver": true + "@metamask/snaps-controllers>readable-web-to-node-stream": true, + "semver": true, + "@metamask/snaps-controllers>tar-stream": true } }, - "@metamask/snaps-controllers-flask>nanoid": { + "@metamask/snaps-execution-environments": { "globals": { - "crypto.getRandomValues": true + "document.getElementById": true + }, + "packages": { + "@metamask/post-message-stream": true, + "@metamask/snaps-utils": true, + "@metamask/utils": true } }, - "@metamask/snaps-controllers>concat-stream": { + "@metamask/snaps-utils>@metamask/snaps-registry": { + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true + } + }, + "@metamask/snaps-rpc-methods": { + "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, + "@metamask/permission-controller": true, + "@metamask/rpc-errors": true, + "@metamask/snaps-sdk": true, + "@metamask/snaps-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true + } + }, + "@metamask/snaps-sdk": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true + } + }, + "@metamask/snaps-utils": { + "globals": { + "File": true, + "FileReader": true, + "TextDecoder": true, + "TextEncoder": true, + "URL": true, + "console.error": true, + "console.log": true, + "console.warn": true, + "crypto": true, + "document.body.appendChild": true, + "document.createElement": true, + "fetch": true + }, + "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, + "@metamask/permission-controller": true, + "@metamask/rpc-errors": true, + "@metamask/snaps-utils>@metamask/slip44": true, + "@metamask/snaps-sdk": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "chalk": true, + "@metamask/snaps-utils>cron-parser": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "@metamask/snaps-utils>fast-xml-parser": true, + "@metamask/snaps-utils>marked": true, + "@metamask/snaps-utils>rfdc": true, + "semver": true, + "@metamask/snaps-utils>validate-npm-package-name": true + } + }, + "@metamask/transaction-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, "packages": { + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/abi": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/metamask-eth-abis": true, + "@metamask/network-controller": true, + "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, + "bn.js": true, "browserify>buffer": true, - "browserify>concat-stream>typedarray": true, - "pumpify>inherits": true, - "readable-stream": true, - "terser>source-map-support>buffer-from": true + "eth-method-registry": true, + "webpack>events": true, + "fast-json-patch": true, + "lodash": true, + "uuid": true } }, - "@metamask/snaps-controllers>nanoid": { + "@metamask/user-operation-controller": { "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/snaps-controllers>readable-web-to-node-stream": { - "packages": { - "readable-stream": true - } - }, - "@metamask/snaps-controllers>tar-stream": { + "fetch": true + }, "packages": { - "@metamask/snaps-controllers>tar-stream>b4a": true, - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx": true, - "browserify>browser-resolve": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/transaction-controller": true, + "@metamask/utils": true, + "bn.js": true, + "webpack>events": true, + "lodash": true, + "uuid": true } }, - "@metamask/snaps-controllers>tar-stream>b4a": { + "@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx": { + }, "packages": { - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true, - "webpack>events": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { - "globals": { - "queueMicrotask": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-execution-environments": { + "@metamask/abi-utils>@metamask/utils": { "globals": { - "document.getElementById": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/post-message-stream": true, - "@metamask/snaps-utils": true, - "@metamask/utils": true - } - }, - "@metamask/snaps-rpc-methods": { - "packages": { - "@metamask/permission-controller": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk": { + "@metamask/browser-passworder>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk>@metamask/key-tree": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/scure-bip39": true, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": { + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils": { + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { "globals": { - "File": true, - "FileReader": true, "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true + "TextEncoder": true }, "packages": { - "@metamask/permission-controller": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, "@noble/hashes": true, - "chalk": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils>@metamask/snaps-registry": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>cron-parser": { + "@metamask/eth-json-rpc-middleware>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>browser-resolve": true, - "luxon": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>fast-xml-parser": { + "@metamask/eth-sig-util>@metamask/utils": { "globals": { - "entityName": true, - "val": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/snaps-utils>fast-xml-parser>strnum": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>marked": { + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { "globals": { - "console.error": true, - "console.warn": true, - "define": true - } - }, - "@metamask/snaps-utils>rfdc": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>buffer": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name": { + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/snaps-utils>validate-npm-package-name>builtins": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name>builtins": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "process": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/test-bundler>@ethersproject/networks": { + "@metamask/eth-snap-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "ethers>@ethersproject/logger": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller": { + "@metamask/keyring-api>@metamask/utils": { "globals": { - "clearTimeout": true, - "console.error": true, - "fetch": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/abi": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/network-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller>@metamask/nonce-tracker": true, - "@metamask/utils": true, - "bn.js": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "eth-method-registry": true, - "fast-json-patch": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker": { + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@ethersproject/providers": true, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true, - "browserify>assert": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "@metamask/name-controller>@metamask/utils": { "globals": { - "clearTimeout": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller": { + "@metamask/permission-log-controller>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/polling-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller": true, - "@metamask/user-operation-controller>@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "bn.js": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller>@metamask/utils": { + "@metamask/post-message-stream>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils": { + "@metamask/rate-limit-controller>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils>@scure/base": { + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, "@ngraveio/bc-ur": { "packages": { "@ngraveio/bc-ur>@keystonehq/alias-sampling": true, + "browserify>assert": true, "@ngraveio/bc-ur>bignumber.js": true, + "browserify>buffer": true, "@ngraveio/bc-ur>cbor-sync": true, "@ngraveio/bc-ur>crc": true, "@ngraveio/bc-ur>jsbi": true, - "addons-linter>sha.js": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@ngraveio/bc-ur>assert>object-is": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true + "addons-linter>sha.js": true } }, - "@ngraveio/bc-ur>bignumber.js": { + "@metamask/profile-sync-controller>@noble/ciphers": { "globals": { - "crypto": true, - "define": true + "TextDecoder": true, + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>cbor-sync": { + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": { "globals": { - "define": true + "TextEncoder": true }, "packages": { - "browserify>buffer": true + "@noble/hashes": true } }, - "@ngraveio/bc-ur>crc": { - "packages": { - "browserify>buffer": true + "@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>jsbi": { + "@metamask/scure-bip39>@noble/hashes": { "globals": { - "define": true + "TextEncoder": true, + "crypto": true } }, - "@noble/hashes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { "globals": { "TextEncoder": true, "crypto": true @@ -2877,6 +2193,20 @@ "navigator.userAgent": true } }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { + "globals": { + "console.log": true + } + }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { + "globals": { + "XMLHttpRequest": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + } + }, "@reduxjs/toolkit": { "globals": { "AbortController": true, @@ -2888,42 +2218,46 @@ "setTimeout": true }, "packages": { - "@reduxjs/toolkit>reselect": true, "immer": true, "process": true, "redux": true, - "redux-thunk": true + "redux-thunk": true, + "@reduxjs/toolkit>reselect": true } }, - "@segment/loosely-validate-event": { - "packages": { - "@segment/loosely-validate-event>component-type": true, - "@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@sentry/browser": { + "react-router-dom-v5-compat>@remix-run/router": { "globals": { - "PerformanceObserver.supportedEntryTypes": true, + "AbortController": true, + "DOMException": true, + "FormData": true, + "Headers": true, "Request": true, + "Response": true, "URL": true, - "XMLHttpRequest.prototype": true, - "__SENTRY_DEBUG__": true, - "__SENTRY_RELEASE__": true, - "addEventListener": true, - "console.error": true, - "indexedDB.open": true, - "performance.timeOrigin": true, - "setTimeout": true - }, + "URLSearchParams": true, + "console": true, + "document.defaultView": true + } + }, + "@metamask/utils>@scure/base": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + } + }, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { "packages": { - "@sentry/browser>@sentry-internal/browser-utils": true, - "@sentry/browser>@sentry-internal/feedback": true, - "@sentry/browser>@sentry-internal/replay": true, - "@sentry/browser>@sentry-internal/replay-canvas": true, - "@sentry/browser>@sentry/core": true, - "@sentry/utils": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true + } + }, + "@segment/loosely-validate-event": { + "packages": { + "browserify>assert": true, + "browserify>buffer": true, + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true } }, "@sentry/browser>@sentry-internal/browser-utils": { @@ -2962,6 +2296,25 @@ "@sentry/utils": true } }, + "@sentry/browser>@sentry-internal/replay-canvas": { + "globals": { + "Blob": true, + "HTMLCanvasElement": true, + "HTMLImageElement": true, + "ImageData": true, + "URL.createObjectURL": true, + "WeakRef": true, + "Worker": true, + "cancelAnimationFrame": true, + "console.error": true, + "createImageBitmap": true, + "document": true + }, + "packages": { + "@sentry/browser>@sentry/core": true, + "@sentry/utils": true + } + }, "@sentry/browser>@sentry-internal/replay": { "globals": { "Blob": true, @@ -3011,21 +2364,25 @@ "@sentry/utils": true } }, - "@sentry/browser>@sentry-internal/replay-canvas": { + "@sentry/browser": { "globals": { - "Blob": true, - "HTMLCanvasElement": true, - "HTMLImageElement": true, - "ImageData": true, - "URL.createObjectURL": true, - "WeakRef": true, - "Worker": true, - "cancelAnimationFrame": true, + "PerformanceObserver.supportedEntryTypes": true, + "Request": true, + "URL": true, + "XMLHttpRequest.prototype": true, + "__SENTRY_DEBUG__": true, + "__SENTRY_RELEASE__": true, + "addEventListener": true, "console.error": true, - "createImageBitmap": true, - "document": true + "indexedDB.open": true, + "performance.timeOrigin": true, + "setTimeout": true }, "packages": { + "@sentry/browser>@sentry-internal/browser-utils": true, + "@sentry/browser>@sentry-internal/feedback": true, + "@sentry/browser>@sentry-internal/replay-canvas": true, + "@sentry/browser>@sentry-internal/replay": true, "@sentry/browser>@sentry/core": true, "@sentry/utils": true } @@ -3121,20 +2478,61 @@ "btoa": true } }, - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { + "@metamask/controller-utils>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "react-markdown>unist-util-visit": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@storybook/addon-knobs>qs": { + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@swc/helpers>tslib": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + } + }, + "@metamask/profile-sync-controller>siwe>@stablelib/random": { "globals": { - "SuppressedError": true, - "define": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, + "browserify>browser-resolve": true + } + }, + "@trezor/connect-web>@trezor/connect-common": { + "globals": { + "console.warn": true, + "localStorage.getItem": true, + "localStorage.setItem": true, + "navigator": true, + "setTimeout": true, + "window": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true + } + }, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { + "packages": { + "@metamask/eth-sig-util": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web": { @@ -3161,35 +2559,20 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/connect-common": true, + "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/utils": true, - "webpack>events": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect": { "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, "@trezor/connect-web>@trezor/connect>@trezor/transport": true, - "@trezor/connect-web>@trezor/utils": true - } - }, - "@trezor/connect-web>@trezor/connect-common": { - "globals": { - "console.warn": true, - "localStorage.getItem": true, - "localStorage.setItem": true, - "navigator": true, - "setTimeout": true, - "window": true - }, - "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, - "@trezor/connect-web>@trezor/utils": true + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": { @@ -3205,54 +2588,17 @@ "screen.width": true }, "packages": { + "process": true, "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true, - "process": true - } - }, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { - "globals": { - "define": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true } }, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": { "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, - "browserify>buffer": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { - "globals": { - "process": true, - "setTimeout": true - }, - "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { - "globals": { - "console.log": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { - "globals": { - "XMLHttpRequest": true - }, - "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + "browserify>buffer": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": { @@ -3279,16 +2625,10 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/utils>bignumber.js": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@trezor/connect-web>@trezor/utils>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@welldone-software/why-did-you-render": { @@ -3299,63 +2639,197 @@ "console.groupEnd": true, "console.log": true, "console.warn": true, - "define": true, + "define": true, + "setTimeout": true + }, + "packages": { + "lodash": true, + "react": true + } + }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, + "@zxing/library": { + "globals": { + "HTMLImageElement": true, + "HTMLVideoElement": true, + "TextDecoder": true, + "TextEncoder": true, + "URL.createObjectURL": true, + "btoa": true, + "console.log": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library>ts-custom-error": true + } + }, + "@lavamoat/lavapack>readable-stream>abort-controller": { + "globals": { + "AbortController": true + } + }, + "currency-formatter>accounting": { + "globals": { + "define": true + } + }, + "ethers>@ethersproject/json-wallets>aes-js": { + "globals": { + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>aes-js": { + "globals": { + "define": true + } + }, + "chalk>ansi-styles": { + "packages": { + "chalk>ansi-styles>color-convert": true + } + }, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { + "packages": { + "browserify>buffer": true + } + }, + "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true + } + }, + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "browserify>vm-browserify": true + } + }, + "browserify>assert": { + "globals": { + "Buffer": true + }, + "packages": { + "react>object-assign": true, + "browserify>assert>util": true + } + }, + "@metamask/name-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "string.prototype.matchall>es-abstract>available-typed-arrays": { + "packages": { + "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + } + }, + "await-semaphore": { + "packages": { + "process": true, + "browserify>timers-browserify": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { + "globals": { + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, + "console.warn": true, + "document": true, + "location.href": true, + "navigator": true, "setTimeout": true }, "packages": { - "lodash": true, - "react": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/browser": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { "globals": { - "HTMLElement": true, - "HTMLImageElement": true, - "HTMLVideoElement": true, - "clearTimeout": true, - "console.error": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/library": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { "globals": { - "HTMLImageElement": true, - "HTMLVideoElement": true, - "TextDecoder": true, - "TextEncoder": true, - "URL.createObjectURL": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, "btoa": true, - "console.log": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library>ts-custom-error": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "addons-linter>sha.js": { - "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@metamask/snaps-controllers>tar-stream>b4a": { + "globals": { + "TextDecoder": true, + "TextEncoder": true } }, - "await-semaphore": { + "@ensdomains/content-hash>multihashes>multibase>base-x": { "packages": { - "browserify>timers-browserify": true, - "process": true - } - }, - "axios>form-data": { - "globals": { - "FormData": true + "koa>content-disposition>safe-buffer": true } }, "base32-encode": { @@ -3369,6 +2843,53 @@ "define": true } }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/notification-services-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/smart-transactions-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@ngraveio/bc-ur>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@trezor/connect-web>@trezor/utils>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bitwise": { + "packages": { + "browserify>buffer": true + } + }, "blo": { "globals": { "btoa": true @@ -3382,132 +2903,147 @@ "browserify>browser-resolve": true } }, + "eth-lattice-keyring>gridplus-sdk>borc": { + "globals": { + "console": true + }, + "packages": { + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "browserify>buffer": true, + "buffer>ieee754": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + } + }, "bowser": { "globals": { "define": true } }, - "browserify>assert": { + "@metamask/ppom-validator>elliptic>brorand": { "globals": { - "Buffer": true + "crypto": true, + "msCrypto": true }, "packages": { - "browserify>assert>util": true, - "react>object-assign": true + "browserify>browser-resolve": true } }, - "browserify>assert>util": { - "globals": { - "console.error": true, - "console.log": true, - "console.trace": true, - "process": true - }, + "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { - "browserify>assert>util>inherits": true, - "process": true + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>browserify-zlib": { + "crypto-browserify>browserify-cipher": { + "packages": { + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "crypto-browserify>browserify-cipher>browserify-des": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des": { "packages": { - "browserify>assert": true, - "browserify>browserify-zlib>pako": true, "browserify>buffer": true, - "browserify>util": true, - "process": true, - "stream-browserify": true + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>browserify-des>des.js": true, + "pumpify>inherits": true } }, - "browserify>buffer": { - "globals": { - "console": true - }, + "crypto-browserify>public-encrypt>browserify-rsa": { "packages": { - "base64-js": true, - "buffer>ieee754": true + "bn.js": true, + "browserify>buffer": true, + "crypto-browserify>randombytes": true } }, - "browserify>punycode": { - "globals": { - "define": true + "crypto-browserify>browserify-sign": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>create-hmac": true, + "@metamask/ppom-validator>elliptic": true, + "pumpify>inherits": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "stream-browserify": true } }, - "browserify>string_decoder": { + "browserify>browserify-zlib": { "packages": { - "koa>content-disposition>safe-buffer": true + "browserify>assert": true, + "browserify>buffer": true, + "browserify>browserify-zlib>pako": true, + "process": true, + "stream-browserify": true, + "browserify>util": true } }, - "browserify>timers-browserify": { - "globals": { - "clearInterval": true, - "clearTimeout": true, - "setInterval": true, - "setTimeout": true - }, + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { "packages": { - "process": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true } }, - "browserify>url": { + "ethereumjs-util>ethereum-cryptography>bs58check": { "packages": { - "@storybook/addon-knobs>qs": true, - "browserify>punycode": true + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, + "ethereumjs-util>create-hash": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>util": { + "buffer": { "globals": { - "console.error": true, - "console.log": true, - "console.trace": true + "console": true }, "packages": { - "browserify>util>is-arguments": true, - "browserify>util>is-typed-array": true, - "browserify>util>which-typed-array": true, - "koa>is-generator-function": true, - "process": true, - "pumpify>inherits": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>is-arguments": { + "terser>source-map-support>buffer-from": { "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "browserify>buffer": true } }, - "browserify>util>is-typed-array": { + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { "packages": { - "browserify>util>which-typed-array": true + "browserify>buffer": true } }, - "browserify>util>which-typed-array": { + "browserify>buffer": { + "globals": { + "console": true + }, "packages": { - "browserify>util>which-typed-array>for-each": true, - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>available-typed-arrays": true, - "string.prototype.matchall>es-abstract>gopd": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>which-typed-array>for-each": { + "@metamask/snaps-utils>validate-npm-package-name>builtins": { "packages": { - "string.prototype.matchall>es-abstract>is-callable": true + "process": true, + "semver": true } }, - "browserify>vm-browserify": { - "globals": { - "document.body.appendChild": true, - "document.body.removeChild": true, - "document.createElement": true + "string.prototype.matchall>call-bind": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>call-bind>set-function-length": true } }, - "buffer": { + "@ngraveio/bc-ur>cbor-sync": { "globals": { - "console": true + "define": true }, "packages": { - "base64-js": true, - "buffer>ieee754": true + "browserify>buffer": true } }, "chalk": { @@ -3516,16 +3052,6 @@ "chalk>supports-color": true } }, - "chalk>ansi-styles": { - "packages": { - "chalk>ansi-styles>color-convert": true - } - }, - "chalk>ansi-styles>color-convert": { - "packages": { - "jest-canvas-mock>moo-color>color-name": true - } - }, "chart.js": { "globals": { "Intl.NumberFormat": true, @@ -3547,9 +3073,20 @@ "chart.js>@kurkle/color": true } }, - "chart.js>@kurkle/color": { - "globals": { - "define": true + "@ensdomains/content-hash>cids": { + "packages": { + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>cids>multihashes": true, + "@ensdomains/content-hash>cids>uint8arrays": true + } + }, + "ethereumjs-util>create-hash>cipher-base": { + "packages": { + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true, + "stream-browserify": true, + "browserify>string_decoder": true } }, "classnames": { @@ -3558,6 +3095,11 @@ "define": true } }, + "@metamask/jazzicon>color>clone": { + "packages": { + "browserify>buffer": true + } + }, "cockatiel": { "globals": { "AbortController": true, @@ -3571,6 +3113,37 @@ "process": true } }, + "chalk>ansi-styles>color-convert": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color>color-convert": { + "packages": { + "@metamask/jazzicon>color>color-convert>color-name": true + } + }, + "@metamask/jazzicon>color>color-string": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color": { + "packages": { + "@metamask/jazzicon>color>clone": true, + "@metamask/jazzicon>color>color-convert": true, + "@metamask/jazzicon>color>color-string": true + } + }, + "@metamask/snaps-controllers>concat-stream": { + "packages": { + "terser>source-map-support>buffer-from": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "readable-stream": true, + "browserify>concat-stream>typedarray": true + } + }, "copy-to-clipboard": { "globals": { "clipboardData": true, @@ -3589,10 +3162,47 @@ "copy-to-clipboard>toggle-selection": true } }, - "copy-to-clipboard>toggle-selection": { + "@ethereumjs/tx>@ethereumjs/common>crc-32": { "globals": { - "document.activeElement": true, - "document.getSelection": true + "DO_NOT_EXPORT_CRC": true, + "define": true + } + }, + "@ngraveio/bc-ur>crc": { + "packages": { + "browserify>buffer": true + } + }, + "crypto-browserify>create-ecdh": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "@metamask/ppom-validator>elliptic": true + } + }, + "ethereumjs-util>create-hash": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>md5.js": true, + "ethereumjs-util>create-hash>ripemd160": true, + "addons-linter>sha.js": true + } + }, + "crypto-browserify>create-hmac": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>create-hash": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true + } + }, + "@metamask/snaps-utils>cron-parser": { + "packages": { + "browserify>browser-resolve": true, + "luxon": true } }, "crypto-browserify": { @@ -3600,303 +3210,484 @@ "crypto-browserify>browserify-cipher": true, "crypto-browserify>browserify-sign": true, "crypto-browserify>create-ecdh": true, + "ethereumjs-util>create-hash": true, "crypto-browserify>create-hmac": true, "crypto-browserify>diffie-hellman": true, "crypto-browserify>pbkdf2": true, "crypto-browserify>public-encrypt": true, "crypto-browserify>randombytes": true, - "crypto-browserify>randomfill": true, - "ethereumjs-util>create-hash": true + "crypto-browserify>randomfill": true } }, - "crypto-browserify>browserify-cipher": { + "@metamask/ppom-validator>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, "packages": { - "crypto-browserify>browserify-cipher>browserify-des": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "browserify>browser-resolve": true } }, - "crypto-browserify>browserify-cipher>browserify-des": { + "react-beautiful-dnd>css-box-model": { + "globals": { + "getComputedStyle": true, + "pageXOffset": true, + "pageYOffset": true + }, "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>browserify-des>des.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "pumpify>inherits": true + "react-router-dom>tiny-invariant": true } }, - "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { + "globals": { + "document.createElement": true, + "document.documentElement": true, + "getComputedStyle": true + }, "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true } }, - "crypto-browserify>browserify-cipher>evp_bytestokey": { + "currency-formatter": { "packages": { - "ethereumjs-util>create-hash>md5.js": true, - "koa>content-disposition>safe-buffer": true + "currency-formatter>accounting": true, + "currency-formatter>locale-currency": true, + "react>object-assign": true } }, - "crypto-browserify>browserify-sign": { + "debounce-stream": { + "packages": { + "debounce-stream>debounce": true, + "debounce-stream>duplexer": true, + "debounce-stream>through": true + } + }, + "debounce-stream>debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true + } + }, + "nock>debug": { + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, + "packages": { + "nock>debug>ms": true, + "process": true + } + }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, + "string.prototype.matchall>call-bind": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, + "string.prototype.matchall>get-intrinsic": true, + "browserify>util>is-arguments": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "string.prototype.matchall>es-abstract>is-regex": true, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "@ngraveio/bc-ur>assert>object-is": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true, + "gulp>vinyl-fs>object.assign": true, + "string.prototype.matchall>regexp.prototype.flags": true, + "string.prototype.matchall>side-channel": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, + "@metamask/eth-token-tracker>deep-equal>which-collection": true, + "browserify>util>which-typed-array": true + } + }, + "string.prototype.matchall>define-properties>define-data-property": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>gopd": true + } + }, + "string.prototype.matchall>define-properties": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "crypto-browserify>diffie-hellman": { "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "ethereumjs-util>create-hash": true, - "pumpify>inherits": true, + "crypto-browserify>diffie-hellman>miller-rabin": true, + "crypto-browserify>randombytes": true + } + }, + "@material-ui/core>react-transition-group>dom-helpers": { + "packages": { + "@babel/runtime": true + } + }, + "debounce-stream>duplexer": { + "packages": { "stream-browserify": true } }, - "crypto-browserify>create-ecdh": { + "ethers>@ethersproject/signing-key>elliptic": { "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, - "browserify>buffer": true + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>create-hmac": { + "@metamask/ppom-validator>elliptic": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true + } + }, + "eth-lattice-keyring>gridplus-sdk>elliptic": { + "packages": { + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>diffie-hellman": { + "string.prototype.matchall>call-bind>es-define-property": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify>diffie-hellman>miller-rabin": true, - "crypto-browserify>randombytes": true + "string.prototype.matchall>get-intrinsic": true } }, - "crypto-browserify>diffie-hellman>miller-rabin": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "bn.js": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>has-symbols": true, + "browserify>util>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "eslint-plugin-react>array-includes>is-string": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "process": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true } }, - "crypto-browserify>pbkdf2": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { "globals": { - "crypto": true, - "process": true, - "queueMicrotask": true, - "setImmediate": true, - "setTimeout": true + "intToBuffer": true }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "bn.js": true, + "buffer": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>public-encrypt": { + "eth-ens-namehash": { + "globals": { + "name": "write" + }, "packages": { - "bn.js": true, "browserify>buffer": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>create-hash": true + "eth-ens-namehash>idna-uts46-hx": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>public-encrypt>browserify-rsa": { + "eth-lattice-keyring": { + "globals": { + "addEventListener": true, + "browser": true, + "clearInterval": true, + "fetch": true, + "open": true, + "setInterval": true + }, "packages": { + "eth-lattice-keyring>@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, "bn.js": true, "browserify>buffer": true, - "crypto-browserify>randombytes": true + "crypto-browserify": true, + "webpack>events": true, + "eth-lattice-keyring>gridplus-sdk": true, + "eth-lattice-keyring>rlp": true } }, - "crypto-browserify>public-encrypt>parse-asn1": { + "eth-method-registry": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "crypto-browserify>pbkdf2": true, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true } }, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "@ethereumjs/tx>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "bn.js": true, - "browserify>buffer": true, - "browserify>vm-browserify": true, - "pumpify>inherits": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true } }, - "crypto-browserify>randombytes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "msCrypto": true + "TextDecoder": true, + "crypto": true }, "packages": { - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "crypto-browserify>randomfill": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "msCrypto": true + "TextDecoder": true, + "crypto": true }, "packages": { - "crypto-browserify>randombytes": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "currency-formatter": { + "ethereumjs-util>ethereum-cryptography": { "packages": { - "currency-formatter>accounting": true, - "currency-formatter>locale-currency": true, - "react>object-assign": true - } - }, - "currency-formatter>accounting": { - "globals": { - "define": true + "browserify>buffer": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "ganache>secp256k1": true } }, - "currency-formatter>locale-currency": { - "globals": { - "countryCode": true + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify>create-hmac": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true } }, - "debounce-stream": { + "ethereumjs-util": { "packages": { - "debounce-stream>debounce": true, - "debounce-stream>duplexer": true, - "debounce-stream>through": true + "browserify>assert": true, + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util>rlp": true } }, - "debounce-stream>debounce": { - "globals": { - "clearTimeout": true, - "setTimeout": true + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "packages": { + "browserify>assert": true, + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true } }, - "debounce-stream>duplexer": { + "@metamask/keyring-controller>ethereumjs-wallet": { "packages": { - "stream-browserify": true + "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, + "crypto-browserify>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, + "uuid": true } }, - "debounce-stream>through": { + "ethers": { "packages": { - "process": true, - "stream-browserify": true + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "ethers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "depcheck>@vue/compiler-sfc>postcss>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { + "packages": { + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "depcheck>is-core-module>hasown": { + "@metamask/ethjs>ethjs-abi": { "packages": { - "browserify>has>function-bind": true + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>js-sha3": true, + "@metamask/ethjs>ethjs-abi>number-to-bn": true } }, - "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "webpack>events": { "globals": { - "crypto.getRandomValues": true + "console": true } }, - "eslint-plugin-react>array-includes>is-string": { + "crypto-browserify>browserify-cipher>evp_bytestokey": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "ethereumjs-util>create-hash>md5.js": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-ens-namehash": { - "globals": { - "name": "write" - }, + "extension-port-stream": { "packages": { - "@metamask/ethjs>js-sha3": true, "browserify>buffer": true, - "eth-ens-namehash>idna-uts46-hx": true + "extension-port-stream>readable-stream": true + } + }, + "fast-json-patch": { + "globals": { + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true } }, - "eth-ens-namehash>idna-uts46-hx": { + "@metamask/snaps-utils>fast-xml-parser": { "globals": { - "define": true + "entityName": true, + "val": true }, "packages": { - "browserify>punycode": true + "@metamask/snaps-utils>fast-xml-parser>strnum": true } }, - "eth-keyring-controller>@metamask/browser-passworder": { - "globals": { - "crypto": true + "@metamask/notification-services-controller>firebase": { + "packages": { + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/messaging": true } }, - "eth-lattice-keyring": { + "react-focus-lock>focus-lock": { "globals": { - "addEventListener": true, - "browser": true, - "clearInterval": true, - "fetch": true, - "open": true, - "setInterval": true + "HTMLIFrameElement": true, + "Node.DOCUMENT_FRAGMENT_NODE": true, + "Node.DOCUMENT_NODE": true, + "Node.DOCUMENT_POSITION_CONTAINED_BY": true, + "Node.DOCUMENT_POSITION_CONTAINS": true, + "Node.ELEMENT_NODE": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify": true, - "eth-lattice-keyring>@ethereumjs/tx": true, - "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "webpack>events": true + "@swc/helpers>tslib": true } }, - "eth-lattice-keyring>@ethereumjs/tx": { + "browserify>util>which-typed-array>for-each": { "packages": { - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>es-abstract>is-callable": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { - "packages": { - "browserify": true, - "browserify>buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true + "axios>form-data": { + "globals": { + "FormData": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { + "fuse.js": { "globals": { - "WeakRef": true - }, - "packages": { - "browserify": true + "console": true, + "define": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { + "string.prototype.matchall>get-intrinsic": { "globals": { - "TextDecoder": true, - "crypto": true + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true }, "packages": { - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>es-abstract>has-proto": true, + "string.prototype.matchall>has-symbols": true, + "depcheck>is-core-module>hasown": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true + "string.prototype.matchall>es-abstract>gopd": { + "packages": { + "string.prototype.matchall>get-intrinsic": true } }, "eth-lattice-keyring>gridplus-sdk": { @@ -3914,230 +3705,307 @@ "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethersproject/abi": true, - "@metamask/ethjs>js-sha3": true, - "@metamask/keyring-api>bech32": true, - "bn.js": true, - "browserify>buffer": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, + "@ethersproject/abi": true, "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "@metamask/keyring-api>bech32": true, "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, "eth-lattice-keyring>gridplus-sdk>bitwise": true, + "bn.js": true, "eth-lattice-keyring>gridplus-sdk>borc": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, "eth-lattice-keyring>gridplus-sdk>elliptic": true, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, - "eth-lattice-keyring>gridplus-sdk>uuid": true, - "eth-lattice-keyring>rlp": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ethjs>js-sha3": true, + "lodash": true, + "eth-lattice-keyring>rlp": true, "ganache>secp256k1": true, - "lodash": true + "eth-lattice-keyring>gridplus-sdk>uuid": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { + "string.prototype.matchall>es-abstract>has-property-descriptors": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "string.prototype.matchall>call-bind>es-define-property": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { + "koa>is-generator-function>has-tostringtag": { "packages": { - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>has-symbols": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "ethereumjs-util>create-hash>md5.js>hash-base": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "pumpify>inherits": true, + "readable-stream": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { + "ethers>@ethersproject/sha2>hash.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "depcheck>is-core-module>hasown": { + "packages": { + "browserify>has>function-bind": true + } + }, + "@metamask/eth-trezor-keyring>hdkey": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "crypto-browserify": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true + } + }, + "he": { "globals": { - "TextDecoder": true, - "crypto": true + "define": true + } + }, + "history": { + "globals": { + "console": true, + "define": true, + "document.defaultView": true, + "document.querySelector": true + } + }, + "react-router-dom>history": { + "globals": { + "addEventListener": true, + "confirm": true, + "document": true, + "history": true, + "location": true, + "navigator.userAgent": true, + "removeEventListener": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "react-router-dom>history>resolve-pathname": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true, + "react-router-dom>history>value-equal": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "@metamask/ppom-validator>elliptic>hmac-drbg": { + "packages": { + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true + } + }, + "react-redux>hoist-non-react-statics": { + "packages": { + "prop-types>react-is": true + } + }, + "https-browserify": { + "packages": { + "stream-http": true, + "browserify>url": true + } + }, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": { "globals": { - "TextEncoder": true, - "crypto": true + "DOMException": true, + "IDBCursor": true, + "IDBDatabase": true, + "IDBIndex": true, + "IDBObjectStore": true, + "IDBRequest": true, + "IDBTransaction": true, + "indexedDB.deleteDatabase": true, + "indexedDB.open": true } }, - "eth-lattice-keyring>gridplus-sdk>aes-js": { + "eth-ens-namehash>idna-uts46-hx": { "globals": { "define": true + }, + "packages": { + "browserify>punycode": true } }, - "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "string.prototype.matchall>internal-slot": { + "packages": { + "string.prototype.matchall>call-bind>es-errors": true, + "depcheck>is-core-module>hasown": true, + "string.prototype.matchall>side-channel": true + } + }, + "browserify>util>is-arguments": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "string.prototype.matchall>es-abstract>is-array-buffer": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { + "packages": { + "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "string.prototype.matchall>es-abstract>is-callable": { "globals": { - "crypto": true, - "define": true + "document": true } }, - "eth-lattice-keyring>gridplus-sdk>bitwise": { + "@metamask/eth-token-tracker>deep-equal>is-date-object": { "packages": { - "browserify>buffer": true + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc": { - "globals": { - "console": true - }, + "koa>is-generator-function": { "packages": { - "browserify>buffer": true, - "buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "@material-ui/core>@material-ui/styles>jss>is-in-browser": { "globals": { - "crypto": true, - "define": true + "document": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { - "globals": { - "URL": true, - "URLSearchParams": true, - "location": true + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>elliptic": { + "string.prototype.matchall>es-abstract>is-regex": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { - "globals": { - "intToBuffer": true - }, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": { "packages": { - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "buffer": true + "string.prototype.matchall>call-bind": true } }, - "eth-lattice-keyring>gridplus-sdk>uuid": { - "globals": { - "crypto": true + "eslint-plugin-react>array-includes>is-string": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>rlp": { - "globals": { - "TextEncoder": true + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "packages": { + "string.prototype.matchall>has-symbols": true } }, - "eth-method-registry": { + "browserify>util>is-typed-array": { "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true + "browserify>util>which-typed-array": true } }, - "ethereumjs-util": { + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { "packages": { - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true } }, - "ethereumjs-util>create-hash": { + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { + "globals": { + "URL": true, + "URLSearchParams": true, + "location": true + } + }, + "@ensdomains/content-hash>js-base64": { + "globals": { + "Base64": "write", + "TextDecoder": true, + "TextEncoder": true, + "atob": true, + "btoa": true, + "define": true + }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>md5.js": true, - "ethereumjs-util>create-hash>ripemd160": true, - "pumpify>inherits": true + "browserify>buffer": true } }, - "ethereumjs-util>create-hash>cipher-base": { + "@metamask/ethjs>js-sha3": { + "globals": { + "define": true + }, "packages": { - "browserify>string_decoder": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "stream-browserify": true + "process": true } }, - "ethereumjs-util>create-hash>md5.js": { + "@ngraveio/bc-ur>jsbi": { + "globals": { + "define": true + } + }, + "@metamask/message-manager>jsonschema": { "packages": { - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "browserify>url": true } }, - "ethereumjs-util>create-hash>md5.js>hash-base": { + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "readable-stream": true + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true } }, - "ethereumjs-util>create-hash>ripemd160": { + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { + "globals": { + "CSS": true + }, "packages": { - "browserify>buffer": true, - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "pumpify>inherits": true + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography": { + "@material-ui/core>@material-ui/styles>jss-plugin-global": { "packages": { - "browserify>buffer": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ganache>secp256k1": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes": { + "@material-ui/core>@material-ui/styles>jss-plugin-nested": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@babel/runtime": true, + "react-router-dom>tiny-warning": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { "packages": { - "browserify>buffer": true + "@material-ui/core>@material-ui/styles>jss": true, + "react-router-dom>tiny-warning": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { "packages": { - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, - "koa>content-disposition>safe-buffer": true + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { + "@material-ui/core>@material-ui/styles>jss": { + "globals": { + "CSS": true, + "document.createElement": true, + "document.querySelector": true + }, "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, + "react-router-dom>tiny-warning": true } }, "ethereumjs-util>ethereum-cryptography>keccak": { @@ -4146,538 +4014,496 @@ "readable-stream": true } }, - "ethereumjs-util>rlp": { - "packages": { - "bn.js": true, - "browserify>buffer": true - } - }, - "ethereumjs-wallet>randombytes": { + "currency-formatter>locale-currency": { "globals": { - "crypto.getRandomValues": true + "countryCode": true } }, - "ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/web": true, - "ethers>@ethersproject/wordlists": true + "localforage": { + "globals": { + "Blob": true, + "BlobBuilder": true, + "FileReader": true, + "IDBKeyRange": true, + "MSBlobBuilder": true, + "MozBlobBuilder": true, + "OIndexedDB": true, + "WebKitBlobBuilder": true, + "atob": true, + "btoa": true, + "console.error": true, + "console.info": true, + "console.warn": true, + "define": true, + "fetch": true, + "indexedDB": true, + "localStorage": true, + "mozIndexedDB": true, + "msIndexedDB": true, + "navigator.platform": true, + "navigator.userAgent": true, + "openDatabase": true, + "setTimeout": true, + "webkitIndexedDB": true } }, - "ethers>@ethersproject/abstract-provider": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "lodash": { + "globals": { + "clearTimeout": true, + "define": true, + "setTimeout": true } }, - "ethers>@ethersproject/abstract-signer": { - "packages": { - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "loglevel": { + "globals": { + "console": true, + "define": true, + "document.cookie": true, + "localStorage": true, + "log": "write", + "navigator": true } }, - "ethers>@ethersproject/address": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "lottie-web": { + "globals": { + "Blob": true, + "Howl": true, + "OffscreenCanvas": true, + "URL.createObjectURL": true, + "Worker": true, + "XMLHttpRequest": true, + "bodymovin": "write", + "clearInterval": true, + "console": true, + "define": true, + "document.body": true, + "document.createElement": true, + "document.createElementNS": true, + "document.getElementsByClassName": true, + "document.getElementsByTagName": true, + "document.querySelectorAll": true, + "document.readyState": true, + "location.origin": true, + "location.pathname": true, + "navigator": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true } }, - "ethers>@ethersproject/base64": { + "luxon": { "globals": { - "atob": true, - "btoa": true - }, - "packages": { - "@ethersproject/bytes": true + "Intl": true } }, - "ethers>@ethersproject/basex": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/properties": true + "@metamask/snaps-utils>marked": { + "globals": { + "console.error": true, + "console.warn": true, + "define": true } }, - "ethers>@ethersproject/constants": { + "ethereumjs-util>create-hash>md5.js": { "packages": { - "@ethersproject/bignumber": true + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "ethers>@ethersproject/json-wallets": { + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hdnode": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { - "globals": { - "define": true + "react-markdown>remark-parse>mdast-util-from-markdown": { + "packages": { + "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, + "react-syntax-highlighter>refractor>parse-entities": true, + "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { + "react-markdown>remark-rehype>mdast-util-to-hast": { "globals": { - "define": true, - "setTimeout": true + "console.warn": true }, "packages": { - "browserify>timers-browserify": true - } - }, - "ethers>@ethersproject/keccak256": { - "packages": { - "@ethersproject/bytes": true, - "@metamask/ethjs>js-sha3": true + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, + "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/logger": { + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { "globals": { - "console": true + "Headers": true, + "TextDecoder": true, + "URL": true, + "btoa": true, + "fetch": true + }, + "packages": { + "browserify>browserify-zlib": true, + "browserify>buffer": true, + "https-browserify": true, + "process": true, + "stream-http": true, + "browserify>url": true, + "browserify>util": true } }, - "ethers>@ethersproject/pbkdf2": { + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "react-syntax-highlighter>refractor>parse-entities": true } }, - "ethers>@ethersproject/properties": { + "crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "ethers>@ethersproject/logger": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true } }, - "ethers>@ethersproject/providers": { + "@ensdomains/content-hash>cids>multibase": { "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>@ethersproject/networks": true, - "ethers>@ethersproject/providers>@ethersproject/web": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true } }, - "ethers>@ethersproject/providers>@ethersproject/networks": { + "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true, + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, + "@ensdomains/content-hash>multicodec": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "@ensdomains/content-hash>multicodec>uint8arrays": true, + "sass-embedded>varint": true } }, - "ethers>@ethersproject/random": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "console.warn": true, + "crypto.subtle.digest": true } }, - "ethers>@ethersproject/rlp": { + "@ensdomains/content-hash>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/sha2": { + "@ensdomains/content-hash>cids>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>cids>multihashes>varint": true } }, - "ethers>@ethersproject/sha2>hash.js": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/signing-key": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/signing-key>elliptic": true + "@metamask/approval-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/signing-key>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/solidity": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "@metamask/notification-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/strings": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "@metamask/permission-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/transactions": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/rpc-methods-flask>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/units": { - "packages": { - "@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "@metamask/snaps-controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/web": { + "@metamask/snaps-controllers-flask>nanoid": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/wordlists": { - "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "depcheck>@vue/compiler-sfc>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream": { - "packages": { - "browserify>buffer": true, - "extension-port-stream>readable-stream": true + "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream>readable-stream": { + "node-fetch": { "globals": { - "AbortController": true, - "AggregateError": true, - "Blob": true - }, - "packages": { - "browserify>buffer": true, - "browserify>string_decoder": true, - "extension-port-stream>readable-stream>abort-controller": true, - "process": true, - "webpack>events": true + "Headers": true, + "Request": true, + "Response": true, + "fetch": true } }, - "extension-port-stream>readable-stream>abort-controller": { + "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { "globals": { - "AbortController": true + "fetch": true } }, - "fast-json-patch": { + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { "globals": { - "addEventListener": true, - "clearTimeout": true, - "removeEventListener": true, - "setTimeout": true + "fetch": true } }, - "fuse.js": { + "@metamask/ethjs>ethjs-abi>number-to-bn": { + "packages": { + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true + } + }, + "string.prototype.matchall>es-abstract>object-inspect": { "globals": { - "console": true, - "define": true + "HTMLElement": true, + "WeakRef": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "ganache>secp256k1": { + "@ngraveio/bc-ur>assert>object-is": { "packages": { - "@metamask/ppom-validator>elliptic": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true } }, "gulp>vinyl-fs>object.assign": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, "string.prototype.matchall>call-bind": true, "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>has-symbols": true + "string.prototype.matchall>has-symbols": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "he": { - "globals": { - "define": true + "@metamask/object-multiplex>once": { + "packages": { + "@metamask/object-multiplex>once>wrappy": true } }, - "history": { - "globals": { - "console": true, - "define": true, - "document.defaultView": true, - "document.querySelector": true + "crypto-browserify>public-encrypt>parse-asn1": { + "packages": { + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "browserify>buffer": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "crypto-browserify>pbkdf2": true } }, - "https-browserify": { - "packages": { - "browserify>url": true, - "stream-http": true + "react-syntax-highlighter>refractor>parse-entities": { + "globals": { + "document.createElement": true } }, - "koa>content-disposition>safe-buffer": { + "path-browserify": { "packages": { - "browserify>buffer": true + "process": true } }, - "koa>is-generator-function": { + "serve-handler>path-to-regexp": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "serve-handler>path-to-regexp>isarray": true } }, - "koa>is-generator-function>has-tostringtag": { + "crypto-browserify>pbkdf2": { + "globals": { + "crypto": true, + "process": true, + "queueMicrotask": true, + "setImmediate": true, + "setTimeout": true + }, "packages": { - "string.prototype.matchall>has-symbols": true + "ethereumjs-util>create-hash": true, + "process": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true } }, - "localforage": { + "@material-ui/core>popper.js": { "globals": { - "Blob": true, - "BlobBuilder": true, - "FileReader": true, - "IDBKeyRange": true, - "MSBlobBuilder": true, - "MozBlobBuilder": true, - "OIndexedDB": true, - "WebKitBlobBuilder": true, - "atob": true, - "btoa": true, - "console.error": true, - "console.info": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, "console.warn": true, "define": true, - "fetch": true, - "indexedDB": true, - "localStorage": true, - "mozIndexedDB": true, - "msIndexedDB": true, - "navigator.platform": true, - "navigator.userAgent": true, - "openDatabase": true, - "setTimeout": true, - "webkitIndexedDB": true + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator": true, + "requestAnimationFrame": true, + "setTimeout": true } }, - "lodash": { + "react-tippy>popper.js": { "globals": { - "clearTimeout": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, + "console.warn": true, "define": true, + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.userAgent": true, + "requestAnimationFrame": true, "setTimeout": true } }, - "loglevel": { + "process": { "globals": { - "console": true, - "define": true, - "document.cookie": true, - "localStorage": true, - "log": "write", - "navigator": true + "clearTimeout": true, + "setTimeout": true } }, - "lottie-web": { - "globals": { - "Blob": true, - "Howl": true, - "OffscreenCanvas": true, - "URL.createObjectURL": true, - "Worker": true, - "XMLHttpRequest": true, - "bodymovin": "write", - "clearInterval": true, - "console": true, - "define": true, - "document.body": true, - "document.createElement": true, - "document.createElementNS": true, - "document.getElementsByClassName": true, - "document.getElementsByTagName": true, - "document.querySelectorAll": true, - "document.readyState": true, - "location.origin": true, - "location.pathname": true, - "navigator": true, - "requestAnimationFrame": true, - "setInterval": true, - "setTimeout": true + "promise-to-callback": { + "packages": { + "promise-to-callback>is-fn": true, + "promise-to-callback>set-immediate-shim": true } }, - "luxon": { + "prop-types": { "globals": { - "Intl": true + "console": true + }, + "packages": { + "react>object-assign": true, + "prop-types>react-is": true } }, - "nanoid": { - "globals": { - "crypto": true, - "msCrypto": true, - "navigator": true + "react-markdown>property-information": { + "packages": { + "watchify>xtend": true } }, - "nock>debug": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "process": true, + "setTimeout": true }, "packages": { - "nock>debug>ms": true, - "process": true + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true + } + }, + "crypto-browserify>public-encrypt": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "crypto-browserify>randombytes": true } }, - "node-fetch": { + "browserify>punycode": { "globals": { - "Headers": true, - "Request": true, - "Response": true, - "fetch": true + "define": true } }, - "path-browserify": { - "packages": { - "process": true + "qrcode-generator": { + "globals": { + "define": true } }, - "process": { + "qrcode.react": { "globals": { - "clearTimeout": true, - "setTimeout": true + "Path2D": true, + "devicePixelRatio": true + }, + "packages": { + "react": true } }, - "promise-to-callback": { + "@storybook/addon-knobs>qs": { "packages": { - "promise-to-callback>is-fn": true, - "promise-to-callback>set-immediate-shim": true + "string.prototype.matchall>side-channel": true } }, - "promise-to-callback>set-immediate-shim": { + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { "globals": { - "setTimeout.apply": true - }, - "packages": { - "browserify>timers-browserify": true + "queueMicrotask": true } }, - "prop-types": { + "react-beautiful-dnd>raf-schd": { "globals": { - "console": true - }, - "packages": { - "prop-types>react-is": true, - "react>object-assign": true + "cancelAnimationFrame": true, + "requestAnimationFrame": true } }, - "prop-types>react-is": { + "crypto-browserify>randombytes": { "globals": { - "console": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "process": true, + "koa>content-disposition>safe-buffer": true } }, - "qrcode-generator": { + "ethereumjs-wallet>randombytes": { "globals": { - "define": true + "crypto.getRandomValues": true } }, - "qrcode.react": { + "crypto-browserify>randomfill": { "globals": { - "Path2D": true, - "devicePixelRatio": true + "crypto": true, + "msCrypto": true }, "packages": { - "react": true + "process": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true } }, "react": { @@ -4685,8 +4511,8 @@ "console": true }, "packages": { - "prop-types": true, - "react>object-assign": true + "react>object-assign": true, + "prop-types": true } }, "react-beautiful-dnd": { @@ -4708,43 +4534,28 @@ }, "packages": { "@babel/runtime": true, - "react": true, "react-beautiful-dnd>css-box-model": true, "react-beautiful-dnd>memoize-one": true, "react-beautiful-dnd>raf-schd": true, - "react-beautiful-dnd>use-memo-one": true, + "react": true, "react-dom": true, "react-redux": true, - "redux": true + "redux": true, + "react-beautiful-dnd>use-memo-one": true } }, - "react-beautiful-dnd>css-box-model": { + "react-chartjs-2": { "globals": { - "getComputedStyle": true, - "pageXOffset": true, - "pageYOffset": true + "setTimeout": true }, "packages": { - "react-router-dom>tiny-invariant": true - } - }, - "react-beautiful-dnd>raf-schd": { - "globals": { - "cancelAnimationFrame": true, - "requestAnimationFrame": true - } - }, - "react-beautiful-dnd>use-memo-one": { - "packages": { + "chart.js": true, "react": true } }, - "react-chartjs-2": { - "globals": { - "setTimeout": true - }, + "react-focus-lock>react-clientside-effect": { "packages": { - "chart.js": true, + "@babel/runtime": true, "react": true } }, @@ -4789,22 +4600,28 @@ "trustedTypes": true }, "packages": { + "react>object-assign": true, "prop-types": true, "react": true, - "react-dom>scheduler": true, - "react>object-assign": true + "react-dom>scheduler": true } }, - "react-dom>scheduler": { + "react-responsive-carousel>react-easy-swipe": { "globals": { - "MessageChannel": true, - "cancelAnimationFrame": true, - "clearTimeout": true, - "console": true, - "navigator": true, - "performance": true, - "requestAnimationFrame": true, - "setTimeout": true + "addEventListener": true, + "define": true, + "document.addEventListener": true, + "document.removeEventListener": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-popper>react-fast-compare": { + "globals": { + "Element": true, + "console.warn": true } }, "react-focus-lock": { @@ -4818,660 +4635,726 @@ }, "packages": { "@babel/runtime": true, + "react-focus-lock>focus-lock": true, "prop-types": true, "react": true, - "react-focus-lock>focus-lock": true, "react-focus-lock>react-clientside-effect": true, "react-focus-lock>use-callback-ref": true, "react-focus-lock>use-sidecar": true } }, - "react-focus-lock>focus-lock": { + "react-idle-timer": { "globals": { - "HTMLIFrameElement": true, - "Node.DOCUMENT_FRAGMENT_NODE": true, - "Node.DOCUMENT_NODE": true, - "Node.DOCUMENT_POSITION_CONTAINED_BY": true, - "Node.DOCUMENT_POSITION_CONTAINS": true, - "Node.ELEMENT_NODE": true, - "console.error": true, + "clearTimeout": true, + "document": true, + "setTimeout": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-inspector": { + "globals": { + "Node": true, + "chromeDark": true, + "chromeLight": true + }, + "packages": { + "react": true + } + }, + "prop-types>react-is": { + "globals": { + "console": true + } + }, + "react-markdown>react-is": { + "globals": { + "console": true + } + }, + "react-redux>react-is": { + "globals": { + "console": true + } + }, + "react-markdown": { + "globals": { + "console.warn": true + }, + "packages": { + "react-markdown>comma-separated-tokens": true, + "prop-types": true, + "react-markdown>property-information": true, + "react": true, + "react-markdown>react-is": true, + "react-markdown>remark-parse": true, + "react-markdown>remark-rehype": true, + "react-markdown>space-separated-tokens": true, + "react-markdown>style-to-object": true, + "react-markdown>unified": true, + "react-markdown>unist-util-visit": true, + "react-markdown>vfile": true + } + }, + "react-popper": { + "globals": { + "document": true + }, + "packages": { + "@popperjs/core": true, + "react": true, + "react-popper>react-fast-compare": true, + "react-popper>warning": true + } + }, + "react-redux": { + "globals": { + "console": true, + "document": true + }, + "packages": { + "@babel/runtime": true, + "react-redux>hoist-non-react-statics": true, + "prop-types": true, + "react": true, + "react-dom": true, + "react-redux>react-is": true + } + }, + "react-responsive-carousel": { + "globals": { + "HTMLElement": true, + "addEventListener": true, + "clearTimeout": true, "console.warn": true, "document": true, "getComputedStyle": true, + "removeEventListener": true, + "setTimeout": true + }, + "packages": { + "classnames": true, + "react": true, + "react-dom": true, + "react-responsive-carousel>react-easy-swipe": true + } + }, + "react-router-dom": { + "packages": { + "react-router-dom>history": true, + "prop-types": true, + "react": true, + "react-router-dom>react-router": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true + } + }, + "react-router-dom-v5-compat": { + "globals": { + "FormData": true, + "URL": true, + "URLSearchParams": true, + "__reactRouterVersion": "write", + "addEventListener": true, + "confirm": true, + "define": true, + "document": true, + "history.scrollRestoration": true, + "location.href": true, + "removeEventListener": true, + "scrollTo": true, + "scrollY": true, + "sessionStorage.getItem": true, + "sessionStorage.setItem": true, "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true + "react-router-dom-v5-compat>@remix-run/router": true, + "history": true, + "react": true, + "react-dom": true, + "react-router-dom": true, + "react-router-dom-v5-compat>react-router": true } }, - "react-focus-lock>react-clientside-effect": { + "react-router-dom>react-router": { "packages": { - "@babel/runtime": true, - "react": true + "react-router-dom>history": true, + "react-redux>hoist-non-react-statics": true, + "serve-handler>path-to-regexp": true, + "prop-types": true, + "react": true, + "prop-types>react-is": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true } }, - "react-focus-lock>use-callback-ref": { + "react-router-dom-v5-compat>react-router": { + "globals": { + "console.error": true, + "define": true + }, "packages": { + "react-router-dom-v5-compat>@remix-run/router": true, "react": true } }, - "react-focus-lock>use-sidecar": { + "react-simple-file-input": { "globals": { - "console.error": true + "File": true, + "FileReader": true, + "console.warn": true }, "packages": { - "@swc/helpers>tslib": true, - "react": true, - "react-focus-lock>use-sidecar>detect-node-es": true + "prop-types": true, + "react": true } }, - "react-idle-timer": { + "react-tippy": { "globals": { + "Element": true, + "MSStream": true, + "MutationObserver": true, + "addEventListener": true, "clearTimeout": true, + "console.error": true, + "console.warn": true, + "define": true, "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.maxTouchPoints": true, + "navigator.msMaxTouchPoints": true, + "navigator.userAgent": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "react-tippy>popper.js": true, + "react": true, + "react-dom": true } }, - "react-inspector": { + "react-toggle-button": { "globals": { - "Node": true, - "chromeDark": true, - "chromeLight": true + "clearTimeout": true, + "console.warn": true, + "define": true, + "performance": true, + "setTimeout": true }, "packages": { "react": true } }, - "react-markdown": { + "@material-ui/core>react-transition-group": { "globals": { - "console.warn": true + "Element": true, + "setTimeout": true }, "packages": { + "@material-ui/core>react-transition-group>dom-helpers": true, "prop-types": true, "react": true, - "react-markdown>comma-separated-tokens": true, - "react-markdown>property-information": true, - "react-markdown>react-is": true, - "react-markdown>remark-parse": true, - "react-markdown>remark-rehype": true, - "react-markdown>space-separated-tokens": true, - "react-markdown>style-to-object": true, - "react-markdown>unified": true, - "react-markdown>unist-util-visit": true, - "react-markdown>vfile": true + "react-dom": true } }, - "react-markdown>property-information": { + "readable-stream": { "packages": { - "watchify>xtend": true + "browserify>browser-resolve": true, + "browserify>buffer": true, + "webpack>events": true, + "pumpify>inherits": true, + "process": true, + "browserify>string_decoder": true, + "readable-stream>util-deprecate": true } }, - "react-markdown>react-is": { + "extension-port-stream>readable-stream": { "globals": { - "console": true - } - }, - "react-markdown>remark-parse": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, - "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true, - "react-syntax-highlighter>refractor>parse-entities": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "ERR_INVALID_ARG_TYPE": true, + "queueMicrotask": true + }, "packages": { - "react-syntax-highlighter>refractor>parse-entities": true + "@lavamoat/lavapack>readable-stream>abort-controller": true, + "browserify>buffer": true, + "webpack>events": true, + "process": true, + "browserify>string_decoder": true } }, - "react-markdown>remark-rehype": { + "@metamask/snaps-controllers>readable-web-to-node-stream": { "packages": { - "react-markdown>remark-rehype>mdast-util-to-hast": true + "readable-stream": true } }, - "react-markdown>remark-rehype>mdast-util-to-hast": { + "redux": { "globals": { - "console.warn": true + "console": true }, "packages": { - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, - "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, - "react-markdown>unist-util-visit": true + "@babel/runtime": true } }, - "react-markdown>style-to-object": { + "string.prototype.matchall>regexp.prototype.flags": { "packages": { - "react-markdown>style-to-object>inline-style-parser": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": true } }, - "react-markdown>unified": { + "react-markdown>remark-parse": { "packages": { - "mocha>yargs-unparser>is-plain-obj": true, - "react-markdown>unified>bail": true, - "react-markdown>unified>extend": true, - "react-markdown>unified>is-buffer": true, - "react-markdown>unified>trough": true, - "react-markdown>vfile": true + "react-markdown>remark-parse>mdast-util-from-markdown": true } }, - "react-markdown>unist-util-visit": { + "react-markdown>remark-rehype": { "packages": { - "react-markdown>unist-util-visit>unist-util-visit-parents": true + "react-markdown>remark-rehype>mdast-util-to-hast": true } }, - "react-markdown>unist-util-visit>unist-util-visit-parents": { + "react-markdown>vfile>replace-ext": { "packages": { - "react-markdown>unist-util-visit>unist-util-is": true + "path-browserify": true } }, - "react-markdown>vfile": { - "packages": { - "path-browserify": true, - "process": true, - "react-markdown>vfile>is-buffer": true, - "react-markdown>vfile>replace-ext": true, - "react-markdown>vfile>vfile-message": true + "reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true } }, - "react-markdown>vfile>replace-ext": { + "@metamask/snaps-utils>rfdc": { "packages": { - "path-browserify": true + "browserify>buffer": true } }, - "react-markdown>vfile>vfile-message": { + "ethereumjs-util>create-hash>ripemd160": { "packages": { - "react-markdown>vfile>unist-util-stringify-position": true + "browserify>buffer": true, + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true } }, - "react-popper": { - "globals": { - "document": true - }, + "@keystonehq/metamask-airgapped-keyring>rlp": { "packages": { - "@popperjs/core": true, - "react": true, - "react-popper>react-fast-compare": true, - "react-popper>warning": true - } - }, - "react-popper>react-fast-compare": { - "globals": { - "Element": true, - "console.warn": true + "bn.js": true, + "browserify>buffer": true } }, - "react-popper>warning": { + "eth-lattice-keyring>rlp": { "globals": { - "console": true + "TextEncoder": true } }, - "react-redux": { - "globals": { - "console": true, - "document": true - }, + "ethereumjs-util>rlp": { "packages": { - "@babel/runtime": true, - "prop-types": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true, - "react-redux>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>hoist-non-react-statics": { + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { "packages": { - "prop-types>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>react-is": { + "wait-on>rxjs": { "globals": { - "console": true + "cancelAnimationFrame": true, + "clearInterval": true, + "clearTimeout": true, + "performance": true, + "requestAnimationFrame": true, + "setInterval.apply": true, + "setTimeout.apply": true } }, - "react-responsive-carousel": { + "koa>content-disposition>safe-buffer": { + "packages": { + "browserify>buffer": true + } + }, + "react-dom>scheduler": { "globals": { - "HTMLElement": true, - "addEventListener": true, + "MessageChannel": true, + "cancelAnimationFrame": true, "clearTimeout": true, - "console.warn": true, - "document": true, - "getComputedStyle": true, - "removeEventListener": true, + "console": true, + "navigator": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true - }, - "packages": { - "classnames": true, - "react": true, - "react-dom": true, - "react-responsive-carousel>react-easy-swipe": true } }, - "react-responsive-carousel>react-easy-swipe": { + "ethers>@ethersproject/json-wallets>scrypt-js": { "globals": { - "addEventListener": true, "define": true, - "document.addEventListener": true, - "document.removeEventListener": true + "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "browserify>timers-browserify": true } }, - "react-router-dom": { + "ganache>secp256k1": { "packages": { - "prop-types": true, - "react": true, - "react-router-dom>history": true, - "react-router-dom>react-router": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "@metamask/ppom-validator>elliptic": true } }, - "react-router-dom-v5-compat": { + "semver": { "globals": { - "FormData": true, - "URL": true, - "URLSearchParams": true, - "__reactRouterVersion": "write", - "addEventListener": true, - "confirm": true, - "define": true, - "document": true, - "history.scrollRestoration": true, - "location.href": true, - "removeEventListener": true, - "scrollTo": true, - "scrollY": true, - "sessionStorage.getItem": true, - "sessionStorage.setItem": true, - "setTimeout": true + "console.error": true }, "packages": { - "history": true, - "react": true, - "react-dom": true, - "react-router-dom": true, - "react-router-dom-v5-compat>@remix-run/router": true, - "react-router-dom-v5-compat>react-router": true + "process": true } }, - "react-router-dom-v5-compat>@remix-run/router": { - "globals": { - "AbortController": true, - "DOMException": true, - "FormData": true, - "Headers": true, - "Request": true, - "Response": true, - "URL": true, - "URLSearchParams": true, - "console": true, - "document.defaultView": true + "string.prototype.matchall>call-bind>set-function-length": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>gopd": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom-v5-compat>react-router": { - "globals": { - "console.error": true, - "define": true - }, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": { "packages": { - "react": true, - "react-router-dom-v5-compat>@remix-run/router": true + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom>history": { + "promise-to-callback>set-immediate-shim": { "globals": { - "addEventListener": true, - "confirm": true, - "document": true, - "history": true, - "location": true, - "navigator.userAgent": true, - "removeEventListener": true + "setTimeout.apply": true }, "packages": { - "react-router-dom>history>resolve-pathname": true, - "react-router-dom>history>value-equal": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "browserify>timers-browserify": true } }, - "react-router-dom>react-router": { + "addons-linter>sha.js": { "packages": { - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-redux>hoist-non-react-statics": true, - "react-router-dom>history": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true, - "serve-handler>path-to-regexp": true + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "react-router-dom>tiny-warning": { - "globals": { - "console": true + "string.prototype.matchall>side-channel": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>object-inspect": true } }, - "react-simple-file-input": { + "@metamask/profile-sync-controller>siwe": { "globals": { - "File": true, - "FileReader": true, + "console.error": true, "console.warn": true }, "packages": { - "prop-types": true, - "react": true + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random": true, + "ethers": true, + "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true } }, - "react-syntax-highlighter>refractor>parse-entities": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { "globals": { - "document.createElement": true + "StopIteration": true + }, + "packages": { + "string.prototype.matchall>internal-slot": true } }, - "react-tippy": { + "stream-browserify": { + "packages": { + "webpack>events": true, + "pumpify>inherits": true, + "readable-stream": true + } + }, + "stream-http": { "globals": { - "Element": true, - "MSStream": true, - "MutationObserver": true, - "addEventListener": true, + "AbortController": true, + "Blob": true, + "MSStreamReader": true, + "ReadableStream": true, + "WritableStream": true, + "XDomainRequest": true, + "XMLHttpRequest": true, "clearTimeout": true, - "console.error": true, - "console.warn": true, - "define": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.maxTouchPoints": true, - "navigator.msMaxTouchPoints": true, - "navigator.userAgent": true, - "performance": true, - "requestAnimationFrame": true, + "fetch": true, + "location.protocol.search": true, "setTimeout": true }, "packages": { - "react": true, - "react-dom": true, - "react-tippy>popper.js": true + "browserify>buffer": true, + "stream-http>builtin-status-codes": true, + "pumpify>inherits": true, + "process": true, + "readable-stream": true, + "browserify>url": true, + "watchify>xtend": true } }, - "react-tippy>popper.js": { - "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.userAgent": true, - "requestAnimationFrame": true, - "setTimeout": true + "@metamask/snaps-controllers>tar-stream>streamx": { + "packages": { + "webpack>events": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true } }, - "react-toggle-button": { - "globals": { - "clearTimeout": true, - "console.warn": true, - "define": true, - "performance": true, - "setTimeout": true - }, + "browserify>string_decoder": { "packages": { - "react": true + "koa>content-disposition>safe-buffer": true } }, - "readable-stream": { + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "packages": { + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + } + }, + "react-markdown>style-to-object": { "packages": { + "react-markdown>style-to-object>inline-style-parser": true + } + }, + "@metamask/snaps-controllers>tar-stream": { + "packages": { + "@metamask/snaps-controllers>tar-stream>b4a": true, "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>string_decoder": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx": true + } + }, + "debounce-stream>through": { + "packages": { "process": true, - "pumpify>inherits": true, - "readable-stream>util-deprecate": true, - "webpack>events": true + "stream-browserify": true } }, - "readable-stream>util-deprecate": { + "browserify>timers-browserify": { "globals": { - "console.trace": true, - "console.warn": true, - "localStorage": true + "clearInterval": true, + "clearTimeout": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "process": true } }, - "redux": { + "react-router-dom>tiny-warning": { "globals": { "console": true - }, - "packages": { - "@babel/runtime": true } }, - "semver": { + "copy-to-clipboard>toggle-selection": { "globals": { - "console.error": true - }, - "packages": { - "process": true + "document.activeElement": true, + "document.getSelection": true } }, - "serve-handler>path-to-regexp": { + "@swc/helpers>tslib": { + "globals": { + "SuppressedError": true, + "define": true + } + }, + "@metamask/eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, "packages": { - "serve-handler>path-to-regexp>isarray": true + "browserify>browser-resolve": true } }, - "stream-browserify": { - "packages": { - "pumpify>inherits": true, - "readable-stream": true, - "webpack>events": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { + "globals": { + "define": true } }, - "stream-http": { + "@ensdomains/content-hash>cids>uint8arrays": { "globals": { - "AbortController": true, - "Blob": true, - "MSStreamReader": true, - "ReadableStream": true, - "WritableStream": true, - "XDomainRequest": true, - "XMLHttpRequest": true, - "clearTimeout": true, - "fetch": true, - "location.protocol.search": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "browserify>buffer": true, - "browserify>url": true, - "process": true, - "pumpify>inherits": true, - "readable-stream": true, - "stream-http>builtin-status-codes": true, - "watchify>xtend": true + "@ensdomains/content-hash>cids>multibase": true } }, - "string.prototype.matchall>call-bind": { + "@ensdomains/content-hash>multicodec>uint8arrays": { + "globals": { + "Buffer": true, + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>has>function-bind": true, - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>call-bind>set-function-length": true, - "string.prototype.matchall>get-intrinsic": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "string.prototype.matchall>call-bind>es-define-property": { + "react-markdown>unified": { "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unified>bail": true, + "react-markdown>unified>extend": true, + "react-markdown>unified>is-buffer": true, + "mocha>yargs-unparser>is-plain-obj": true, + "react-markdown>unified>trough": true, + "react-markdown>vfile": true } }, - "string.prototype.matchall>call-bind>set-function-length": { + "react-markdown>unist-util-visit>unist-util-visit-parents": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>gopd": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unist-util-visit>unist-util-is": true } }, - "string.prototype.matchall>define-properties": { + "react-markdown>unist-util-visit": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "react-markdown>unist-util-visit>unist-util-visit-parents": true } }, - "string.prototype.matchall>define-properties>define-data-property": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>gopd": true + "uri-js": { + "globals": { + "define": true } }, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "browserify>url": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true + "browserify>punycode": true, + "@storybook/addon-knobs>qs": true } }, - "string.prototype.matchall>es-abstract>available-typed-arrays": { + "react-focus-lock>use-callback-ref": { "packages": { - "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + "react": true } }, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "react-beautiful-dnd>use-memo-one": { "packages": { - "string.prototype.matchall>has-symbols": true + "react": true } }, - "string.prototype.matchall>es-abstract>gopd": { + "react-focus-lock>use-sidecar": { + "globals": { + "console.error": true + }, "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-focus-lock>use-sidecar>detect-node-es": true, + "react": true, + "@swc/helpers>tslib": true } }, - "string.prototype.matchall>es-abstract>has-property-descriptors": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true + "readable-stream>util-deprecate": { + "globals": { + "console.trace": true, + "console.warn": true, + "localStorage": true } }, - "string.prototype.matchall>es-abstract>is-array-buffer": { + "browserify>assert>util": { + "globals": { + "console.error": true, + "console.log": true, + "console.trace": true, + "process": true + }, "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "browserify>assert>util>inherits": true, + "process": true } }, - "string.prototype.matchall>es-abstract>is-callable": { + "browserify>util": { "globals": { - "document": true - } - }, - "string.prototype.matchall>es-abstract>is-regex": { + "console.error": true, + "console.log": true, + "console.trace": true + }, "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "pumpify>inherits": true, + "browserify>util>is-arguments": true, + "koa>is-generator-function": true, + "browserify>util>is-typed-array": true, + "process": true, + "browserify>util>which-typed-array": true } }, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": { - "packages": { - "string.prototype.matchall>call-bind": true + "uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "string.prototype.matchall>es-abstract>object-inspect": { + "@metamask/eth-snap-keyring>uuid": { "globals": { - "HTMLElement": true, - "WeakRef": true - }, - "packages": { - "browserify>browser-resolve": true + "crypto": true } }, - "string.prototype.matchall>get-intrinsic": { + "@metamask/keyring-snap-client>uuid": { "globals": { - "AggregateError": true, - "FinalizationRegistry": true, - "WeakRef": true - }, - "packages": { - "browserify>has>function-bind": true, - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>has-proto": true, - "string.prototype.matchall>has-symbols": true + "crypto": true } }, - "string.prototype.matchall>internal-slot": { - "packages": { - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>side-channel": true + "eth-lattice-keyring>gridplus-sdk>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": true + "web3-stream-provider>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": { + "@metamask/snaps-utils>validate-npm-package-name": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "@metamask/snaps-utils>validate-npm-package-name>builtins": true } }, - "string.prototype.matchall>side-channel": { + "react-markdown>vfile>vfile-message": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>object-inspect": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>vfile>unist-util-stringify-position": true } }, - "terser>source-map-support>buffer-from": { + "react-markdown>vfile": { "packages": { - "browserify>buffer": true + "react-markdown>vfile>is-buffer": true, + "path-browserify": true, + "process": true, + "react-markdown>vfile>replace-ext": true, + "react-markdown>vfile>vfile-message": true } }, - "uri-js": { + "browserify>vm-browserify": { "globals": { - "define": true + "document.body.appendChild": true, + "document.body.removeChild": true, + "document.createElement": true } }, - "uuid": { + "react-popper>warning": { "globals": { - "crypto": true, - "msCrypto": true + "console": true } }, - "wait-on>rxjs": { + "@ensdomains/content-hash>multihashes>web-encoding": { "globals": { - "cancelAnimationFrame": true, - "clearInterval": true, - "clearTimeout": true, - "performance": true, - "requestAnimationFrame": true, - "setInterval.apply": true, - "setTimeout.apply": true + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "browserify>util": true } }, "web3": { @@ -5484,14 +5367,14 @@ "setTimeout": true }, "packages": { - "browserify>util": true, "readable-stream": true, + "browserify>util": true, "web3-stream-provider>uuid": true } }, - "web3-stream-provider>uuid": { + "@metamask/controllers>web3": { "globals": { - "crypto": true + "XMLHttpRequest": true } }, "webextension-polyfill": { @@ -5503,9 +5386,35 @@ "define": true } }, - "webpack>events": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, + "eslint-plugin-react>array-includes>is-string": true, + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-collection": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true + } + }, + "browserify>util>which-typed-array": { + "packages": { + "string.prototype.matchall>es-abstract>available-typed-arrays": true, + "string.prototype.matchall>call-bind": true, + "browserify>util>which-typed-array>for-each": true, + "string.prototype.matchall>es-abstract>gopd": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { "globals": { - "console": true + "XMLHttpRequest": true } } } diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index b3b118eb6bb8..82075f709022 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -5,144 +5,124 @@ "regeneratorRuntime": "write" } }, - "@ensdomains/content-hash": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { "globals": { - "console.warn": true + "WeakRef": true }, "packages": { - "@ensdomains/content-hash>cids": true, - "@ensdomains/content-hash>js-base64": true, - "@ensdomains/content-hash>multicodec": true, - "@ensdomains/content-hash>multihashes": true, - "browserify>buffer": true + "browserify": true } }, - "@ensdomains/content-hash>cids": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes": true, - "@ensdomains/content-hash>cids>uint8arrays": true, - "@ensdomains/content-hash>multicodec": true + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, + "browserify": true, + "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true } }, - "@ensdomains/content-hash>cids>multibase": { + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "SuppressedError": true + } + }, + "@ensdomains/content-hash": { + "globals": { + "console.warn": true }, "packages": { - "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true + "browserify>buffer": true, + "@ensdomains/content-hash>cids": true, + "@ensdomains/content-hash>js-base64": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>multihashes": true } }, - "@ensdomains/content-hash>cids>multihashes": { + "@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes>varint": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>cids>uint8arrays": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "webpack>events": true } }, - "@ensdomains/content-hash>js-base64": { - "globals": { - "Base64": "write", - "TextDecoder": true, - "TextEncoder": true, - "atob": true, - "btoa": true, - "define": true - }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "browserify>buffer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays": true, - "sass-embedded>varint": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays": { + "@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "Buffer": true, - "TextDecoder": true, "TextEncoder": true - }, - "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "TextDecoder": true, - "TextEncoder": true, - "console.warn": true, - "crypto.subtle.digest": true - } - }, - "@ensdomains/content-hash>multihashes": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase": true, - "@ensdomains/content-hash>multihashes>varint": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase>base-x": { + "@ethereumjs/tx": { "packages": { - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, - "@ensdomains/content-hash>multihashes>web-encoding": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx": { "packages": { - "browserify>util": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@ethereumjs/tx": { + "eth-lattice-keyring>@ethereumjs/tx": { "packages": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, "@ethereumjs/tx>@ethereumjs/common": true, "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, + "@ethersproject/providers": true, "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true, "browserify>insert-module-globals>is-buffer": true } }, - "@ethereumjs/tx>@ethereumjs/common": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/providers": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@ethereumjs/tx>@ethereumjs/common>crc-32": { - "globals": { - "DO_NOT_EXPORT_CRC": true, - "define": true - } - }, - "@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, "@ethereumjs/tx>@ethereumjs/util": { @@ -151,70 +131,83 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, - "@ethereumjs/tx>ethereum-cryptography": true, "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true, "browserify>insert-module-globals>is-buffer": true, - "webpack>events": true + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true } }, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { + "@metamask/smart-transactions-controller>@ethereumjs/util": { "globals": { - "Headers": true, - "TextDecoder": true, - "URL": true, - "btoa": true, + "console.warn": true, "fetch": true }, "packages": { - "browserify>browserify-zlib": true, - "browserify>buffer": true, - "browserify>url": true, - "browserify>util": true, - "https-browserify": true, - "process": true, - "stream-http": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true } }, - "@ethereumjs/tx>ethereum-cryptography": { + "@ethersproject/abi": { "globals": { - "TextDecoder": true, - "crypto": true + "console.log": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true, - "@metamask/message-signing-snap>@noble/curves": true, - "@noble/hashes": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { + "ethers>@ethersproject/abstract-provider": { "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "@ethersproject/abi": { - "globals": { - "console.log": true - }, + "ethers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/address": { "packages": { "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/basex": { + "packages": { + "@ethersproject/bytes": true, + "ethers>@ethersproject/properties": true } }, "@ethersproject/bignumber": { "packages": { "@ethersproject/bytes": true, - "bn.js": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/logger": true, + "bn.js": true } }, "@ethersproject/bytes": { @@ -222,17 +215,22 @@ "ethers>@ethersproject/logger": true } }, + "ethers>@ethersproject/constants": { + "packages": { + "@ethersproject/bignumber": true + } + }, "@ethersproject/contracts": { "globals": { "setTimeout": true }, "packages": { "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/abstract-provider": true, "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/transactions": true @@ -240,10 +238,10 @@ }, "@ethersproject/hash": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/address": true, "ethers>@ethersproject/base64": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, @@ -252,9 +250,9 @@ }, "@ethersproject/hdnode": { "packages": { + "ethers>@ethersproject/basex": true, "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "ethers>@ethersproject/basex": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, @@ -265,1235 +263,719 @@ "ethers>@ethersproject/wordlists": true } }, - "@ethersproject/providers": { - "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true - }, + "ethers>@ethersproject/json-wallets": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/providers>bech32": true, - "@metamask/test-bundler>@ethersproject/networks": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true - } - }, - "@ethersproject/providers>@ethersproject/random": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true - } - }, - "@ethersproject/wallet": { - "packages": { "@ethersproject/bytes": true, - "@ethersproject/hash": true, "@ethersproject/hdnode": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@keystonehq/bc-ur-registry-eth": { + "ethers>@ethersproject/keccak256": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "uuid": true + "@ethersproject/bytes": true, + "@metamask/ethjs>js-sha3": true } }, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { + "ethers>@ethersproject/logger": { "globals": { - "define": true - }, + "console": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { "packages": { - "@ngraveio/bc-ur": true, - "@swc/helpers>tslib": true, - "browserify>buffer": true, - "buffer": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring": { + "@metamask/test-bundler>@ethersproject/networks": { "packages": { - "@ethereumjs/tx": true, - "@keystonehq/bc-ur-registry-eth": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>rlp": true, - "@metamask/obs-store": true, - "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "ethers>@ethersproject/pbkdf2": { "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "eth-lattice-keyring>rlp": true, - "uuid": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/sha2": true } }, - "@keystonehq/metamask-airgapped-keyring>rlp": { + "ethers>@ethersproject/properties": { "packages": { - "bn.js": true, - "browserify>buffer": true + "ethers>@ethersproject/logger": true } }, - "@lavamoat/lavadome-react": { + "@ethersproject/providers": { "globals": { - "Document.prototype": true, - "DocumentFragment.prototype": true, - "Element.prototype": true, - "Node.prototype": true, + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, "console.warn": true, - "document": true + "setInterval": true, + "setTimeout": true }, "packages": { - "react": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "@metamask/test-bundler>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "@ethersproject/providers>@ethersproject/web": true, + "@ethersproject/providers>bech32": true } }, - "@material-ui/core": { + "ethers>@ethersproject/providers": { "globals": { - "Image": true, - "_formatMuiErrorMessage": true, - "addEventListener": true, + "WebSocket": true, "clearInterval": true, "clearTimeout": true, - "console.error": true, + "console.log": true, "console.warn": true, - "document": true, - "getComputedStyle": true, - "getSelection": true, - "innerHeight": true, - "innerWidth": true, - "matchMedia": true, - "navigator": true, - "performance.now": true, - "removeEventListener": true, - "requestAnimationFrame": true, "setInterval": true, "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles": true, - "@material-ui/core>@material-ui/system": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "@material-ui/core>popper.js": true, - "@material-ui/core>react-transition-group": true, - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true } }, - "@material-ui/core>@material-ui/styles": { + "@ethersproject/providers>@ethersproject/random": { "globals": { - "console.error": true, - "console.warn": true, - "document.createComment": true, - "document.head": true - }, + "crypto.getRandomValues": true + } + }, + "ethers>@ethersproject/random": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, - "@material-ui/core>@material-ui/styles>jss-plugin-global": true, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, - "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "prop-types": true, - "react": true, - "react-redux>hoist-non-react-statics": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss": { - "globals": { - "CSS": true, - "document.createElement": true, - "document.querySelector": true - }, + "ethers>@ethersproject/rlp": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { + "ethers>@ethersproject/sha2": { "packages": { - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { - "globals": { - "CSS": true - }, + "ethers>@ethersproject/signing-key": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-global": { + "ethers>@ethersproject/solidity": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": { + "ethers>@ethersproject/strings": { "packages": { - "@babel/runtime": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { + "ethers>@ethersproject/transactions": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "react-router-dom>tiny-warning": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/signing-key": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { + "ethers>@ethersproject/units": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true + "@ethersproject/bignumber": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { - "globals": { - "document.createElement": true, - "document.documentElement": true, - "getComputedStyle": true - }, + "@ethersproject/wallet": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true - } - }, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": { - "globals": { - "document": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/transactions": true } }, - "@material-ui/core>@material-ui/system": { + "@ethersproject/providers>@ethersproject/web": { "globals": { - "console.error": true + "clearTimeout": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/utils": true, - "prop-types": true - } - }, - "@material-ui/core>@material-ui/utils": { - "packages": { - "@babel/runtime": true, - "prop-types": true, - "prop-types>react-is": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>popper.js": { + "ethers>@ethersproject/providers>@ethersproject/web": { "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator": true, - "requestAnimationFrame": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>react-transition-group": { + "ethers>@ethersproject/web": { "globals": { - "Element": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true }, "packages": { - "@material-ui/core>react-transition-group>dom-helpers": true, - "prop-types": true, - "react": true, - "react-dom": true - } - }, - "@material-ui/core>react-transition-group>dom-helpers": { - "packages": { - "@babel/runtime": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask/abi-utils": { + "ethers>@ethersproject/wordlists": { "packages": { - "@metamask/abi-utils>@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask/abi-utils>@metamask/utils": { + "@metamask/notification-services-controller>firebase>@firebase/app": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "FinalizationRegistry": true, + "console.warn": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/accounts-controller": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/base-controller": true, - "@metamask/eth-snap-keyring": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/utils": true, - "uuid": true - } - }, - "@metamask/address-book-controller": { - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask/announcement-controller": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { "packages": { - "@metamask/announcement-controller>@metamask/base-controller": true + "@metamask/notification-services-controller>firebase>@firebase/util": true } }, - "@metamask/announcement-controller>@metamask/base-controller": { + "@metamask/notification-services-controller>firebase>@firebase/installations": { "globals": { + "BroadcastChannel": true, + "Headers": true, + "btoa": true, + "console.error": true, + "crypto": true, + "fetch": true, + "msCrypto": true, + "navigator.onLine": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask/approval-controller": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { "globals": { - "console.info": true + "console": true }, "packages": { - "@metamask/approval-controller>nanoid": true, - "@metamask/base-controller": true, - "@metamask/rpc-errors": true - } - }, - "@metamask/approval-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@swc/helpers>tslib": true } }, - "@metamask/assets-controllers": { + "@metamask/notification-services-controller>firebase>@firebase/messaging": { "globals": { - "AbortController": true, "Headers": true, + "Notification.maxActions": true, + "Notification.permission": true, + "Notification.requestPermission": true, + "PushSubscription.prototype.hasOwnProperty": true, + "ServiceWorkerRegistration": true, "URL": true, - "URLSearchParams": true, - "clearInterval": true, - "clearTimeout": true, - "console.error": true, - "console.log": true, - "setInterval": true, + "addEventListener": true, + "atob": true, + "btoa": true, + "clients.matchAll": true, + "clients.openWindow": true, + "console.warn": true, + "document": true, + "fetch": true, + "indexedDB": true, + "location.href": true, + "location.origin": true, + "navigator": true, + "origin.replace": true, + "registration.showNotification": true, "setTimeout": true }, "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/bignumber": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/abi-utils": true, - "@metamask/assets-controllers>@metamask/polling-controller": true, - "@metamask/base-controller": true, - "@metamask/contract-metadata": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "bn.js": true, - "cockatiel": true, - "ethers>@ethersproject/address": true, - "lodash": true, - "single-call-balance-checker-abi": true, - "uuid": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/installations": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, + "@swc/helpers>tslib": true } }, - "@metamask/assets-controllers>@metamask/polling-controller": { + "@metamask/notification-services-controller>firebase>@firebase/util": { "globals": { - "clearTimeout": true, - "console.error": true, + "atob": true, + "browser": true, + "btoa": true, + "chrome": true, + "console": true, + "document": true, + "indexedDB": true, + "navigator": true, + "process": true, + "self": true, "setTimeout": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, + "process": true + } + }, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "eth-lattice-keyring>rlp": true, "uuid": true } }, - "@metamask/base-controller": { - "globals": { - "setTimeout": true - }, + "@keystonehq/bc-ur-registry-eth": { "packages": { - "immer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "uuid": true } }, - "@metamask/browser-passworder": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { "globals": { - "CryptoKey": true, - "btoa": true, - "crypto.getRandomValues": true, - "crypto.subtle.decrypt": true, - "crypto.subtle.deriveKey": true, - "crypto.subtle.encrypt": true, - "crypto.subtle.exportKey": true, - "crypto.subtle.importKey": true - }, - "packages": { - "@metamask/browser-passworder>@metamask/utils": true, - "browserify>buffer": true - } - }, - "@metamask/browser-passworder>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/controller-utils": { - "globals": { - "URL": true, - "console.error": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/controller-utils>@spruceid/siwe-parser": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/utils": true, - "bn.js": true, - "browserify>buffer": true, - "eslint>fast-deep-equal": true, - "eth-ens-namehash": true - } - }, - "@metamask/controller-utils>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { - "packages": { - "browserify>buffer": true - } - }, - "@metamask/controllers>web3": { - "globals": { - "XMLHttpRequest": true - } - }, - "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { - "globals": { - "fetch": true - } - }, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { - "globals": { - "fetch": true - } - }, - "@metamask/ens-controller": { - "packages": { - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/ens-controller>@metamask/utils": true, - "punycode": true - } - }, - "@metamask/ens-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-json-rpc-filters": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/eth-query": true, - "@metamask/json-rpc-engine": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/safe-event-emitter": true, - "pify": true - } - }, - "@metamask/eth-json-rpc-middleware": { - "globals": { - "URL": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true - } - }, - "@metamask/eth-json-rpc-middleware>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-json-rpc-provider": { - "packages": { - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "uuid": true - } - }, - "@metamask/eth-ledger-bridge-keyring": { - "globals": { - "addEventListener": true, - "console.error": true, - "document.createElement": true, - "document.head.appendChild": true, - "fetch": true, - "removeEventListener": true - }, - "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, - "@metamask/eth-sig-util": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { - "globals": { - "console.warn": true - }, - "packages": { - "@ethersproject/abi": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, - "browserify>buffer": true, - "ethers>@ethersproject/rlp": true, - "semver": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { - "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { - "globals": { - "console.warn": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { - "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true, - "@metamask/ppom-validator>crypto-js": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { - "globals": { - "console.warn": true - }, - "packages": { - "wait-on>rxjs": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/providers": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/wordlists": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { - "globals": { - "__ledgerLogsListen": "write", - "console.error": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { - "globals": { - "crypto": true, "define": true - } - }, - "@metamask/eth-query": { - "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "watchify>xtend": true - } - }, - "@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-sig-util>tweetnacl": { - "globals": { - "crypto": true, - "msCrypto": true, - "nacl": "write" - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/eth-snap-keyring": { - "globals": { - "URL": true, - "console.error": true - }, - "packages": { - "@ethereumjs/tx": true, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/eth-snap-keyring>uuid": true, - "@metamask/keyring-api": true, - "@metamask/utils>@metamask/superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-snap-keyring>uuid": { - "globals": { - "crypto": true - } - }, - "@metamask/eth-token-tracker": { - "globals": { - "console.warn": true - }, - "packages": { - "@babel/runtime": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/eth-token-tracker>deep-equal": true, - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/safe-event-emitter": true, - "bn.js": true, - "human-standard-token-abi": true - } - }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, - "@metamask/safe-event-emitter": true, - "pify": true - } - }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@ngraveio/bc-ur": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "buffer": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-token-tracker>deep-equal": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, - "@metamask/eth-token-tracker>deep-equal>is-date-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, - "@metamask/eth-token-tracker>deep-equal>which-collection": true, - "@ngraveio/bc-ur>assert>object-is": true, - "browserify>util>is-arguments": true, - "browserify>util>which-typed-array": true, - "gulp>vinyl-fs>object.assign": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true, - "string.prototype.matchall>es-abstract>is-regex": true, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>regexp.prototype.flags": true, - "string.prototype.matchall>side-channel": true - } - }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true, - "browserify>util>is-arguments": true, - "eslint-plugin-react>array-includes>is-string": true, - "process": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>has-symbols": true - } - }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { - "globals": { - "StopIteration": true - }, - "packages": { - "string.prototype.matchall>internal-slot": true - } - }, - "@metamask/eth-token-tracker>deep-equal>is-date-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, - "eslint-plugin-react>array-includes>is-string": true, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { - "packages": { - "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "@swc/helpers>tslib": true } }, - "@metamask/eth-trezor-keyring": { - "globals": { - "setTimeout": true - }, + "@keystonehq/metamask-airgapped-keyring": { "packages": { "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "@trezor/connect-web": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { - "packages": { - "@metamask/eth-sig-util": true, - "@swc/helpers>tslib": true - } - }, - "@metamask/eth-trezor-keyring>hdkey": { - "packages": { - "browserify>assert": true, - "crypto-browserify": true, - "ethereumjs-util>create-hash>ripemd160": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "webpack>events": true, + "@keystonehq/metamask-airgapped-keyring>rlp": true, + "uuid": true } }, - "@metamask/etherscan-link": { + "chart.js>@kurkle/color": { "globals": { - "URL": true + "define": true } }, - "@metamask/ethjs": { + "@lavamoat/lavadome-react": { "globals": { - "clearInterval": true, - "setInterval": true + "Document.prototype": true, + "DocumentFragment.prototype": true, + "Element.prototype": true, + "Node.prototype": true, + "console.warn": true, + "document": true }, "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-provider-http": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/number-to-bn": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true + "react": true } }, - "@metamask/ethjs-contract": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { "packages": { - "@babel/runtime": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "promise-to-callback": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true } }, - "@metamask/ethjs-query": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { "globals": { - "console": true - }, + "console.warn": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format": true, - "@metamask/ethjs-query>@metamask/ethjs-rpc": true, - "promise-to-callback": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, + "@metamask/ppom-validator>crypto-js": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true } }, - "@metamask/ethjs-query>@metamask/ethjs-format": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { + "globals": { + "console.warn": true + }, "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "@metamask/ethjs>@metamask/number-to-bn": true + "@ethersproject/abi": true, + "ethers>@ethersproject/rlp": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, + "browserify>buffer": true, + "semver": true } }, - "@metamask/ethjs-query>@metamask/ethjs-rpc": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { + "globals": { + "console.warn": true + }, "packages": { - "promise-to-callback": true + "wait-on>rxjs": true } }, - "@metamask/ethjs>@metamask/ethjs-filter": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { "globals": { - "clearInterval": true, - "setInterval": true + "__ledgerLogsListen": "write", + "console.error": true } }, - "@metamask/ethjs>@metamask/ethjs-provider-http": { + "@material-ui/core": { + "globals": { + "Image": true, + "_formatMuiErrorMessage": true, + "addEventListener": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "getSelection": true, + "innerHeight": true, + "innerWidth": true, + "matchMedia": true, + "navigator": true, + "performance.now": true, + "removeEventListener": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles": true, + "@material-ui/core>@material-ui/system": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>popper.js": true, + "prop-types": true, + "react": true, + "react-dom": true, + "prop-types>react-is": true, + "@material-ui/core>react-transition-group": true } }, - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { + "@material-ui/core>@material-ui/styles": { "globals": { - "XMLHttpRequest": true + "console.error": true, + "console.warn": true, + "document.createComment": true, + "document.head": true + }, + "packages": { + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, + "@material-ui/core>@material-ui/styles>jss-plugin-global": true, + "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, + "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, + "@material-ui/core>@material-ui/styles>jss": true, + "prop-types": true, + "react": true } }, - "@metamask/ethjs>@metamask/ethjs-unit": { + "@material-ui/core>@material-ui/system": { + "globals": { + "console.error": true + }, "packages": { - "@metamask/ethjs>@metamask/number-to-bn": true, - "bn.js": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "prop-types": true } }, - "@metamask/ethjs>@metamask/ethjs-util": { + "@material-ui/core>@material-ui/utils": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "browserify>buffer": true + "@babel/runtime": true, + "prop-types": true, + "prop-types>react-is": true } }, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "@metamask/abi-utils": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + "@metamask/utils>@metamask/superstruct": true, + "@metamask/abi-utils>@metamask/utils": true } }, - "@metamask/ethjs>@metamask/number-to-bn": { + "@metamask/accounts-controller": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, + "@metamask/eth-snap-keyring": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "uuid": true } }, - "@metamask/ethjs>ethjs-abi": { + "@metamask/address-book-controller": { "packages": { - "@metamask/ethjs>ethjs-abi>number-to-bn": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true } }, - "@metamask/ethjs>ethjs-abi>number-to-bn": { + "@metamask/announcement-controller": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true + "@metamask/announcement-controller>@metamask/base-controller": true } }, - "@metamask/ethjs>js-sha3": { + "@metamask/approval-controller": { "globals": { - "define": true + "console.info": true }, "packages": { - "process": true + "@metamask/base-controller": true, + "@metamask/rpc-errors": true, + "nanoid": true } }, - "@metamask/gas-fee-controller": { + "@metamask/assets-controllers": { "globals": { + "AbortController": true, + "Headers": true, + "URL": true, + "URLSearchParams": true, "clearInterval": true, + "clearTimeout": true, "console.error": true, - "setInterval": true + "console.log": true, + "setInterval": true, + "setTimeout": true }, "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/abi-utils": true, + "@metamask/base-controller": true, + "@metamask/contract-metadata": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, + "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, "bn.js": true, + "cockatiel": true, + "lodash": true, + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, + "single-call-balance-checker-abi": true, "uuid": true } }, - "@metamask/jazzicon": { + "@metamask/base-controller": { "globals": { - "document.createElement": true, - "document.createElementNS": true + "setTimeout": true }, "packages": { - "@metamask/jazzicon>color": true, - "@metamask/jazzicon>mersenne-twister": true + "immer": true } }, - "@metamask/jazzicon>color": { + "@metamask/announcement-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/jazzicon>color>clone": true, - "@metamask/jazzicon>color>color-convert": true, - "@metamask/jazzicon>color>color-string": true + "immer": true } }, - "@metamask/jazzicon>color>clone": { + "@metamask/name-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "browserify>buffer": true + "immer": true } }, - "@metamask/jazzicon>color>color-convert": { + "@metamask/rate-limit-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/jazzicon>color>color-convert>color-name": true + "immer": true } }, - "@metamask/jazzicon>color>color-string": { + "@metamask/browser-passworder": { + "globals": { + "CryptoKey": true, + "btoa": true, + "crypto.getRandomValues": true, + "crypto.subtle.decrypt": true, + "crypto.subtle.deriveKey": true, + "crypto.subtle.encrypt": true, + "crypto.subtle.exportKey": true, + "crypto.subtle.importKey": true + }, "packages": { - "jest-canvas-mock>moo-color>color-name": true + "@metamask/browser-passworder>@metamask/utils": true, + "browserify>buffer": true } }, - "@metamask/json-rpc-engine": { - "packages": { - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "@metamask/utils": true + "eth-keyring-controller>@metamask/browser-passworder": { + "globals": { + "crypto": true } }, - "@metamask/json-rpc-middleware-stream": { + "@metamask/controller-utils": { "globals": { - "console.warn": true, + "URL": true, + "console.error": true, + "fetch": true, "setTimeout": true }, "packages": { - "@metamask/safe-event-emitter": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, "@metamask/utils": true, - "readable-stream": true + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "bn.js": true, + "browserify>buffer": true, + "eth-ens-namehash": true, + "eslint>fast-deep-equal": true } }, - "@metamask/keyring-api": { - "globals": { - "URL": true - }, + "@metamask/ens-controller": { "packages": { - "@metamask/keyring-api>@metamask/utils": true, - "@metamask/keyring-api>bech32": true, - "@metamask/keyring-api>uuid": true, - "@metamask/utils>@metamask/superstruct": true + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "punycode": true } }, - "@metamask/keyring-api>@metamask/utils": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "clearTimeout": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/safe-event-emitter": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true, + "pify": true } }, - "@metamask/keyring-api>uuid": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { - "crypto": true - } - }, - "@metamask/keyring-controller": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/base-controller": true, - "@metamask/browser-passworder": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, - "@metamask/keyring-controller>@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, - "@metamask/keyring-controller>ethereumjs-wallet": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/utils": true + "@metamask/safe-event-emitter": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { @@ -1502,518 +984,459 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, "@metamask/scure-bip39": true, - "browserify>buffer": true + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { + "@metamask/eth-json-rpc-filters": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "console.error": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/safe-event-emitter": true, + "@metamask/name-controller>async-mutex": true, + "pify": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "globals": { + "fetch": true, + "setTimeout": true + }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true + "@metamask/eth-json-rpc-provider": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { + "@metamask/eth-json-rpc-middleware": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "URL": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/eth-sig-util": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/eth-json-rpc-middleware>@metamask/utils": true, + "@metamask/eth-json-rpc-middleware>klona": true, + "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": { + "@metamask/eth-json-rpc-provider": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, - "browserify>buffer": true, - "crypto-browserify>randombytes": true + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "uuid": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "@metamask/eth-ledger-bridge-keyring": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "addEventListener": true, + "console.error": true, + "document.createElement": true, + "document.head.appendChild": true, + "fetch": true, + "removeEventListener": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, + "@metamask/eth-sig-util": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/keyring-controller>ethereumjs-wallet": { + "@metamask/eth-query": { "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, - "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, - "browserify>buffer": true, - "crypto-browserify": true, - "crypto-browserify>randombytes": true, - "eth-lattice-keyring>gridplus-sdk>aes-js": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "uuid": true + "@metamask/eth-query>json-rpc-random-id": true, + "watchify>xtend": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "@metamask/eth-sig-util": { "packages": { - "browserify>assert": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ethers>@ethersproject/sha2>hash.js": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true, - "bn.js": true, - "browserify>assert": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true - } - }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { - "packages": { - "bn.js": true, - "browserify>buffer": true - } - }, - "@metamask/logging-controller": { - "packages": { - "@metamask/base-controller": true, - "uuid": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/logo": { - "globals": { - "addEventListener": true, - "document.body.appendChild": true, - "document.createElementNS": true, - "innerHeight": true, - "innerWidth": true, - "requestAnimationFrame": true - }, + "@metamask/keyring-controller>@metamask/eth-sig-util": { "packages": { - "@metamask/logo>gl-mat4": true, - "@metamask/logo>gl-vec3": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/message-manager": { + "@metamask/signature-controller>@metamask/eth-sig-util": { "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/utils": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/message-manager>jsonschema": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring": { "packages": { - "browserify>url": true - } - }, - "@metamask/message-signing-snap>@noble/ciphers": { - "globals": { - "TextDecoder": true, - "TextEncoder": true, - "crypto": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "crypto-browserify>randombytes": true } }, - "@metamask/message-signing-snap>@noble/curves": { + "@metamask/eth-snap-keyring": { "globals": { - "TextEncoder": true + "URL": true, + "console.error": true }, "packages": { - "@noble/hashes": true + "@ethereumjs/tx": true, + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, + "@metamask/keyring-api": true, + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, + "webpack>events": true, + "@metamask/eth-snap-keyring>uuid": true } }, - "@metamask/name-controller": { + "@metamask/eth-token-tracker": { "globals": { - "fetch": true + "console.warn": true }, "packages": { - "@metamask/controller-utils": true, - "@metamask/name-controller>@metamask/base-controller": true, - "@metamask/name-controller>@metamask/utils": true, - "@metamask/name-controller>async-mutex": true + "@babel/runtime": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true, + "@metamask/safe-event-emitter": true, + "bn.js": true, + "@metamask/eth-token-tracker>deep-equal": true, + "human-standard-token-abi": true } }, - "@metamask/name-controller>@metamask/base-controller": { + "@metamask/eth-trezor-keyring": { "globals": { "setTimeout": true }, "packages": { - "immer": true + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, + "@trezor/connect-web": true, + "browserify>buffer": true, + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/name-controller>@metamask/utils": { + "@metamask/etherscan-link": { "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "URL": true } }, - "@metamask/name-controller>async-mutex": { + "@metamask/ethjs": { "globals": { - "clearTimeout": true, - "setTimeout": true + "clearInterval": true, + "setInterval": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-provider-http": true, + "@metamask/ethjs-query": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true } }, - "@metamask/network-controller": { - "globals": { - "btoa": true, - "fetch": true, - "setTimeout": true - }, + "@metamask/ethjs-contract": { "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-json-rpc-provider": true, - "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/network-controller>reselect": true, - "browserify>assert": true, - "browserify>util": true, - "uri-js": true, - "uuid": true + "@babel/runtime": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true, + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "@metamask/ethjs>@metamask/ethjs-filter": { "globals": { - "setTimeout": true - }, + "clearInterval": true, + "setInterval": true + } + }, + "@metamask/ethjs-query>@metamask/ethjs-format": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "node-fetch": true + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": { + "@metamask/ethjs>@metamask/ethjs-provider-http": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/safe-event-emitter": true + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": { + "@metamask/ethjs-query": { + "globals": { + "console": true + }, "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/ethjs-query>@metamask/ethjs-format": true, + "@metamask/ethjs-query>@metamask/ethjs-rpc": true, + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": { + "@metamask/ethjs-query>@metamask/ethjs-rpc": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/ethjs>@metamask/ethjs-unit": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/ethjs>@metamask/ethjs-util": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": { + "@metamask/gas-fee-controller": { "globals": { - "URL": true, + "clearInterval": true, "console.error": true, - "setTimeout": true + "setInterval": true }, "packages": { - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/polling-controller": true, "bn.js": true, - "pify": true + "uuid": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { + "@metamask/jazzicon": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "document.createElement": true, + "document.createElementNS": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/jazzicon>color": true, + "@metamask/jazzicon>mersenne-twister": true } }, - "@metamask/network-controller>@metamask/json-rpc-engine": { + "@metamask/json-rpc-engine": { "packages": { - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "@metamask/utils": true } }, - "@metamask/network-controller>@metamask/rpc-errors": { + "@metamask/json-rpc-middleware-stream": { + "globals": { + "console.warn": true, + "setTimeout": true + }, "packages": { - "@metamask/network-controller>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true + "@metamask/safe-event-emitter": true, + "@metamask/utils": true, + "readable-stream": true } }, - "@metamask/network-controller>@metamask/utils": { + "@metamask/snaps-sdk>@metamask/key-tree": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "crypto.subtle": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, + "@metamask/scure-bip39": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>reselect": { - "globals": { - "WeakRef": true, - "console.warn": true, - "unstable_autotrackMemoize": true + "@metamask/utils>@scure/base": true } }, - "@metamask/notification-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/keyring-api": { + "packages": { + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-api>@metamask/utils": true, + "@metamask/keyring-api>bech32": true } }, - "@metamask/notification-services-controller": { - "globals": { - "Intl.NumberFormat": true, - "addEventListener": true, - "fetch": true, - "registration": true, - "removeEventListener": true - }, + "@metamask/keyring-controller": { "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, - "@metamask/notification-services-controller>bignumber.js": true, - "@metamask/notification-services-controller>firebase": true, - "@metamask/profile-sync-controller": true, + "@metamask/browser-passworder": true, + "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, + "@metamask/keyring-controller>@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/utils": true, - "loglevel": true, - "uuid": true + "@metamask/name-controller>async-mutex": true, + "@metamask/keyring-controller>ethereumjs-wallet": true } }, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { - "globals": { - "SuppressedError": true + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": { + "packages": { + "@metamask/keyring-snap-client": true } }, - "@metamask/notification-services-controller>bignumber.js": { + "@metamask/keyring-snap-client": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-snap-client>uuid": true + } + }, + "@metamask/keyring-api>@metamask/keyring-utils": { "globals": { - "crypto": true, - "define": true + "URL": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": true } }, - "@metamask/notification-services-controller>firebase": { + "@metamask/logging-controller": { "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/messaging": true + "@metamask/base-controller": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app": { - "globals": { - "FinalizationRegistry": true, - "console.warn": true + "@metamask/logo": { + "globals": { + "addEventListener": true, + "document.body.appendChild": true, + "document.createElementNS": true, + "innerHeight": true, + "innerWidth": true, + "requestAnimationFrame": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/logo>gl-mat4": true, + "@metamask/logo>gl-vec3": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { + "@metamask/message-manager": { "packages": { - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "browserify>buffer": true, + "webpack>events": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { + "@metamask/name-controller": { "globals": { - "console": true + "fetch": true }, "packages": { - "@swc/helpers>tslib": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": { - "globals": { - "DOMException": true, - "IDBCursor": true, - "IDBDatabase": true, - "IDBIndex": true, - "IDBObjectStore": true, - "IDBRequest": true, - "IDBTransaction": true, - "indexedDB.deleteDatabase": true, - "indexedDB.open": true + "@metamask/name-controller>@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/name-controller>@metamask/utils": true, + "@metamask/name-controller>async-mutex": true } }, - "@metamask/notification-services-controller>firebase>@firebase/installations": { + "@metamask/network-controller": { "globals": { - "BroadcastChannel": true, - "Headers": true, "btoa": true, - "console.error": true, - "crypto": true, "fetch": true, - "msCrypto": true, - "navigator.onLine": true, "setTimeout": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, + "@metamask/eth-json-rpc-middleware": true, + "@metamask/eth-json-rpc-provider": true, + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/utils": true, + "eslint>fast-deep-equal": true, + "reselect": true, + "uri-js": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/messaging": { + "@metamask/transaction-controller>@metamask/nonce-tracker": { + "packages": { + "@ethersproject/providers": true, + "browserify>assert": true, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true + } + }, + "@metamask/notification-services-controller": { "globals": { - "Headers": true, - "Notification.maxActions": true, - "Notification.permission": true, - "Notification.requestPermission": true, - "PushSubscription.prototype.hasOwnProperty": true, - "ServiceWorkerRegistration": true, - "URL": true, + "Intl.NumberFormat": true, "addEventListener": true, - "atob": true, - "btoa": true, - "clients.matchAll": true, - "clients.openWindow": true, - "console.warn": true, - "document": true, "fetch": true, - "indexedDB": true, - "location.href": true, - "location.origin": true, - "navigator": true, - "origin.replace": true, - "registration.showNotification": true, - "setTimeout": true + "registration": true, + "removeEventListener": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/installations": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true, - "@swc/helpers>tslib": true + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/profile-sync-controller": true, + "@metamask/utils": true, + "@metamask/notification-services-controller>bignumber.js": true, + "@metamask/notification-services-controller>firebase": true, + "loglevel": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/util": { - "globals": { - "atob": true, - "browser": true, - "btoa": true, - "chrome": true, - "console": true, - "document": true, - "indexedDB": true, - "navigator": true, - "process": true, - "self": true, - "setTimeout": true - }, + "@metamask/ethjs>@metamask/number-to-bn": { "packages": { - "process": true + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, "@metamask/object-multiplex": { @@ -2025,11 +1448,6 @@ "readable-stream": true } }, - "@metamask/object-multiplex>once": { - "packages": { - "@metamask/object-multiplex>once>wrappy": true - } - }, "@metamask/obs-store": { "packages": { "@metamask/safe-event-emitter": true, @@ -2044,16 +1462,11 @@ "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/json-rpc-engine": true, - "@metamask/permission-controller>nanoid": true, "@metamask/rpc-errors": true, "@metamask/utils": true, "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/permission-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "immer": true, + "nanoid": true } }, "@metamask/permission-log-controller": { @@ -2062,21 +1475,6 @@ "@metamask/permission-log-controller>@metamask/utils": true } }, - "@metamask/permission-log-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/phishing-controller": { "globals": { "TextEncoder": true, @@ -2085,12 +1483,12 @@ "fetch": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/base-controller": true, "@metamask/controller-utils": true, "@noble/hashes": true, - "punycode": true, - "webpack-cli>fastest-levenshtein": true + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack-cli>fastest-levenshtein": true, + "punycode": true } }, "@metamask/polling-controller": { @@ -2121,21 +1519,6 @@ "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2145,48 +1528,11 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, - "@metamask/eth-query>json-rpc-random-id": true, + "await-semaphore": true, + "browserify>buffer": true, "@metamask/ppom-validator>crypto-js": true, "@metamask/ppom-validator>elliptic": true, - "await-semaphore": true, - "browserify>buffer": true - } - }, - "@metamask/ppom-validator>crypto-js": { - "globals": { - "crypto": true, - "define": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "@metamask/ppom-validator>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic>hmac-drbg": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "ethers>@ethersproject/sha2>hash.js": true + "@metamask/eth-query>json-rpc-random-id": true } }, "@metamask/preferences-controller": { @@ -2208,55 +1554,18 @@ "dispatchEvent": true, "fetch": true, "removeEventListener": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/message-signing-snap>@noble/ciphers": true, - "@metamask/profile-sync-controller>siwe": true, - "@noble/hashes": true, - "browserify>buffer": true, - "loglevel": true - } - }, - "@metamask/profile-sync-controller>siwe": { - "globals": { - "console.error": true, - "console.warn": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random": true, - "ethers": true - } - }, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, - "browserify>browser-resolve": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "setTimeout": true + }, "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + "@metamask/base-controller": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/network-controller": true, + "@metamask/profile-sync-controller>@noble/ciphers": true, + "@noble/hashes": true, + "browserify>buffer": true, + "loglevel": true, + "@metamask/profile-sync-controller>siwe": true } }, "@metamask/queued-request-controller": { @@ -2278,64 +1587,22 @@ "@metamask/rate-limit-controller>@metamask/utils": true } }, - "@metamask/rate-limit-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, + "@metamask/remote-feature-flag-controller": { "packages": { - "immer": true + "@metamask/base-controller": true, + "cockatiel": true } }, - "@metamask/rate-limit-controller>@metamask/rpc-errors": { + "@metamask/rpc-errors": { "packages": { - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/utils": true, "@metamask/rpc-errors>fast-safe-stringify": true } }, - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rate-limit-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rpc-errors": { + "@metamask/rate-limit-controller>@metamask/rpc-errors": { "packages": { - "@metamask/rpc-errors>fast-safe-stringify": true, - "@metamask/utils": true - } - }, - "@metamask/rpc-methods-flask>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/rpc-methods>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/rpc-errors>fast-safe-stringify": true } }, "@metamask/safe-event-emitter": { @@ -2355,12 +1622,6 @@ "@metamask/utils>@scure/base": true } }, - "@metamask/scure-bip39>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true - } - }, "@metamask/selected-network-controller": { "packages": { "@metamask/base-controller": true, @@ -2374,40 +1635,14 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/keyring-controller": true, "@metamask/logging-controller": true, - "@metamask/message-manager>jsonschema": true, - "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/utils": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/message-manager>jsonschema": true, + "uuid": true } }, "@metamask/smart-transactions-controller": { @@ -2420,72 +1655,19 @@ "setInterval": true }, "packages": { + "@metamask/smart-transactions-controller>@ethereumjs/tx": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, "@ethersproject/bytes": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "@metamask/smart-transactions-controller>@metamask/polling-controller": true, - "@metamask/smart-transactions-controller>bignumber.js": true, + "@metamask/polling-controller": true, "@metamask/transaction-controller": true, + "@metamask/smart-transactions-controller>bignumber.js": true, "browserify>buffer": true, "fast-json-patch": true, "lodash": true } }, - "@metamask/smart-transactions-controller>@ethereumjs/tx": { - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { - "packages": { - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/util": { - "globals": { - "console.warn": true, - "fetch": true - }, - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/smart-transactions-controller>@metamask/polling-controller": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "uuid": true - } - }, - "@metamask/smart-transactions-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, "@metamask/snaps-controllers": { "globals": { "DecompressionStream": true, @@ -2503,364 +1685,498 @@ "@metamask/permission-controller": true, "@metamask/post-message-stream": true, "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@xstate/fsm": true, - "@metamask/snaps-controllers>concat-stream": true, - "@metamask/snaps-controllers>get-npm-tarball-url": true, - "@metamask/snaps-controllers>nanoid": true, - "@metamask/snaps-controllers>readable-web-to-node-stream": true, - "@metamask/snaps-controllers>tar-stream": true, + "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/snaps-rpc-methods": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/utils": true, + "@metamask/snaps-controllers>@xstate/fsm": true, "browserify>browserify-zlib": true, + "@metamask/snaps-controllers>concat-stream": true, "eslint>fast-deep-equal": true, + "@metamask/snaps-controllers>get-npm-tarball-url": true, "immer": true, + "nanoid": true, "readable-stream": true, - "semver": true + "@metamask/snaps-controllers>readable-web-to-node-stream": true, + "semver": true, + "@metamask/snaps-controllers>tar-stream": true } }, - "@metamask/snaps-controllers-flask>nanoid": { + "@metamask/snaps-execution-environments": { "globals": { - "crypto.getRandomValues": true + "document.getElementById": true + }, + "packages": { + "@metamask/post-message-stream": true, + "@metamask/snaps-utils": true, + "@metamask/utils": true } }, - "@metamask/snaps-controllers>concat-stream": { + "@metamask/snaps-utils>@metamask/snaps-registry": { + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true + } + }, + "@metamask/snaps-rpc-methods": { + "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, + "@metamask/permission-controller": true, + "@metamask/rpc-errors": true, + "@metamask/snaps-sdk": true, + "@metamask/snaps-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true + } + }, + "@metamask/snaps-sdk": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true + } + }, + "@metamask/snaps-utils": { + "globals": { + "File": true, + "FileReader": true, + "TextDecoder": true, + "TextEncoder": true, + "URL": true, + "console.error": true, + "console.log": true, + "console.warn": true, + "crypto": true, + "document.body.appendChild": true, + "document.createElement": true, + "fetch": true + }, + "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, + "@metamask/permission-controller": true, + "@metamask/rpc-errors": true, + "@metamask/snaps-utils>@metamask/slip44": true, + "@metamask/snaps-sdk": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "chalk": true, + "@metamask/snaps-utils>cron-parser": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "@metamask/snaps-utils>fast-xml-parser": true, + "@metamask/snaps-utils>marked": true, + "@metamask/snaps-utils>rfdc": true, + "semver": true, + "@metamask/snaps-utils>validate-npm-package-name": true + } + }, + "@metamask/transaction-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, "packages": { + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/abi": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/metamask-eth-abis": true, + "@metamask/network-controller": true, + "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, + "bn.js": true, "browserify>buffer": true, - "browserify>concat-stream>typedarray": true, - "pumpify>inherits": true, - "readable-stream": true, - "terser>source-map-support>buffer-from": true + "eth-method-registry": true, + "webpack>events": true, + "fast-json-patch": true, + "lodash": true, + "uuid": true } }, - "@metamask/snaps-controllers>nanoid": { + "@metamask/user-operation-controller": { "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/snaps-controllers>readable-web-to-node-stream": { - "packages": { - "readable-stream": true - } - }, - "@metamask/snaps-controllers>tar-stream": { + "fetch": true + }, "packages": { - "@metamask/snaps-controllers>tar-stream>b4a": true, - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx": true, - "browserify>browser-resolve": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/transaction-controller": true, + "@metamask/utils": true, + "bn.js": true, + "webpack>events": true, + "lodash": true, + "uuid": true } }, - "@metamask/snaps-controllers>tar-stream>b4a": { + "@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx": { + }, "packages": { - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true, - "webpack>events": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { - "globals": { - "queueMicrotask": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-execution-environments": { + "@metamask/abi-utils>@metamask/utils": { "globals": { - "document.getElementById": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/post-message-stream": true, - "@metamask/snaps-utils": true, - "@metamask/utils": true - } - }, - "@metamask/snaps-rpc-methods": { - "packages": { - "@metamask/permission-controller": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk": { + "@metamask/browser-passworder>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk>@metamask/key-tree": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/scure-bip39": true, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": { + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils": { + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { "globals": { - "File": true, - "FileReader": true, "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true + "TextEncoder": true }, "packages": { - "@metamask/permission-controller": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, "@noble/hashes": true, - "chalk": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils>@metamask/snaps-registry": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>cron-parser": { + "@metamask/eth-json-rpc-middleware>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>browser-resolve": true, - "luxon": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>fast-xml-parser": { + "@metamask/eth-sig-util>@metamask/utils": { "globals": { - "entityName": true, - "val": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/snaps-utils>fast-xml-parser>strnum": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>marked": { + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { "globals": { - "console.error": true, - "console.warn": true, - "define": true - } - }, - "@metamask/snaps-utils>rfdc": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>buffer": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name": { + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/snaps-utils>validate-npm-package-name>builtins": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name>builtins": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "process": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/test-bundler>@ethersproject/networks": { + "@metamask/eth-snap-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "ethers>@ethersproject/logger": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller": { + "@metamask/keyring-api>@metamask/utils": { "globals": { - "clearTimeout": true, - "console.error": true, - "fetch": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/abi": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/network-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller>@metamask/nonce-tracker": true, - "@metamask/utils": true, - "bn.js": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "eth-method-registry": true, - "fast-json-patch": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker": { + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@ethersproject/providers": true, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true, - "browserify>assert": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "@metamask/name-controller>@metamask/utils": { "globals": { - "clearTimeout": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller": { + "@metamask/permission-log-controller>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/polling-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller": true, - "@metamask/user-operation-controller>@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "bn.js": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller>@metamask/utils": { + "@metamask/post-message-stream>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils": { + "@metamask/rate-limit-controller>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils>@scure/base": { + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, "@ngraveio/bc-ur": { "packages": { "@ngraveio/bc-ur>@keystonehq/alias-sampling": true, + "browserify>assert": true, "@ngraveio/bc-ur>bignumber.js": true, + "browserify>buffer": true, "@ngraveio/bc-ur>cbor-sync": true, "@ngraveio/bc-ur>crc": true, "@ngraveio/bc-ur>jsbi": true, - "addons-linter>sha.js": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@ngraveio/bc-ur>assert>object-is": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true + "addons-linter>sha.js": true } }, - "@ngraveio/bc-ur>bignumber.js": { + "@metamask/profile-sync-controller>@noble/ciphers": { "globals": { - "crypto": true, - "define": true + "TextDecoder": true, + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>cbor-sync": { + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": { "globals": { - "define": true + "TextEncoder": true }, "packages": { - "browserify>buffer": true + "@noble/hashes": true } }, - "@ngraveio/bc-ur>crc": { - "packages": { - "browserify>buffer": true + "@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>jsbi": { + "@metamask/scure-bip39>@noble/hashes": { "globals": { - "define": true + "TextEncoder": true, + "crypto": true } }, - "@noble/hashes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { "globals": { "TextEncoder": true, "crypto": true @@ -2877,6 +2193,20 @@ "navigator.userAgent": true } }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { + "globals": { + "console.log": true + } + }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { + "globals": { + "XMLHttpRequest": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + } + }, "@reduxjs/toolkit": { "globals": { "AbortController": true, @@ -2888,42 +2218,46 @@ "setTimeout": true }, "packages": { - "@reduxjs/toolkit>reselect": true, "immer": true, "process": true, "redux": true, - "redux-thunk": true + "redux-thunk": true, + "@reduxjs/toolkit>reselect": true } }, - "@segment/loosely-validate-event": { - "packages": { - "@segment/loosely-validate-event>component-type": true, - "@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@sentry/browser": { + "react-router-dom-v5-compat>@remix-run/router": { "globals": { - "PerformanceObserver.supportedEntryTypes": true, + "AbortController": true, + "DOMException": true, + "FormData": true, + "Headers": true, "Request": true, + "Response": true, "URL": true, - "XMLHttpRequest.prototype": true, - "__SENTRY_DEBUG__": true, - "__SENTRY_RELEASE__": true, - "addEventListener": true, - "console.error": true, - "indexedDB.open": true, - "performance.timeOrigin": true, - "setTimeout": true - }, + "URLSearchParams": true, + "console": true, + "document.defaultView": true + } + }, + "@metamask/utils>@scure/base": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + } + }, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { "packages": { - "@sentry/browser>@sentry-internal/browser-utils": true, - "@sentry/browser>@sentry-internal/feedback": true, - "@sentry/browser>@sentry-internal/replay": true, - "@sentry/browser>@sentry-internal/replay-canvas": true, - "@sentry/browser>@sentry/core": true, - "@sentry/utils": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true + } + }, + "@segment/loosely-validate-event": { + "packages": { + "browserify>assert": true, + "browserify>buffer": true, + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true } }, "@sentry/browser>@sentry-internal/browser-utils": { @@ -2962,6 +2296,25 @@ "@sentry/utils": true } }, + "@sentry/browser>@sentry-internal/replay-canvas": { + "globals": { + "Blob": true, + "HTMLCanvasElement": true, + "HTMLImageElement": true, + "ImageData": true, + "URL.createObjectURL": true, + "WeakRef": true, + "Worker": true, + "cancelAnimationFrame": true, + "console.error": true, + "createImageBitmap": true, + "document": true + }, + "packages": { + "@sentry/browser>@sentry/core": true, + "@sentry/utils": true + } + }, "@sentry/browser>@sentry-internal/replay": { "globals": { "Blob": true, @@ -3011,21 +2364,25 @@ "@sentry/utils": true } }, - "@sentry/browser>@sentry-internal/replay-canvas": { + "@sentry/browser": { "globals": { - "Blob": true, - "HTMLCanvasElement": true, - "HTMLImageElement": true, - "ImageData": true, - "URL.createObjectURL": true, - "WeakRef": true, - "Worker": true, - "cancelAnimationFrame": true, + "PerformanceObserver.supportedEntryTypes": true, + "Request": true, + "URL": true, + "XMLHttpRequest.prototype": true, + "__SENTRY_DEBUG__": true, + "__SENTRY_RELEASE__": true, + "addEventListener": true, "console.error": true, - "createImageBitmap": true, - "document": true + "indexedDB.open": true, + "performance.timeOrigin": true, + "setTimeout": true }, "packages": { + "@sentry/browser>@sentry-internal/browser-utils": true, + "@sentry/browser>@sentry-internal/feedback": true, + "@sentry/browser>@sentry-internal/replay-canvas": true, + "@sentry/browser>@sentry-internal/replay": true, "@sentry/browser>@sentry/core": true, "@sentry/utils": true } @@ -3121,20 +2478,61 @@ "btoa": true } }, - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { + "@metamask/controller-utils>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "react-markdown>unist-util-visit": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@storybook/addon-knobs>qs": { + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@swc/helpers>tslib": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + } + }, + "@metamask/profile-sync-controller>siwe>@stablelib/random": { "globals": { - "SuppressedError": true, - "define": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, + "browserify>browser-resolve": true + } + }, + "@trezor/connect-web>@trezor/connect-common": { + "globals": { + "console.warn": true, + "localStorage.getItem": true, + "localStorage.setItem": true, + "navigator": true, + "setTimeout": true, + "window": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true + } + }, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { + "packages": { + "@metamask/eth-sig-util": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web": { @@ -3161,35 +2559,20 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/connect-common": true, + "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/utils": true, - "webpack>events": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect": { "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, "@trezor/connect-web>@trezor/connect>@trezor/transport": true, - "@trezor/connect-web>@trezor/utils": true - } - }, - "@trezor/connect-web>@trezor/connect-common": { - "globals": { - "console.warn": true, - "localStorage.getItem": true, - "localStorage.setItem": true, - "navigator": true, - "setTimeout": true, - "window": true - }, - "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, - "@trezor/connect-web>@trezor/utils": true + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": { @@ -3205,54 +2588,17 @@ "screen.width": true }, "packages": { + "process": true, "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true, - "process": true - } - }, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { - "globals": { - "define": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true } }, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": { "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, - "browserify>buffer": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { - "globals": { - "process": true, - "setTimeout": true - }, - "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { - "globals": { - "console.log": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { - "globals": { - "XMLHttpRequest": true - }, - "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + "browserify>buffer": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": { @@ -3279,16 +2625,10 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/utils>bignumber.js": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@trezor/connect-web>@trezor/utils>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@welldone-software/why-did-you-render": { @@ -3299,63 +2639,197 @@ "console.groupEnd": true, "console.log": true, "console.warn": true, - "define": true, + "define": true, + "setTimeout": true + }, + "packages": { + "lodash": true, + "react": true + } + }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, + "@zxing/library": { + "globals": { + "HTMLImageElement": true, + "HTMLVideoElement": true, + "TextDecoder": true, + "TextEncoder": true, + "URL.createObjectURL": true, + "btoa": true, + "console.log": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library>ts-custom-error": true + } + }, + "@lavamoat/lavapack>readable-stream>abort-controller": { + "globals": { + "AbortController": true + } + }, + "currency-formatter>accounting": { + "globals": { + "define": true + } + }, + "ethers>@ethersproject/json-wallets>aes-js": { + "globals": { + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>aes-js": { + "globals": { + "define": true + } + }, + "chalk>ansi-styles": { + "packages": { + "chalk>ansi-styles>color-convert": true + } + }, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { + "packages": { + "browserify>buffer": true + } + }, + "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true + } + }, + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "browserify>vm-browserify": true + } + }, + "browserify>assert": { + "globals": { + "Buffer": true + }, + "packages": { + "react>object-assign": true, + "browserify>assert>util": true + } + }, + "@metamask/name-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "string.prototype.matchall>es-abstract>available-typed-arrays": { + "packages": { + "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + } + }, + "await-semaphore": { + "packages": { + "process": true, + "browserify>timers-browserify": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { + "globals": { + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, + "console.warn": true, + "document": true, + "location.href": true, + "navigator": true, "setTimeout": true }, "packages": { - "lodash": true, - "react": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/browser": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { "globals": { - "HTMLElement": true, - "HTMLImageElement": true, - "HTMLVideoElement": true, - "clearTimeout": true, - "console.error": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/library": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { "globals": { - "HTMLImageElement": true, - "HTMLVideoElement": true, - "TextDecoder": true, - "TextEncoder": true, - "URL.createObjectURL": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, "btoa": true, - "console.log": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library>ts-custom-error": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "addons-linter>sha.js": { - "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@metamask/snaps-controllers>tar-stream>b4a": { + "globals": { + "TextDecoder": true, + "TextEncoder": true } }, - "await-semaphore": { + "@ensdomains/content-hash>multihashes>multibase>base-x": { "packages": { - "browserify>timers-browserify": true, - "process": true - } - }, - "axios>form-data": { - "globals": { - "FormData": true + "koa>content-disposition>safe-buffer": true } }, "base32-encode": { @@ -3369,6 +2843,53 @@ "define": true } }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/notification-services-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/smart-transactions-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@ngraveio/bc-ur>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@trezor/connect-web>@trezor/utils>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bitwise": { + "packages": { + "browserify>buffer": true + } + }, "blo": { "globals": { "btoa": true @@ -3382,132 +2903,147 @@ "browserify>browser-resolve": true } }, + "eth-lattice-keyring>gridplus-sdk>borc": { + "globals": { + "console": true + }, + "packages": { + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "browserify>buffer": true, + "buffer>ieee754": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + } + }, "bowser": { "globals": { "define": true } }, - "browserify>assert": { + "@metamask/ppom-validator>elliptic>brorand": { "globals": { - "Buffer": true + "crypto": true, + "msCrypto": true }, "packages": { - "browserify>assert>util": true, - "react>object-assign": true + "browserify>browser-resolve": true } }, - "browserify>assert>util": { - "globals": { - "console.error": true, - "console.log": true, - "console.trace": true, - "process": true - }, + "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { - "browserify>assert>util>inherits": true, - "process": true + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>browserify-zlib": { + "crypto-browserify>browserify-cipher": { + "packages": { + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "crypto-browserify>browserify-cipher>browserify-des": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des": { "packages": { - "browserify>assert": true, - "browserify>browserify-zlib>pako": true, "browserify>buffer": true, - "browserify>util": true, - "process": true, - "stream-browserify": true + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>browserify-des>des.js": true, + "pumpify>inherits": true } }, - "browserify>buffer": { - "globals": { - "console": true - }, + "crypto-browserify>public-encrypt>browserify-rsa": { "packages": { - "base64-js": true, - "buffer>ieee754": true + "bn.js": true, + "browserify>buffer": true, + "crypto-browserify>randombytes": true } }, - "browserify>punycode": { - "globals": { - "define": true + "crypto-browserify>browserify-sign": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>create-hmac": true, + "@metamask/ppom-validator>elliptic": true, + "pumpify>inherits": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "stream-browserify": true } }, - "browserify>string_decoder": { + "browserify>browserify-zlib": { "packages": { - "koa>content-disposition>safe-buffer": true + "browserify>assert": true, + "browserify>buffer": true, + "browserify>browserify-zlib>pako": true, + "process": true, + "stream-browserify": true, + "browserify>util": true } }, - "browserify>timers-browserify": { - "globals": { - "clearInterval": true, - "clearTimeout": true, - "setInterval": true, - "setTimeout": true - }, + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { "packages": { - "process": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true } }, - "browserify>url": { + "ethereumjs-util>ethereum-cryptography>bs58check": { "packages": { - "@storybook/addon-knobs>qs": true, - "browserify>punycode": true + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, + "ethereumjs-util>create-hash": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>util": { + "buffer": { "globals": { - "console.error": true, - "console.log": true, - "console.trace": true + "console": true }, "packages": { - "browserify>util>is-arguments": true, - "browserify>util>is-typed-array": true, - "browserify>util>which-typed-array": true, - "koa>is-generator-function": true, - "process": true, - "pumpify>inherits": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>is-arguments": { + "terser>source-map-support>buffer-from": { "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "browserify>buffer": true } }, - "browserify>util>is-typed-array": { + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { "packages": { - "browserify>util>which-typed-array": true + "browserify>buffer": true } }, - "browserify>util>which-typed-array": { + "browserify>buffer": { + "globals": { + "console": true + }, "packages": { - "browserify>util>which-typed-array>for-each": true, - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>available-typed-arrays": true, - "string.prototype.matchall>es-abstract>gopd": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>which-typed-array>for-each": { + "@metamask/snaps-utils>validate-npm-package-name>builtins": { "packages": { - "string.prototype.matchall>es-abstract>is-callable": true + "process": true, + "semver": true } }, - "browserify>vm-browserify": { - "globals": { - "document.body.appendChild": true, - "document.body.removeChild": true, - "document.createElement": true + "string.prototype.matchall>call-bind": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>call-bind>set-function-length": true } }, - "buffer": { + "@ngraveio/bc-ur>cbor-sync": { "globals": { - "console": true + "define": true }, "packages": { - "base64-js": true, - "buffer>ieee754": true + "browserify>buffer": true } }, "chalk": { @@ -3516,16 +3052,6 @@ "chalk>supports-color": true } }, - "chalk>ansi-styles": { - "packages": { - "chalk>ansi-styles>color-convert": true - } - }, - "chalk>ansi-styles>color-convert": { - "packages": { - "jest-canvas-mock>moo-color>color-name": true - } - }, "chart.js": { "globals": { "Intl.NumberFormat": true, @@ -3547,9 +3073,20 @@ "chart.js>@kurkle/color": true } }, - "chart.js>@kurkle/color": { - "globals": { - "define": true + "@ensdomains/content-hash>cids": { + "packages": { + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>cids>multihashes": true, + "@ensdomains/content-hash>cids>uint8arrays": true + } + }, + "ethereumjs-util>create-hash>cipher-base": { + "packages": { + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true, + "stream-browserify": true, + "browserify>string_decoder": true } }, "classnames": { @@ -3558,6 +3095,11 @@ "define": true } }, + "@metamask/jazzicon>color>clone": { + "packages": { + "browserify>buffer": true + } + }, "cockatiel": { "globals": { "AbortController": true, @@ -3571,6 +3113,37 @@ "process": true } }, + "chalk>ansi-styles>color-convert": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color>color-convert": { + "packages": { + "@metamask/jazzicon>color>color-convert>color-name": true + } + }, + "@metamask/jazzicon>color>color-string": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color": { + "packages": { + "@metamask/jazzicon>color>clone": true, + "@metamask/jazzicon>color>color-convert": true, + "@metamask/jazzicon>color>color-string": true + } + }, + "@metamask/snaps-controllers>concat-stream": { + "packages": { + "terser>source-map-support>buffer-from": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "readable-stream": true, + "browserify>concat-stream>typedarray": true + } + }, "copy-to-clipboard": { "globals": { "clipboardData": true, @@ -3589,10 +3162,47 @@ "copy-to-clipboard>toggle-selection": true } }, - "copy-to-clipboard>toggle-selection": { + "@ethereumjs/tx>@ethereumjs/common>crc-32": { "globals": { - "document.activeElement": true, - "document.getSelection": true + "DO_NOT_EXPORT_CRC": true, + "define": true + } + }, + "@ngraveio/bc-ur>crc": { + "packages": { + "browserify>buffer": true + } + }, + "crypto-browserify>create-ecdh": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "@metamask/ppom-validator>elliptic": true + } + }, + "ethereumjs-util>create-hash": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>md5.js": true, + "ethereumjs-util>create-hash>ripemd160": true, + "addons-linter>sha.js": true + } + }, + "crypto-browserify>create-hmac": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>create-hash": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true + } + }, + "@metamask/snaps-utils>cron-parser": { + "packages": { + "browserify>browser-resolve": true, + "luxon": true } }, "crypto-browserify": { @@ -3600,303 +3210,484 @@ "crypto-browserify>browserify-cipher": true, "crypto-browserify>browserify-sign": true, "crypto-browserify>create-ecdh": true, + "ethereumjs-util>create-hash": true, "crypto-browserify>create-hmac": true, "crypto-browserify>diffie-hellman": true, "crypto-browserify>pbkdf2": true, "crypto-browserify>public-encrypt": true, "crypto-browserify>randombytes": true, - "crypto-browserify>randomfill": true, - "ethereumjs-util>create-hash": true + "crypto-browserify>randomfill": true } }, - "crypto-browserify>browserify-cipher": { + "@metamask/ppom-validator>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, "packages": { - "crypto-browserify>browserify-cipher>browserify-des": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "browserify>browser-resolve": true } }, - "crypto-browserify>browserify-cipher>browserify-des": { + "react-beautiful-dnd>css-box-model": { + "globals": { + "getComputedStyle": true, + "pageXOffset": true, + "pageYOffset": true + }, "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>browserify-des>des.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "pumpify>inherits": true + "react-router-dom>tiny-invariant": true } }, - "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { + "globals": { + "document.createElement": true, + "document.documentElement": true, + "getComputedStyle": true + }, "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true } }, - "crypto-browserify>browserify-cipher>evp_bytestokey": { + "currency-formatter": { "packages": { - "ethereumjs-util>create-hash>md5.js": true, - "koa>content-disposition>safe-buffer": true + "currency-formatter>accounting": true, + "currency-formatter>locale-currency": true, + "react>object-assign": true } }, - "crypto-browserify>browserify-sign": { + "debounce-stream": { + "packages": { + "debounce-stream>debounce": true, + "debounce-stream>duplexer": true, + "debounce-stream>through": true + } + }, + "debounce-stream>debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true + } + }, + "nock>debug": { + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, + "packages": { + "nock>debug>ms": true, + "process": true + } + }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, + "string.prototype.matchall>call-bind": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, + "string.prototype.matchall>get-intrinsic": true, + "browserify>util>is-arguments": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "string.prototype.matchall>es-abstract>is-regex": true, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "@ngraveio/bc-ur>assert>object-is": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true, + "gulp>vinyl-fs>object.assign": true, + "string.prototype.matchall>regexp.prototype.flags": true, + "string.prototype.matchall>side-channel": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, + "@metamask/eth-token-tracker>deep-equal>which-collection": true, + "browserify>util>which-typed-array": true + } + }, + "string.prototype.matchall>define-properties>define-data-property": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>gopd": true + } + }, + "string.prototype.matchall>define-properties": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "crypto-browserify>diffie-hellman": { "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "ethereumjs-util>create-hash": true, - "pumpify>inherits": true, + "crypto-browserify>diffie-hellman>miller-rabin": true, + "crypto-browserify>randombytes": true + } + }, + "@material-ui/core>react-transition-group>dom-helpers": { + "packages": { + "@babel/runtime": true + } + }, + "debounce-stream>duplexer": { + "packages": { "stream-browserify": true } }, - "crypto-browserify>create-ecdh": { + "ethers>@ethersproject/signing-key>elliptic": { "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, - "browserify>buffer": true + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>create-hmac": { + "@metamask/ppom-validator>elliptic": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true + } + }, + "eth-lattice-keyring>gridplus-sdk>elliptic": { + "packages": { + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>diffie-hellman": { + "string.prototype.matchall>call-bind>es-define-property": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify>diffie-hellman>miller-rabin": true, - "crypto-browserify>randombytes": true + "string.prototype.matchall>get-intrinsic": true } }, - "crypto-browserify>diffie-hellman>miller-rabin": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "bn.js": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>has-symbols": true, + "browserify>util>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "eslint-plugin-react>array-includes>is-string": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "process": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true } }, - "crypto-browserify>pbkdf2": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { "globals": { - "crypto": true, - "process": true, - "queueMicrotask": true, - "setImmediate": true, - "setTimeout": true + "intToBuffer": true }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "bn.js": true, + "buffer": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>public-encrypt": { + "eth-ens-namehash": { + "globals": { + "name": "write" + }, "packages": { - "bn.js": true, "browserify>buffer": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>create-hash": true + "eth-ens-namehash>idna-uts46-hx": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>public-encrypt>browserify-rsa": { + "eth-lattice-keyring": { + "globals": { + "addEventListener": true, + "browser": true, + "clearInterval": true, + "fetch": true, + "open": true, + "setInterval": true + }, "packages": { + "eth-lattice-keyring>@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, "bn.js": true, "browserify>buffer": true, - "crypto-browserify>randombytes": true + "crypto-browserify": true, + "webpack>events": true, + "eth-lattice-keyring>gridplus-sdk": true, + "eth-lattice-keyring>rlp": true } }, - "crypto-browserify>public-encrypt>parse-asn1": { + "eth-method-registry": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "crypto-browserify>pbkdf2": true, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true } }, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "@ethereumjs/tx>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "bn.js": true, - "browserify>buffer": true, - "browserify>vm-browserify": true, - "pumpify>inherits": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true } }, - "crypto-browserify>randombytes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "msCrypto": true + "TextDecoder": true, + "crypto": true }, "packages": { - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "crypto-browserify>randomfill": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "msCrypto": true + "TextDecoder": true, + "crypto": true }, "packages": { - "crypto-browserify>randombytes": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "currency-formatter": { + "ethereumjs-util>ethereum-cryptography": { "packages": { - "currency-formatter>accounting": true, - "currency-formatter>locale-currency": true, - "react>object-assign": true - } - }, - "currency-formatter>accounting": { - "globals": { - "define": true + "browserify>buffer": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "ganache>secp256k1": true } }, - "currency-formatter>locale-currency": { - "globals": { - "countryCode": true + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify>create-hmac": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true } }, - "debounce-stream": { + "ethereumjs-util": { "packages": { - "debounce-stream>debounce": true, - "debounce-stream>duplexer": true, - "debounce-stream>through": true + "browserify>assert": true, + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util>rlp": true } }, - "debounce-stream>debounce": { - "globals": { - "clearTimeout": true, - "setTimeout": true + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "packages": { + "browserify>assert": true, + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true } }, - "debounce-stream>duplexer": { + "@metamask/keyring-controller>ethereumjs-wallet": { "packages": { - "stream-browserify": true + "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, + "crypto-browserify>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, + "uuid": true } }, - "debounce-stream>through": { + "ethers": { "packages": { - "process": true, - "stream-browserify": true + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "ethers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "depcheck>@vue/compiler-sfc>postcss>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { + "packages": { + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "depcheck>is-core-module>hasown": { + "@metamask/ethjs>ethjs-abi": { "packages": { - "browserify>has>function-bind": true + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>js-sha3": true, + "@metamask/ethjs>ethjs-abi>number-to-bn": true } }, - "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "webpack>events": { "globals": { - "crypto.getRandomValues": true + "console": true } }, - "eslint-plugin-react>array-includes>is-string": { + "crypto-browserify>browserify-cipher>evp_bytestokey": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "ethereumjs-util>create-hash>md5.js": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-ens-namehash": { - "globals": { - "name": "write" - }, + "extension-port-stream": { "packages": { - "@metamask/ethjs>js-sha3": true, "browserify>buffer": true, - "eth-ens-namehash>idna-uts46-hx": true + "extension-port-stream>readable-stream": true + } + }, + "fast-json-patch": { + "globals": { + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true } }, - "eth-ens-namehash>idna-uts46-hx": { + "@metamask/snaps-utils>fast-xml-parser": { "globals": { - "define": true + "entityName": true, + "val": true }, "packages": { - "browserify>punycode": true + "@metamask/snaps-utils>fast-xml-parser>strnum": true } }, - "eth-keyring-controller>@metamask/browser-passworder": { - "globals": { - "crypto": true + "@metamask/notification-services-controller>firebase": { + "packages": { + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/messaging": true } }, - "eth-lattice-keyring": { + "react-focus-lock>focus-lock": { "globals": { - "addEventListener": true, - "browser": true, - "clearInterval": true, - "fetch": true, - "open": true, - "setInterval": true + "HTMLIFrameElement": true, + "Node.DOCUMENT_FRAGMENT_NODE": true, + "Node.DOCUMENT_NODE": true, + "Node.DOCUMENT_POSITION_CONTAINED_BY": true, + "Node.DOCUMENT_POSITION_CONTAINS": true, + "Node.ELEMENT_NODE": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify": true, - "eth-lattice-keyring>@ethereumjs/tx": true, - "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "webpack>events": true + "@swc/helpers>tslib": true } }, - "eth-lattice-keyring>@ethereumjs/tx": { + "browserify>util>which-typed-array>for-each": { "packages": { - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>es-abstract>is-callable": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { - "packages": { - "browserify": true, - "browserify>buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true + "axios>form-data": { + "globals": { + "FormData": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { + "fuse.js": { "globals": { - "WeakRef": true - }, - "packages": { - "browserify": true + "console": true, + "define": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { + "string.prototype.matchall>get-intrinsic": { "globals": { - "TextDecoder": true, - "crypto": true + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true }, "packages": { - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>es-abstract>has-proto": true, + "string.prototype.matchall>has-symbols": true, + "depcheck>is-core-module>hasown": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true + "string.prototype.matchall>es-abstract>gopd": { + "packages": { + "string.prototype.matchall>get-intrinsic": true } }, "eth-lattice-keyring>gridplus-sdk": { @@ -3914,230 +3705,307 @@ "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethersproject/abi": true, - "@metamask/ethjs>js-sha3": true, - "@metamask/keyring-api>bech32": true, - "bn.js": true, - "browserify>buffer": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, + "@ethersproject/abi": true, "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "@metamask/keyring-api>bech32": true, "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, "eth-lattice-keyring>gridplus-sdk>bitwise": true, + "bn.js": true, "eth-lattice-keyring>gridplus-sdk>borc": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, "eth-lattice-keyring>gridplus-sdk>elliptic": true, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, - "eth-lattice-keyring>gridplus-sdk>uuid": true, - "eth-lattice-keyring>rlp": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ethjs>js-sha3": true, + "lodash": true, + "eth-lattice-keyring>rlp": true, "ganache>secp256k1": true, - "lodash": true + "eth-lattice-keyring>gridplus-sdk>uuid": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { + "string.prototype.matchall>es-abstract>has-property-descriptors": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "string.prototype.matchall>call-bind>es-define-property": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { + "koa>is-generator-function>has-tostringtag": { "packages": { - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>has-symbols": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "ethereumjs-util>create-hash>md5.js>hash-base": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "pumpify>inherits": true, + "readable-stream": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { + "ethers>@ethersproject/sha2>hash.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "depcheck>is-core-module>hasown": { + "packages": { + "browserify>has>function-bind": true + } + }, + "@metamask/eth-trezor-keyring>hdkey": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "crypto-browserify": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true + } + }, + "he": { "globals": { - "TextDecoder": true, - "crypto": true + "define": true + } + }, + "history": { + "globals": { + "console": true, + "define": true, + "document.defaultView": true, + "document.querySelector": true + } + }, + "react-router-dom>history": { + "globals": { + "addEventListener": true, + "confirm": true, + "document": true, + "history": true, + "location": true, + "navigator.userAgent": true, + "removeEventListener": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "react-router-dom>history>resolve-pathname": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true, + "react-router-dom>history>value-equal": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "@metamask/ppom-validator>elliptic>hmac-drbg": { + "packages": { + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true + } + }, + "react-redux>hoist-non-react-statics": { + "packages": { + "prop-types>react-is": true + } + }, + "https-browserify": { + "packages": { + "stream-http": true, + "browserify>url": true + } + }, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": { "globals": { - "TextEncoder": true, - "crypto": true + "DOMException": true, + "IDBCursor": true, + "IDBDatabase": true, + "IDBIndex": true, + "IDBObjectStore": true, + "IDBRequest": true, + "IDBTransaction": true, + "indexedDB.deleteDatabase": true, + "indexedDB.open": true } }, - "eth-lattice-keyring>gridplus-sdk>aes-js": { + "eth-ens-namehash>idna-uts46-hx": { "globals": { "define": true + }, + "packages": { + "browserify>punycode": true } }, - "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "string.prototype.matchall>internal-slot": { + "packages": { + "string.prototype.matchall>call-bind>es-errors": true, + "depcheck>is-core-module>hasown": true, + "string.prototype.matchall>side-channel": true + } + }, + "browserify>util>is-arguments": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "string.prototype.matchall>es-abstract>is-array-buffer": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { + "packages": { + "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "string.prototype.matchall>es-abstract>is-callable": { "globals": { - "crypto": true, - "define": true + "document": true } }, - "eth-lattice-keyring>gridplus-sdk>bitwise": { + "@metamask/eth-token-tracker>deep-equal>is-date-object": { "packages": { - "browserify>buffer": true + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc": { - "globals": { - "console": true - }, + "koa>is-generator-function": { "packages": { - "browserify>buffer": true, - "buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "@material-ui/core>@material-ui/styles>jss>is-in-browser": { "globals": { - "crypto": true, - "define": true + "document": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { - "globals": { - "URL": true, - "URLSearchParams": true, - "location": true + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>elliptic": { + "string.prototype.matchall>es-abstract>is-regex": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { - "globals": { - "intToBuffer": true - }, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": { "packages": { - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "buffer": true + "string.prototype.matchall>call-bind": true } }, - "eth-lattice-keyring>gridplus-sdk>uuid": { - "globals": { - "crypto": true + "eslint-plugin-react>array-includes>is-string": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>rlp": { - "globals": { - "TextEncoder": true + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "packages": { + "string.prototype.matchall>has-symbols": true } }, - "eth-method-registry": { + "browserify>util>is-typed-array": { "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true + "browserify>util>which-typed-array": true } }, - "ethereumjs-util": { + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { "packages": { - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true } }, - "ethereumjs-util>create-hash": { + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { + "globals": { + "URL": true, + "URLSearchParams": true, + "location": true + } + }, + "@ensdomains/content-hash>js-base64": { + "globals": { + "Base64": "write", + "TextDecoder": true, + "TextEncoder": true, + "atob": true, + "btoa": true, + "define": true + }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>md5.js": true, - "ethereumjs-util>create-hash>ripemd160": true, - "pumpify>inherits": true + "browserify>buffer": true } }, - "ethereumjs-util>create-hash>cipher-base": { + "@metamask/ethjs>js-sha3": { + "globals": { + "define": true + }, "packages": { - "browserify>string_decoder": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "stream-browserify": true + "process": true } }, - "ethereumjs-util>create-hash>md5.js": { + "@ngraveio/bc-ur>jsbi": { + "globals": { + "define": true + } + }, + "@metamask/message-manager>jsonschema": { "packages": { - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "browserify>url": true } }, - "ethereumjs-util>create-hash>md5.js>hash-base": { + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "readable-stream": true + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true } }, - "ethereumjs-util>create-hash>ripemd160": { + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { + "globals": { + "CSS": true + }, "packages": { - "browserify>buffer": true, - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "pumpify>inherits": true + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography": { + "@material-ui/core>@material-ui/styles>jss-plugin-global": { "packages": { - "browserify>buffer": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ganache>secp256k1": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes": { + "@material-ui/core>@material-ui/styles>jss-plugin-nested": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@babel/runtime": true, + "react-router-dom>tiny-warning": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { "packages": { - "browserify>buffer": true + "@material-ui/core>@material-ui/styles>jss": true, + "react-router-dom>tiny-warning": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { "packages": { - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, - "koa>content-disposition>safe-buffer": true + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { + "@material-ui/core>@material-ui/styles>jss": { + "globals": { + "CSS": true, + "document.createElement": true, + "document.querySelector": true + }, "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, + "react-router-dom>tiny-warning": true } }, "ethereumjs-util>ethereum-cryptography>keccak": { @@ -4146,538 +4014,496 @@ "readable-stream": true } }, - "ethereumjs-util>rlp": { - "packages": { - "bn.js": true, - "browserify>buffer": true - } - }, - "ethereumjs-wallet>randombytes": { + "currency-formatter>locale-currency": { "globals": { - "crypto.getRandomValues": true + "countryCode": true } }, - "ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/web": true, - "ethers>@ethersproject/wordlists": true + "localforage": { + "globals": { + "Blob": true, + "BlobBuilder": true, + "FileReader": true, + "IDBKeyRange": true, + "MSBlobBuilder": true, + "MozBlobBuilder": true, + "OIndexedDB": true, + "WebKitBlobBuilder": true, + "atob": true, + "btoa": true, + "console.error": true, + "console.info": true, + "console.warn": true, + "define": true, + "fetch": true, + "indexedDB": true, + "localStorage": true, + "mozIndexedDB": true, + "msIndexedDB": true, + "navigator.platform": true, + "navigator.userAgent": true, + "openDatabase": true, + "setTimeout": true, + "webkitIndexedDB": true } }, - "ethers>@ethersproject/abstract-provider": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "lodash": { + "globals": { + "clearTimeout": true, + "define": true, + "setTimeout": true } }, - "ethers>@ethersproject/abstract-signer": { - "packages": { - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "loglevel": { + "globals": { + "console": true, + "define": true, + "document.cookie": true, + "localStorage": true, + "log": "write", + "navigator": true } }, - "ethers>@ethersproject/address": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "lottie-web": { + "globals": { + "Blob": true, + "Howl": true, + "OffscreenCanvas": true, + "URL.createObjectURL": true, + "Worker": true, + "XMLHttpRequest": true, + "bodymovin": "write", + "clearInterval": true, + "console": true, + "define": true, + "document.body": true, + "document.createElement": true, + "document.createElementNS": true, + "document.getElementsByClassName": true, + "document.getElementsByTagName": true, + "document.querySelectorAll": true, + "document.readyState": true, + "location.origin": true, + "location.pathname": true, + "navigator": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true } }, - "ethers>@ethersproject/base64": { + "luxon": { "globals": { - "atob": true, - "btoa": true - }, - "packages": { - "@ethersproject/bytes": true + "Intl": true } }, - "ethers>@ethersproject/basex": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/properties": true + "@metamask/snaps-utils>marked": { + "globals": { + "console.error": true, + "console.warn": true, + "define": true } }, - "ethers>@ethersproject/constants": { + "ethereumjs-util>create-hash>md5.js": { "packages": { - "@ethersproject/bignumber": true + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "ethers>@ethersproject/json-wallets": { + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hdnode": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { - "globals": { - "define": true + "react-markdown>remark-parse>mdast-util-from-markdown": { + "packages": { + "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, + "react-syntax-highlighter>refractor>parse-entities": true, + "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { + "react-markdown>remark-rehype>mdast-util-to-hast": { "globals": { - "define": true, - "setTimeout": true + "console.warn": true }, "packages": { - "browserify>timers-browserify": true - } - }, - "ethers>@ethersproject/keccak256": { - "packages": { - "@ethersproject/bytes": true, - "@metamask/ethjs>js-sha3": true + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, + "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/logger": { + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { "globals": { - "console": true + "Headers": true, + "TextDecoder": true, + "URL": true, + "btoa": true, + "fetch": true + }, + "packages": { + "browserify>browserify-zlib": true, + "browserify>buffer": true, + "https-browserify": true, + "process": true, + "stream-http": true, + "browserify>url": true, + "browserify>util": true } }, - "ethers>@ethersproject/pbkdf2": { + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "react-syntax-highlighter>refractor>parse-entities": true } }, - "ethers>@ethersproject/properties": { + "crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "ethers>@ethersproject/logger": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true } }, - "ethers>@ethersproject/providers": { + "@ensdomains/content-hash>cids>multibase": { "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>@ethersproject/networks": true, - "ethers>@ethersproject/providers>@ethersproject/web": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true } }, - "ethers>@ethersproject/providers>@ethersproject/networks": { + "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true, + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, + "@ensdomains/content-hash>multicodec": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "@ensdomains/content-hash>multicodec>uint8arrays": true, + "sass-embedded>varint": true } }, - "ethers>@ethersproject/random": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "console.warn": true, + "crypto.subtle.digest": true } }, - "ethers>@ethersproject/rlp": { + "@ensdomains/content-hash>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/sha2": { + "@ensdomains/content-hash>cids>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>cids>multihashes>varint": true } }, - "ethers>@ethersproject/sha2>hash.js": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/signing-key": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/signing-key>elliptic": true + "@metamask/approval-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/signing-key>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/solidity": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "@metamask/notification-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/strings": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "@metamask/permission-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/transactions": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/rpc-methods-flask>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/units": { - "packages": { - "@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "@metamask/snaps-controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/web": { + "@metamask/snaps-controllers-flask>nanoid": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/wordlists": { - "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "depcheck>@vue/compiler-sfc>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream": { - "packages": { - "browserify>buffer": true, - "extension-port-stream>readable-stream": true + "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream>readable-stream": { + "node-fetch": { "globals": { - "AbortController": true, - "AggregateError": true, - "Blob": true - }, - "packages": { - "browserify>buffer": true, - "browserify>string_decoder": true, - "extension-port-stream>readable-stream>abort-controller": true, - "process": true, - "webpack>events": true + "Headers": true, + "Request": true, + "Response": true, + "fetch": true } }, - "extension-port-stream>readable-stream>abort-controller": { + "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { "globals": { - "AbortController": true + "fetch": true } }, - "fast-json-patch": { + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { "globals": { - "addEventListener": true, - "clearTimeout": true, - "removeEventListener": true, - "setTimeout": true + "fetch": true } }, - "fuse.js": { + "@metamask/ethjs>ethjs-abi>number-to-bn": { + "packages": { + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true + } + }, + "string.prototype.matchall>es-abstract>object-inspect": { "globals": { - "console": true, - "define": true + "HTMLElement": true, + "WeakRef": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "ganache>secp256k1": { + "@ngraveio/bc-ur>assert>object-is": { "packages": { - "@metamask/ppom-validator>elliptic": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true } }, "gulp>vinyl-fs>object.assign": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, "string.prototype.matchall>call-bind": true, "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>has-symbols": true + "string.prototype.matchall>has-symbols": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "he": { - "globals": { - "define": true + "@metamask/object-multiplex>once": { + "packages": { + "@metamask/object-multiplex>once>wrappy": true } }, - "history": { - "globals": { - "console": true, - "define": true, - "document.defaultView": true, - "document.querySelector": true + "crypto-browserify>public-encrypt>parse-asn1": { + "packages": { + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "browserify>buffer": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "crypto-browserify>pbkdf2": true } }, - "https-browserify": { - "packages": { - "browserify>url": true, - "stream-http": true + "react-syntax-highlighter>refractor>parse-entities": { + "globals": { + "document.createElement": true } }, - "koa>content-disposition>safe-buffer": { + "path-browserify": { "packages": { - "browserify>buffer": true + "process": true } }, - "koa>is-generator-function": { + "serve-handler>path-to-regexp": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "serve-handler>path-to-regexp>isarray": true } }, - "koa>is-generator-function>has-tostringtag": { + "crypto-browserify>pbkdf2": { + "globals": { + "crypto": true, + "process": true, + "queueMicrotask": true, + "setImmediate": true, + "setTimeout": true + }, "packages": { - "string.prototype.matchall>has-symbols": true + "ethereumjs-util>create-hash": true, + "process": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true } }, - "localforage": { + "@material-ui/core>popper.js": { "globals": { - "Blob": true, - "BlobBuilder": true, - "FileReader": true, - "IDBKeyRange": true, - "MSBlobBuilder": true, - "MozBlobBuilder": true, - "OIndexedDB": true, - "WebKitBlobBuilder": true, - "atob": true, - "btoa": true, - "console.error": true, - "console.info": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, "console.warn": true, "define": true, - "fetch": true, - "indexedDB": true, - "localStorage": true, - "mozIndexedDB": true, - "msIndexedDB": true, - "navigator.platform": true, - "navigator.userAgent": true, - "openDatabase": true, - "setTimeout": true, - "webkitIndexedDB": true + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator": true, + "requestAnimationFrame": true, + "setTimeout": true } }, - "lodash": { + "react-tippy>popper.js": { "globals": { - "clearTimeout": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, + "console.warn": true, "define": true, + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.userAgent": true, + "requestAnimationFrame": true, "setTimeout": true } }, - "loglevel": { + "process": { "globals": { - "console": true, - "define": true, - "document.cookie": true, - "localStorage": true, - "log": "write", - "navigator": true + "clearTimeout": true, + "setTimeout": true } }, - "lottie-web": { - "globals": { - "Blob": true, - "Howl": true, - "OffscreenCanvas": true, - "URL.createObjectURL": true, - "Worker": true, - "XMLHttpRequest": true, - "bodymovin": "write", - "clearInterval": true, - "console": true, - "define": true, - "document.body": true, - "document.createElement": true, - "document.createElementNS": true, - "document.getElementsByClassName": true, - "document.getElementsByTagName": true, - "document.querySelectorAll": true, - "document.readyState": true, - "location.origin": true, - "location.pathname": true, - "navigator": true, - "requestAnimationFrame": true, - "setInterval": true, - "setTimeout": true + "promise-to-callback": { + "packages": { + "promise-to-callback>is-fn": true, + "promise-to-callback>set-immediate-shim": true } }, - "luxon": { + "prop-types": { "globals": { - "Intl": true + "console": true + }, + "packages": { + "react>object-assign": true, + "prop-types>react-is": true } }, - "nanoid": { - "globals": { - "crypto": true, - "msCrypto": true, - "navigator": true + "react-markdown>property-information": { + "packages": { + "watchify>xtend": true } }, - "nock>debug": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "process": true, + "setTimeout": true }, "packages": { - "nock>debug>ms": true, - "process": true + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true + } + }, + "crypto-browserify>public-encrypt": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "crypto-browserify>randombytes": true } }, - "node-fetch": { + "browserify>punycode": { "globals": { - "Headers": true, - "Request": true, - "Response": true, - "fetch": true + "define": true } }, - "path-browserify": { - "packages": { - "process": true + "qrcode-generator": { + "globals": { + "define": true } }, - "process": { + "qrcode.react": { "globals": { - "clearTimeout": true, - "setTimeout": true + "Path2D": true, + "devicePixelRatio": true + }, + "packages": { + "react": true } }, - "promise-to-callback": { + "@storybook/addon-knobs>qs": { "packages": { - "promise-to-callback>is-fn": true, - "promise-to-callback>set-immediate-shim": true + "string.prototype.matchall>side-channel": true } }, - "promise-to-callback>set-immediate-shim": { + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { "globals": { - "setTimeout.apply": true - }, - "packages": { - "browserify>timers-browserify": true + "queueMicrotask": true } }, - "prop-types": { + "react-beautiful-dnd>raf-schd": { "globals": { - "console": true - }, - "packages": { - "prop-types>react-is": true, - "react>object-assign": true + "cancelAnimationFrame": true, + "requestAnimationFrame": true } }, - "prop-types>react-is": { + "crypto-browserify>randombytes": { "globals": { - "console": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "process": true, + "koa>content-disposition>safe-buffer": true } }, - "qrcode-generator": { + "ethereumjs-wallet>randombytes": { "globals": { - "define": true + "crypto.getRandomValues": true } }, - "qrcode.react": { + "crypto-browserify>randomfill": { "globals": { - "Path2D": true, - "devicePixelRatio": true + "crypto": true, + "msCrypto": true }, "packages": { - "react": true + "process": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true } }, "react": { @@ -4685,8 +4511,8 @@ "console": true }, "packages": { - "prop-types": true, - "react>object-assign": true + "react>object-assign": true, + "prop-types": true } }, "react-beautiful-dnd": { @@ -4708,43 +4534,28 @@ }, "packages": { "@babel/runtime": true, - "react": true, "react-beautiful-dnd>css-box-model": true, "react-beautiful-dnd>memoize-one": true, "react-beautiful-dnd>raf-schd": true, - "react-beautiful-dnd>use-memo-one": true, + "react": true, "react-dom": true, "react-redux": true, - "redux": true + "redux": true, + "react-beautiful-dnd>use-memo-one": true } }, - "react-beautiful-dnd>css-box-model": { + "react-chartjs-2": { "globals": { - "getComputedStyle": true, - "pageXOffset": true, - "pageYOffset": true + "setTimeout": true }, "packages": { - "react-router-dom>tiny-invariant": true - } - }, - "react-beautiful-dnd>raf-schd": { - "globals": { - "cancelAnimationFrame": true, - "requestAnimationFrame": true - } - }, - "react-beautiful-dnd>use-memo-one": { - "packages": { + "chart.js": true, "react": true } }, - "react-chartjs-2": { - "globals": { - "setTimeout": true - }, + "react-focus-lock>react-clientside-effect": { "packages": { - "chart.js": true, + "@babel/runtime": true, "react": true } }, @@ -4789,22 +4600,28 @@ "trustedTypes": true }, "packages": { + "react>object-assign": true, "prop-types": true, "react": true, - "react-dom>scheduler": true, - "react>object-assign": true + "react-dom>scheduler": true } }, - "react-dom>scheduler": { + "react-responsive-carousel>react-easy-swipe": { "globals": { - "MessageChannel": true, - "cancelAnimationFrame": true, - "clearTimeout": true, - "console": true, - "navigator": true, - "performance": true, - "requestAnimationFrame": true, - "setTimeout": true + "addEventListener": true, + "define": true, + "document.addEventListener": true, + "document.removeEventListener": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-popper>react-fast-compare": { + "globals": { + "Element": true, + "console.warn": true } }, "react-focus-lock": { @@ -4818,660 +4635,726 @@ }, "packages": { "@babel/runtime": true, + "react-focus-lock>focus-lock": true, "prop-types": true, "react": true, - "react-focus-lock>focus-lock": true, "react-focus-lock>react-clientside-effect": true, "react-focus-lock>use-callback-ref": true, "react-focus-lock>use-sidecar": true } }, - "react-focus-lock>focus-lock": { + "react-idle-timer": { "globals": { - "HTMLIFrameElement": true, - "Node.DOCUMENT_FRAGMENT_NODE": true, - "Node.DOCUMENT_NODE": true, - "Node.DOCUMENT_POSITION_CONTAINED_BY": true, - "Node.DOCUMENT_POSITION_CONTAINS": true, - "Node.ELEMENT_NODE": true, - "console.error": true, + "clearTimeout": true, + "document": true, + "setTimeout": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-inspector": { + "globals": { + "Node": true, + "chromeDark": true, + "chromeLight": true + }, + "packages": { + "react": true + } + }, + "prop-types>react-is": { + "globals": { + "console": true + } + }, + "react-markdown>react-is": { + "globals": { + "console": true + } + }, + "react-redux>react-is": { + "globals": { + "console": true + } + }, + "react-markdown": { + "globals": { + "console.warn": true + }, + "packages": { + "react-markdown>comma-separated-tokens": true, + "prop-types": true, + "react-markdown>property-information": true, + "react": true, + "react-markdown>react-is": true, + "react-markdown>remark-parse": true, + "react-markdown>remark-rehype": true, + "react-markdown>space-separated-tokens": true, + "react-markdown>style-to-object": true, + "react-markdown>unified": true, + "react-markdown>unist-util-visit": true, + "react-markdown>vfile": true + } + }, + "react-popper": { + "globals": { + "document": true + }, + "packages": { + "@popperjs/core": true, + "react": true, + "react-popper>react-fast-compare": true, + "react-popper>warning": true + } + }, + "react-redux": { + "globals": { + "console": true, + "document": true + }, + "packages": { + "@babel/runtime": true, + "react-redux>hoist-non-react-statics": true, + "prop-types": true, + "react": true, + "react-dom": true, + "react-redux>react-is": true + } + }, + "react-responsive-carousel": { + "globals": { + "HTMLElement": true, + "addEventListener": true, + "clearTimeout": true, "console.warn": true, "document": true, "getComputedStyle": true, + "removeEventListener": true, + "setTimeout": true + }, + "packages": { + "classnames": true, + "react": true, + "react-dom": true, + "react-responsive-carousel>react-easy-swipe": true + } + }, + "react-router-dom": { + "packages": { + "react-router-dom>history": true, + "prop-types": true, + "react": true, + "react-router-dom>react-router": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true + } + }, + "react-router-dom-v5-compat": { + "globals": { + "FormData": true, + "URL": true, + "URLSearchParams": true, + "__reactRouterVersion": "write", + "addEventListener": true, + "confirm": true, + "define": true, + "document": true, + "history.scrollRestoration": true, + "location.href": true, + "removeEventListener": true, + "scrollTo": true, + "scrollY": true, + "sessionStorage.getItem": true, + "sessionStorage.setItem": true, "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true + "react-router-dom-v5-compat>@remix-run/router": true, + "history": true, + "react": true, + "react-dom": true, + "react-router-dom": true, + "react-router-dom-v5-compat>react-router": true } }, - "react-focus-lock>react-clientside-effect": { + "react-router-dom>react-router": { "packages": { - "@babel/runtime": true, - "react": true + "react-router-dom>history": true, + "react-redux>hoist-non-react-statics": true, + "serve-handler>path-to-regexp": true, + "prop-types": true, + "react": true, + "prop-types>react-is": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true } }, - "react-focus-lock>use-callback-ref": { + "react-router-dom-v5-compat>react-router": { + "globals": { + "console.error": true, + "define": true + }, "packages": { + "react-router-dom-v5-compat>@remix-run/router": true, "react": true } }, - "react-focus-lock>use-sidecar": { + "react-simple-file-input": { "globals": { - "console.error": true + "File": true, + "FileReader": true, + "console.warn": true }, "packages": { - "@swc/helpers>tslib": true, - "react": true, - "react-focus-lock>use-sidecar>detect-node-es": true + "prop-types": true, + "react": true } }, - "react-idle-timer": { + "react-tippy": { "globals": { + "Element": true, + "MSStream": true, + "MutationObserver": true, + "addEventListener": true, "clearTimeout": true, + "console.error": true, + "console.warn": true, + "define": true, "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.maxTouchPoints": true, + "navigator.msMaxTouchPoints": true, + "navigator.userAgent": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "react-tippy>popper.js": true, + "react": true, + "react-dom": true } }, - "react-inspector": { + "react-toggle-button": { "globals": { - "Node": true, - "chromeDark": true, - "chromeLight": true + "clearTimeout": true, + "console.warn": true, + "define": true, + "performance": true, + "setTimeout": true }, "packages": { "react": true } }, - "react-markdown": { + "@material-ui/core>react-transition-group": { "globals": { - "console.warn": true + "Element": true, + "setTimeout": true }, "packages": { + "@material-ui/core>react-transition-group>dom-helpers": true, "prop-types": true, "react": true, - "react-markdown>comma-separated-tokens": true, - "react-markdown>property-information": true, - "react-markdown>react-is": true, - "react-markdown>remark-parse": true, - "react-markdown>remark-rehype": true, - "react-markdown>space-separated-tokens": true, - "react-markdown>style-to-object": true, - "react-markdown>unified": true, - "react-markdown>unist-util-visit": true, - "react-markdown>vfile": true + "react-dom": true } }, - "react-markdown>property-information": { + "readable-stream": { "packages": { - "watchify>xtend": true + "browserify>browser-resolve": true, + "browserify>buffer": true, + "webpack>events": true, + "pumpify>inherits": true, + "process": true, + "browserify>string_decoder": true, + "readable-stream>util-deprecate": true } }, - "react-markdown>react-is": { + "extension-port-stream>readable-stream": { "globals": { - "console": true - } - }, - "react-markdown>remark-parse": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, - "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true, - "react-syntax-highlighter>refractor>parse-entities": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "ERR_INVALID_ARG_TYPE": true, + "queueMicrotask": true + }, "packages": { - "react-syntax-highlighter>refractor>parse-entities": true + "@lavamoat/lavapack>readable-stream>abort-controller": true, + "browserify>buffer": true, + "webpack>events": true, + "process": true, + "browserify>string_decoder": true } }, - "react-markdown>remark-rehype": { + "@metamask/snaps-controllers>readable-web-to-node-stream": { "packages": { - "react-markdown>remark-rehype>mdast-util-to-hast": true + "readable-stream": true } }, - "react-markdown>remark-rehype>mdast-util-to-hast": { + "redux": { "globals": { - "console.warn": true + "console": true }, "packages": { - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, - "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, - "react-markdown>unist-util-visit": true + "@babel/runtime": true } }, - "react-markdown>style-to-object": { + "string.prototype.matchall>regexp.prototype.flags": { "packages": { - "react-markdown>style-to-object>inline-style-parser": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": true } }, - "react-markdown>unified": { + "react-markdown>remark-parse": { "packages": { - "mocha>yargs-unparser>is-plain-obj": true, - "react-markdown>unified>bail": true, - "react-markdown>unified>extend": true, - "react-markdown>unified>is-buffer": true, - "react-markdown>unified>trough": true, - "react-markdown>vfile": true + "react-markdown>remark-parse>mdast-util-from-markdown": true } }, - "react-markdown>unist-util-visit": { + "react-markdown>remark-rehype": { "packages": { - "react-markdown>unist-util-visit>unist-util-visit-parents": true + "react-markdown>remark-rehype>mdast-util-to-hast": true } }, - "react-markdown>unist-util-visit>unist-util-visit-parents": { + "react-markdown>vfile>replace-ext": { "packages": { - "react-markdown>unist-util-visit>unist-util-is": true + "path-browserify": true } }, - "react-markdown>vfile": { - "packages": { - "path-browserify": true, - "process": true, - "react-markdown>vfile>is-buffer": true, - "react-markdown>vfile>replace-ext": true, - "react-markdown>vfile>vfile-message": true + "reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true } }, - "react-markdown>vfile>replace-ext": { + "@metamask/snaps-utils>rfdc": { "packages": { - "path-browserify": true + "browserify>buffer": true } }, - "react-markdown>vfile>vfile-message": { + "ethereumjs-util>create-hash>ripemd160": { "packages": { - "react-markdown>vfile>unist-util-stringify-position": true + "browserify>buffer": true, + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true } }, - "react-popper": { - "globals": { - "document": true - }, + "@keystonehq/metamask-airgapped-keyring>rlp": { "packages": { - "@popperjs/core": true, - "react": true, - "react-popper>react-fast-compare": true, - "react-popper>warning": true - } - }, - "react-popper>react-fast-compare": { - "globals": { - "Element": true, - "console.warn": true + "bn.js": true, + "browserify>buffer": true } }, - "react-popper>warning": { + "eth-lattice-keyring>rlp": { "globals": { - "console": true + "TextEncoder": true } }, - "react-redux": { - "globals": { - "console": true, - "document": true - }, + "ethereumjs-util>rlp": { "packages": { - "@babel/runtime": true, - "prop-types": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true, - "react-redux>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>hoist-non-react-statics": { + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { "packages": { - "prop-types>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>react-is": { + "wait-on>rxjs": { "globals": { - "console": true + "cancelAnimationFrame": true, + "clearInterval": true, + "clearTimeout": true, + "performance": true, + "requestAnimationFrame": true, + "setInterval.apply": true, + "setTimeout.apply": true } }, - "react-responsive-carousel": { + "koa>content-disposition>safe-buffer": { + "packages": { + "browserify>buffer": true + } + }, + "react-dom>scheduler": { "globals": { - "HTMLElement": true, - "addEventListener": true, + "MessageChannel": true, + "cancelAnimationFrame": true, "clearTimeout": true, - "console.warn": true, - "document": true, - "getComputedStyle": true, - "removeEventListener": true, + "console": true, + "navigator": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true - }, - "packages": { - "classnames": true, - "react": true, - "react-dom": true, - "react-responsive-carousel>react-easy-swipe": true } }, - "react-responsive-carousel>react-easy-swipe": { + "ethers>@ethersproject/json-wallets>scrypt-js": { "globals": { - "addEventListener": true, "define": true, - "document.addEventListener": true, - "document.removeEventListener": true + "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "browserify>timers-browserify": true } }, - "react-router-dom": { + "ganache>secp256k1": { "packages": { - "prop-types": true, - "react": true, - "react-router-dom>history": true, - "react-router-dom>react-router": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "@metamask/ppom-validator>elliptic": true } }, - "react-router-dom-v5-compat": { + "semver": { "globals": { - "FormData": true, - "URL": true, - "URLSearchParams": true, - "__reactRouterVersion": "write", - "addEventListener": true, - "confirm": true, - "define": true, - "document": true, - "history.scrollRestoration": true, - "location.href": true, - "removeEventListener": true, - "scrollTo": true, - "scrollY": true, - "sessionStorage.getItem": true, - "sessionStorage.setItem": true, - "setTimeout": true + "console.error": true }, "packages": { - "history": true, - "react": true, - "react-dom": true, - "react-router-dom": true, - "react-router-dom-v5-compat>@remix-run/router": true, - "react-router-dom-v5-compat>react-router": true + "process": true } }, - "react-router-dom-v5-compat>@remix-run/router": { - "globals": { - "AbortController": true, - "DOMException": true, - "FormData": true, - "Headers": true, - "Request": true, - "Response": true, - "URL": true, - "URLSearchParams": true, - "console": true, - "document.defaultView": true + "string.prototype.matchall>call-bind>set-function-length": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>gopd": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom-v5-compat>react-router": { - "globals": { - "console.error": true, - "define": true - }, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": { "packages": { - "react": true, - "react-router-dom-v5-compat>@remix-run/router": true + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom>history": { + "promise-to-callback>set-immediate-shim": { "globals": { - "addEventListener": true, - "confirm": true, - "document": true, - "history": true, - "location": true, - "navigator.userAgent": true, - "removeEventListener": true + "setTimeout.apply": true }, "packages": { - "react-router-dom>history>resolve-pathname": true, - "react-router-dom>history>value-equal": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "browserify>timers-browserify": true } }, - "react-router-dom>react-router": { + "addons-linter>sha.js": { "packages": { - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-redux>hoist-non-react-statics": true, - "react-router-dom>history": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true, - "serve-handler>path-to-regexp": true + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "react-router-dom>tiny-warning": { - "globals": { - "console": true + "string.prototype.matchall>side-channel": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>object-inspect": true } }, - "react-simple-file-input": { + "@metamask/profile-sync-controller>siwe": { "globals": { - "File": true, - "FileReader": true, + "console.error": true, "console.warn": true }, "packages": { - "prop-types": true, - "react": true + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random": true, + "ethers": true, + "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true } }, - "react-syntax-highlighter>refractor>parse-entities": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { "globals": { - "document.createElement": true + "StopIteration": true + }, + "packages": { + "string.prototype.matchall>internal-slot": true } }, - "react-tippy": { + "stream-browserify": { + "packages": { + "webpack>events": true, + "pumpify>inherits": true, + "readable-stream": true + } + }, + "stream-http": { "globals": { - "Element": true, - "MSStream": true, - "MutationObserver": true, - "addEventListener": true, + "AbortController": true, + "Blob": true, + "MSStreamReader": true, + "ReadableStream": true, + "WritableStream": true, + "XDomainRequest": true, + "XMLHttpRequest": true, "clearTimeout": true, - "console.error": true, - "console.warn": true, - "define": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.maxTouchPoints": true, - "navigator.msMaxTouchPoints": true, - "navigator.userAgent": true, - "performance": true, - "requestAnimationFrame": true, + "fetch": true, + "location.protocol.search": true, "setTimeout": true }, "packages": { - "react": true, - "react-dom": true, - "react-tippy>popper.js": true + "browserify>buffer": true, + "stream-http>builtin-status-codes": true, + "pumpify>inherits": true, + "process": true, + "readable-stream": true, + "browserify>url": true, + "watchify>xtend": true } }, - "react-tippy>popper.js": { - "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.userAgent": true, - "requestAnimationFrame": true, - "setTimeout": true + "@metamask/snaps-controllers>tar-stream>streamx": { + "packages": { + "webpack>events": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true } }, - "react-toggle-button": { - "globals": { - "clearTimeout": true, - "console.warn": true, - "define": true, - "performance": true, - "setTimeout": true - }, + "browserify>string_decoder": { "packages": { - "react": true + "koa>content-disposition>safe-buffer": true } }, - "readable-stream": { + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "packages": { + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + } + }, + "react-markdown>style-to-object": { "packages": { + "react-markdown>style-to-object>inline-style-parser": true + } + }, + "@metamask/snaps-controllers>tar-stream": { + "packages": { + "@metamask/snaps-controllers>tar-stream>b4a": true, "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>string_decoder": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx": true + } + }, + "debounce-stream>through": { + "packages": { "process": true, - "pumpify>inherits": true, - "readable-stream>util-deprecate": true, - "webpack>events": true + "stream-browserify": true } }, - "readable-stream>util-deprecate": { + "browserify>timers-browserify": { "globals": { - "console.trace": true, - "console.warn": true, - "localStorage": true + "clearInterval": true, + "clearTimeout": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "process": true } }, - "redux": { + "react-router-dom>tiny-warning": { "globals": { "console": true - }, - "packages": { - "@babel/runtime": true } }, - "semver": { + "copy-to-clipboard>toggle-selection": { "globals": { - "console.error": true - }, - "packages": { - "process": true + "document.activeElement": true, + "document.getSelection": true } }, - "serve-handler>path-to-regexp": { + "@swc/helpers>tslib": { + "globals": { + "SuppressedError": true, + "define": true + } + }, + "@metamask/eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, "packages": { - "serve-handler>path-to-regexp>isarray": true + "browserify>browser-resolve": true } }, - "stream-browserify": { - "packages": { - "pumpify>inherits": true, - "readable-stream": true, - "webpack>events": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { + "globals": { + "define": true } }, - "stream-http": { + "@ensdomains/content-hash>cids>uint8arrays": { "globals": { - "AbortController": true, - "Blob": true, - "MSStreamReader": true, - "ReadableStream": true, - "WritableStream": true, - "XDomainRequest": true, - "XMLHttpRequest": true, - "clearTimeout": true, - "fetch": true, - "location.protocol.search": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "browserify>buffer": true, - "browserify>url": true, - "process": true, - "pumpify>inherits": true, - "readable-stream": true, - "stream-http>builtin-status-codes": true, - "watchify>xtend": true + "@ensdomains/content-hash>cids>multibase": true } }, - "string.prototype.matchall>call-bind": { + "@ensdomains/content-hash>multicodec>uint8arrays": { + "globals": { + "Buffer": true, + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>has>function-bind": true, - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>call-bind>set-function-length": true, - "string.prototype.matchall>get-intrinsic": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "string.prototype.matchall>call-bind>es-define-property": { + "react-markdown>unified": { "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unified>bail": true, + "react-markdown>unified>extend": true, + "react-markdown>unified>is-buffer": true, + "mocha>yargs-unparser>is-plain-obj": true, + "react-markdown>unified>trough": true, + "react-markdown>vfile": true } }, - "string.prototype.matchall>call-bind>set-function-length": { + "react-markdown>unist-util-visit>unist-util-visit-parents": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>gopd": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unist-util-visit>unist-util-is": true } }, - "string.prototype.matchall>define-properties": { + "react-markdown>unist-util-visit": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "react-markdown>unist-util-visit>unist-util-visit-parents": true } }, - "string.prototype.matchall>define-properties>define-data-property": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>gopd": true + "uri-js": { + "globals": { + "define": true } }, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "browserify>url": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true + "browserify>punycode": true, + "@storybook/addon-knobs>qs": true } }, - "string.prototype.matchall>es-abstract>available-typed-arrays": { + "react-focus-lock>use-callback-ref": { "packages": { - "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + "react": true } }, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "react-beautiful-dnd>use-memo-one": { "packages": { - "string.prototype.matchall>has-symbols": true + "react": true } }, - "string.prototype.matchall>es-abstract>gopd": { + "react-focus-lock>use-sidecar": { + "globals": { + "console.error": true + }, "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-focus-lock>use-sidecar>detect-node-es": true, + "react": true, + "@swc/helpers>tslib": true } }, - "string.prototype.matchall>es-abstract>has-property-descriptors": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true + "readable-stream>util-deprecate": { + "globals": { + "console.trace": true, + "console.warn": true, + "localStorage": true } }, - "string.prototype.matchall>es-abstract>is-array-buffer": { + "browserify>assert>util": { + "globals": { + "console.error": true, + "console.log": true, + "console.trace": true, + "process": true + }, "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "browserify>assert>util>inherits": true, + "process": true } }, - "string.prototype.matchall>es-abstract>is-callable": { + "browserify>util": { "globals": { - "document": true - } - }, - "string.prototype.matchall>es-abstract>is-regex": { + "console.error": true, + "console.log": true, + "console.trace": true + }, "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "pumpify>inherits": true, + "browserify>util>is-arguments": true, + "koa>is-generator-function": true, + "browserify>util>is-typed-array": true, + "process": true, + "browserify>util>which-typed-array": true } }, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": { - "packages": { - "string.prototype.matchall>call-bind": true + "uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "string.prototype.matchall>es-abstract>object-inspect": { + "@metamask/eth-snap-keyring>uuid": { "globals": { - "HTMLElement": true, - "WeakRef": true - }, - "packages": { - "browserify>browser-resolve": true + "crypto": true } }, - "string.prototype.matchall>get-intrinsic": { + "@metamask/keyring-snap-client>uuid": { "globals": { - "AggregateError": true, - "FinalizationRegistry": true, - "WeakRef": true - }, - "packages": { - "browserify>has>function-bind": true, - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>has-proto": true, - "string.prototype.matchall>has-symbols": true + "crypto": true } }, - "string.prototype.matchall>internal-slot": { - "packages": { - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>side-channel": true + "eth-lattice-keyring>gridplus-sdk>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": true + "web3-stream-provider>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": { + "@metamask/snaps-utils>validate-npm-package-name": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "@metamask/snaps-utils>validate-npm-package-name>builtins": true } }, - "string.prototype.matchall>side-channel": { + "react-markdown>vfile>vfile-message": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>object-inspect": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>vfile>unist-util-stringify-position": true } }, - "terser>source-map-support>buffer-from": { + "react-markdown>vfile": { "packages": { - "browserify>buffer": true + "react-markdown>vfile>is-buffer": true, + "path-browserify": true, + "process": true, + "react-markdown>vfile>replace-ext": true, + "react-markdown>vfile>vfile-message": true } }, - "uri-js": { + "browserify>vm-browserify": { "globals": { - "define": true + "document.body.appendChild": true, + "document.body.removeChild": true, + "document.createElement": true } }, - "uuid": { + "react-popper>warning": { "globals": { - "crypto": true, - "msCrypto": true + "console": true } }, - "wait-on>rxjs": { + "@ensdomains/content-hash>multihashes>web-encoding": { "globals": { - "cancelAnimationFrame": true, - "clearInterval": true, - "clearTimeout": true, - "performance": true, - "requestAnimationFrame": true, - "setInterval.apply": true, - "setTimeout.apply": true + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "browserify>util": true } }, "web3": { @@ -5484,14 +5367,14 @@ "setTimeout": true }, "packages": { - "browserify>util": true, "readable-stream": true, + "browserify>util": true, "web3-stream-provider>uuid": true } }, - "web3-stream-provider>uuid": { + "@metamask/controllers>web3": { "globals": { - "crypto": true + "XMLHttpRequest": true } }, "webextension-polyfill": { @@ -5503,9 +5386,35 @@ "define": true } }, - "webpack>events": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, + "eslint-plugin-react>array-includes>is-string": true, + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-collection": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true + } + }, + "browserify>util>which-typed-array": { + "packages": { + "string.prototype.matchall>es-abstract>available-typed-arrays": true, + "string.prototype.matchall>call-bind": true, + "browserify>util>which-typed-array>for-each": true, + "string.prototype.matchall>es-abstract>gopd": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { "globals": { - "console": true + "XMLHttpRequest": true } } } diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index b3b118eb6bb8..82075f709022 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -5,144 +5,124 @@ "regeneratorRuntime": "write" } }, - "@ensdomains/content-hash": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { "globals": { - "console.warn": true + "WeakRef": true }, "packages": { - "@ensdomains/content-hash>cids": true, - "@ensdomains/content-hash>js-base64": true, - "@ensdomains/content-hash>multicodec": true, - "@ensdomains/content-hash>multihashes": true, - "browserify>buffer": true + "browserify": true } }, - "@ensdomains/content-hash>cids": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes": true, - "@ensdomains/content-hash>cids>uint8arrays": true, - "@ensdomains/content-hash>multicodec": true + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, + "browserify": true, + "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true } }, - "@ensdomains/content-hash>cids>multibase": { + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "SuppressedError": true + } + }, + "@ensdomains/content-hash": { + "globals": { + "console.warn": true }, "packages": { - "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true + "browserify>buffer": true, + "@ensdomains/content-hash>cids": true, + "@ensdomains/content-hash>js-base64": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>multihashes": true } }, - "@ensdomains/content-hash>cids>multihashes": { + "@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes>varint": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>cids>uint8arrays": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "webpack>events": true } }, - "@ensdomains/content-hash>js-base64": { - "globals": { - "Base64": "write", - "TextDecoder": true, - "TextEncoder": true, - "atob": true, - "btoa": true, - "define": true - }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "browserify>buffer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays": true, - "sass-embedded>varint": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays": { + "@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "Buffer": true, - "TextDecoder": true, "TextEncoder": true - }, - "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "TextDecoder": true, - "TextEncoder": true, - "console.warn": true, - "crypto.subtle.digest": true - } - }, - "@ensdomains/content-hash>multihashes": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase": true, - "@ensdomains/content-hash>multihashes>varint": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase>base-x": { + "@ethereumjs/tx": { "packages": { - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, - "@ensdomains/content-hash>multihashes>web-encoding": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx": { "packages": { - "browserify>util": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@ethereumjs/tx": { + "eth-lattice-keyring>@ethereumjs/tx": { "packages": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, "@ethereumjs/tx>@ethereumjs/common": true, "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, + "@ethersproject/providers": true, "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true, "browserify>insert-module-globals>is-buffer": true } }, - "@ethereumjs/tx>@ethereumjs/common": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/providers": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@ethereumjs/tx>@ethereumjs/common>crc-32": { - "globals": { - "DO_NOT_EXPORT_CRC": true, - "define": true - } - }, - "@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, "@ethereumjs/tx>@ethereumjs/util": { @@ -151,70 +131,83 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, - "@ethereumjs/tx>ethereum-cryptography": true, "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true, "browserify>insert-module-globals>is-buffer": true, - "webpack>events": true + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true } }, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { + "@metamask/smart-transactions-controller>@ethereumjs/util": { "globals": { - "Headers": true, - "TextDecoder": true, - "URL": true, - "btoa": true, + "console.warn": true, "fetch": true }, "packages": { - "browserify>browserify-zlib": true, - "browserify>buffer": true, - "browserify>url": true, - "browserify>util": true, - "https-browserify": true, - "process": true, - "stream-http": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true } }, - "@ethereumjs/tx>ethereum-cryptography": { + "@ethersproject/abi": { "globals": { - "TextDecoder": true, - "crypto": true + "console.log": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true, - "@metamask/message-signing-snap>@noble/curves": true, - "@noble/hashes": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { + "ethers>@ethersproject/abstract-provider": { "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "@ethersproject/abi": { - "globals": { - "console.log": true - }, + "ethers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/address": { "packages": { "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/basex": { + "packages": { + "@ethersproject/bytes": true, + "ethers>@ethersproject/properties": true } }, "@ethersproject/bignumber": { "packages": { "@ethersproject/bytes": true, - "bn.js": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/logger": true, + "bn.js": true } }, "@ethersproject/bytes": { @@ -222,17 +215,22 @@ "ethers>@ethersproject/logger": true } }, + "ethers>@ethersproject/constants": { + "packages": { + "@ethersproject/bignumber": true + } + }, "@ethersproject/contracts": { "globals": { "setTimeout": true }, "packages": { "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/abstract-provider": true, "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/transactions": true @@ -240,10 +238,10 @@ }, "@ethersproject/hash": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/address": true, "ethers>@ethersproject/base64": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, @@ -252,9 +250,9 @@ }, "@ethersproject/hdnode": { "packages": { + "ethers>@ethersproject/basex": true, "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "ethers>@ethersproject/basex": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, @@ -265,1235 +263,719 @@ "ethers>@ethersproject/wordlists": true } }, - "@ethersproject/providers": { - "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true - }, + "ethers>@ethersproject/json-wallets": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/providers>bech32": true, - "@metamask/test-bundler>@ethersproject/networks": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true - } - }, - "@ethersproject/providers>@ethersproject/random": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true - } - }, - "@ethersproject/wallet": { - "packages": { "@ethersproject/bytes": true, - "@ethersproject/hash": true, "@ethersproject/hdnode": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@keystonehq/bc-ur-registry-eth": { + "ethers>@ethersproject/keccak256": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "uuid": true + "@ethersproject/bytes": true, + "@metamask/ethjs>js-sha3": true } }, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { + "ethers>@ethersproject/logger": { "globals": { - "define": true - }, + "console": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { "packages": { - "@ngraveio/bc-ur": true, - "@swc/helpers>tslib": true, - "browserify>buffer": true, - "buffer": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring": { + "@metamask/test-bundler>@ethersproject/networks": { "packages": { - "@ethereumjs/tx": true, - "@keystonehq/bc-ur-registry-eth": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>rlp": true, - "@metamask/obs-store": true, - "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "ethers>@ethersproject/pbkdf2": { "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "eth-lattice-keyring>rlp": true, - "uuid": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/sha2": true } }, - "@keystonehq/metamask-airgapped-keyring>rlp": { + "ethers>@ethersproject/properties": { "packages": { - "bn.js": true, - "browserify>buffer": true + "ethers>@ethersproject/logger": true } }, - "@lavamoat/lavadome-react": { + "@ethersproject/providers": { "globals": { - "Document.prototype": true, - "DocumentFragment.prototype": true, - "Element.prototype": true, - "Node.prototype": true, + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, "console.warn": true, - "document": true + "setInterval": true, + "setTimeout": true }, "packages": { - "react": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "@metamask/test-bundler>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "@ethersproject/providers>@ethersproject/web": true, + "@ethersproject/providers>bech32": true } }, - "@material-ui/core": { + "ethers>@ethersproject/providers": { "globals": { - "Image": true, - "_formatMuiErrorMessage": true, - "addEventListener": true, + "WebSocket": true, "clearInterval": true, "clearTimeout": true, - "console.error": true, + "console.log": true, "console.warn": true, - "document": true, - "getComputedStyle": true, - "getSelection": true, - "innerHeight": true, - "innerWidth": true, - "matchMedia": true, - "navigator": true, - "performance.now": true, - "removeEventListener": true, - "requestAnimationFrame": true, "setInterval": true, "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles": true, - "@material-ui/core>@material-ui/system": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "@material-ui/core>popper.js": true, - "@material-ui/core>react-transition-group": true, - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true } }, - "@material-ui/core>@material-ui/styles": { + "@ethersproject/providers>@ethersproject/random": { "globals": { - "console.error": true, - "console.warn": true, - "document.createComment": true, - "document.head": true - }, + "crypto.getRandomValues": true + } + }, + "ethers>@ethersproject/random": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, - "@material-ui/core>@material-ui/styles>jss-plugin-global": true, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, - "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "prop-types": true, - "react": true, - "react-redux>hoist-non-react-statics": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss": { - "globals": { - "CSS": true, - "document.createElement": true, - "document.querySelector": true - }, + "ethers>@ethersproject/rlp": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { + "ethers>@ethersproject/sha2": { "packages": { - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { - "globals": { - "CSS": true - }, + "ethers>@ethersproject/signing-key": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-global": { + "ethers>@ethersproject/solidity": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": { + "ethers>@ethersproject/strings": { "packages": { - "@babel/runtime": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { + "ethers>@ethersproject/transactions": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "react-router-dom>tiny-warning": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/signing-key": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { + "ethers>@ethersproject/units": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true + "@ethersproject/bignumber": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { - "globals": { - "document.createElement": true, - "document.documentElement": true, - "getComputedStyle": true - }, + "@ethersproject/wallet": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true - } - }, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": { - "globals": { - "document": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/transactions": true } }, - "@material-ui/core>@material-ui/system": { + "@ethersproject/providers>@ethersproject/web": { "globals": { - "console.error": true + "clearTimeout": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/utils": true, - "prop-types": true - } - }, - "@material-ui/core>@material-ui/utils": { - "packages": { - "@babel/runtime": true, - "prop-types": true, - "prop-types>react-is": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>popper.js": { + "ethers>@ethersproject/providers>@ethersproject/web": { "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator": true, - "requestAnimationFrame": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>react-transition-group": { + "ethers>@ethersproject/web": { "globals": { - "Element": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true }, "packages": { - "@material-ui/core>react-transition-group>dom-helpers": true, - "prop-types": true, - "react": true, - "react-dom": true - } - }, - "@material-ui/core>react-transition-group>dom-helpers": { - "packages": { - "@babel/runtime": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask/abi-utils": { + "ethers>@ethersproject/wordlists": { "packages": { - "@metamask/abi-utils>@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask/abi-utils>@metamask/utils": { + "@metamask/notification-services-controller>firebase>@firebase/app": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "FinalizationRegistry": true, + "console.warn": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/accounts-controller": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/base-controller": true, - "@metamask/eth-snap-keyring": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/utils": true, - "uuid": true - } - }, - "@metamask/address-book-controller": { - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask/announcement-controller": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { "packages": { - "@metamask/announcement-controller>@metamask/base-controller": true + "@metamask/notification-services-controller>firebase>@firebase/util": true } }, - "@metamask/announcement-controller>@metamask/base-controller": { + "@metamask/notification-services-controller>firebase>@firebase/installations": { "globals": { + "BroadcastChannel": true, + "Headers": true, + "btoa": true, + "console.error": true, + "crypto": true, + "fetch": true, + "msCrypto": true, + "navigator.onLine": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask/approval-controller": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { "globals": { - "console.info": true + "console": true }, "packages": { - "@metamask/approval-controller>nanoid": true, - "@metamask/base-controller": true, - "@metamask/rpc-errors": true - } - }, - "@metamask/approval-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@swc/helpers>tslib": true } }, - "@metamask/assets-controllers": { + "@metamask/notification-services-controller>firebase>@firebase/messaging": { "globals": { - "AbortController": true, "Headers": true, + "Notification.maxActions": true, + "Notification.permission": true, + "Notification.requestPermission": true, + "PushSubscription.prototype.hasOwnProperty": true, + "ServiceWorkerRegistration": true, "URL": true, - "URLSearchParams": true, - "clearInterval": true, - "clearTimeout": true, - "console.error": true, - "console.log": true, - "setInterval": true, + "addEventListener": true, + "atob": true, + "btoa": true, + "clients.matchAll": true, + "clients.openWindow": true, + "console.warn": true, + "document": true, + "fetch": true, + "indexedDB": true, + "location.href": true, + "location.origin": true, + "navigator": true, + "origin.replace": true, + "registration.showNotification": true, "setTimeout": true }, "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/bignumber": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/abi-utils": true, - "@metamask/assets-controllers>@metamask/polling-controller": true, - "@metamask/base-controller": true, - "@metamask/contract-metadata": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "bn.js": true, - "cockatiel": true, - "ethers>@ethersproject/address": true, - "lodash": true, - "single-call-balance-checker-abi": true, - "uuid": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/installations": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, + "@swc/helpers>tslib": true } }, - "@metamask/assets-controllers>@metamask/polling-controller": { + "@metamask/notification-services-controller>firebase>@firebase/util": { "globals": { - "clearTimeout": true, - "console.error": true, + "atob": true, + "browser": true, + "btoa": true, + "chrome": true, + "console": true, + "document": true, + "indexedDB": true, + "navigator": true, + "process": true, + "self": true, "setTimeout": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, + "process": true + } + }, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "eth-lattice-keyring>rlp": true, "uuid": true } }, - "@metamask/base-controller": { - "globals": { - "setTimeout": true - }, + "@keystonehq/bc-ur-registry-eth": { "packages": { - "immer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "uuid": true } }, - "@metamask/browser-passworder": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { "globals": { - "CryptoKey": true, - "btoa": true, - "crypto.getRandomValues": true, - "crypto.subtle.decrypt": true, - "crypto.subtle.deriveKey": true, - "crypto.subtle.encrypt": true, - "crypto.subtle.exportKey": true, - "crypto.subtle.importKey": true - }, - "packages": { - "@metamask/browser-passworder>@metamask/utils": true, - "browserify>buffer": true - } - }, - "@metamask/browser-passworder>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/controller-utils": { - "globals": { - "URL": true, - "console.error": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/controller-utils>@spruceid/siwe-parser": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/utils": true, - "bn.js": true, - "browserify>buffer": true, - "eslint>fast-deep-equal": true, - "eth-ens-namehash": true - } - }, - "@metamask/controller-utils>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { - "packages": { - "browserify>buffer": true - } - }, - "@metamask/controllers>web3": { - "globals": { - "XMLHttpRequest": true - } - }, - "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { - "globals": { - "fetch": true - } - }, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { - "globals": { - "fetch": true - } - }, - "@metamask/ens-controller": { - "packages": { - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/ens-controller>@metamask/utils": true, - "punycode": true - } - }, - "@metamask/ens-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-json-rpc-filters": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/eth-query": true, - "@metamask/json-rpc-engine": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/safe-event-emitter": true, - "pify": true - } - }, - "@metamask/eth-json-rpc-middleware": { - "globals": { - "URL": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true - } - }, - "@metamask/eth-json-rpc-middleware>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-json-rpc-provider": { - "packages": { - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "uuid": true - } - }, - "@metamask/eth-ledger-bridge-keyring": { - "globals": { - "addEventListener": true, - "console.error": true, - "document.createElement": true, - "document.head.appendChild": true, - "fetch": true, - "removeEventListener": true - }, - "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, - "@metamask/eth-sig-util": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { - "globals": { - "console.warn": true - }, - "packages": { - "@ethersproject/abi": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, - "browserify>buffer": true, - "ethers>@ethersproject/rlp": true, - "semver": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { - "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { - "globals": { - "console.warn": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { - "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true, - "@metamask/ppom-validator>crypto-js": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { - "globals": { - "console.warn": true - }, - "packages": { - "wait-on>rxjs": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/providers": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/wordlists": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { - "globals": { - "__ledgerLogsListen": "write", - "console.error": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { - "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { - "globals": { - "crypto": true, "define": true - } - }, - "@metamask/eth-query": { - "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "watchify>xtend": true - } - }, - "@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-sig-util>tweetnacl": { - "globals": { - "crypto": true, - "msCrypto": true, - "nacl": "write" - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/eth-snap-keyring": { - "globals": { - "URL": true, - "console.error": true - }, - "packages": { - "@ethereumjs/tx": true, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/eth-snap-keyring>uuid": true, - "@metamask/keyring-api": true, - "@metamask/utils>@metamask/superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-snap-keyring>uuid": { - "globals": { - "crypto": true - } - }, - "@metamask/eth-token-tracker": { - "globals": { - "console.warn": true - }, - "packages": { - "@babel/runtime": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/eth-token-tracker>deep-equal": true, - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/safe-event-emitter": true, - "bn.js": true, - "human-standard-token-abi": true - } - }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, - "@metamask/safe-event-emitter": true, - "pify": true - } - }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@ngraveio/bc-ur": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "buffer": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-token-tracker>deep-equal": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, - "@metamask/eth-token-tracker>deep-equal>is-date-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, - "@metamask/eth-token-tracker>deep-equal>which-collection": true, - "@ngraveio/bc-ur>assert>object-is": true, - "browserify>util>is-arguments": true, - "browserify>util>which-typed-array": true, - "gulp>vinyl-fs>object.assign": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true, - "string.prototype.matchall>es-abstract>is-regex": true, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>regexp.prototype.flags": true, - "string.prototype.matchall>side-channel": true - } - }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true, - "browserify>util>is-arguments": true, - "eslint-plugin-react>array-includes>is-string": true, - "process": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>has-symbols": true - } - }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { - "globals": { - "StopIteration": true - }, - "packages": { - "string.prototype.matchall>internal-slot": true - } - }, - "@metamask/eth-token-tracker>deep-equal>is-date-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, - "eslint-plugin-react>array-includes>is-string": true, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { - "packages": { - "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "@swc/helpers>tslib": true } }, - "@metamask/eth-trezor-keyring": { - "globals": { - "setTimeout": true - }, + "@keystonehq/metamask-airgapped-keyring": { "packages": { "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "@trezor/connect-web": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { - "packages": { - "@metamask/eth-sig-util": true, - "@swc/helpers>tslib": true - } - }, - "@metamask/eth-trezor-keyring>hdkey": { - "packages": { - "browserify>assert": true, - "crypto-browserify": true, - "ethereumjs-util>create-hash>ripemd160": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "webpack>events": true, + "@keystonehq/metamask-airgapped-keyring>rlp": true, + "uuid": true } }, - "@metamask/etherscan-link": { + "chart.js>@kurkle/color": { "globals": { - "URL": true + "define": true } }, - "@metamask/ethjs": { + "@lavamoat/lavadome-react": { "globals": { - "clearInterval": true, - "setInterval": true + "Document.prototype": true, + "DocumentFragment.prototype": true, + "Element.prototype": true, + "Node.prototype": true, + "console.warn": true, + "document": true }, "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-provider-http": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/number-to-bn": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true + "react": true } }, - "@metamask/ethjs-contract": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { "packages": { - "@babel/runtime": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "promise-to-callback": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true } }, - "@metamask/ethjs-query": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { "globals": { - "console": true - }, + "console.warn": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format": true, - "@metamask/ethjs-query>@metamask/ethjs-rpc": true, - "promise-to-callback": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, + "@metamask/ppom-validator>crypto-js": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true } }, - "@metamask/ethjs-query>@metamask/ethjs-format": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { + "globals": { + "console.warn": true + }, "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "@metamask/ethjs>@metamask/number-to-bn": true + "@ethersproject/abi": true, + "ethers>@ethersproject/rlp": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, + "browserify>buffer": true, + "semver": true } }, - "@metamask/ethjs-query>@metamask/ethjs-rpc": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { + "globals": { + "console.warn": true + }, "packages": { - "promise-to-callback": true + "wait-on>rxjs": true } }, - "@metamask/ethjs>@metamask/ethjs-filter": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { "globals": { - "clearInterval": true, - "setInterval": true + "__ledgerLogsListen": "write", + "console.error": true } }, - "@metamask/ethjs>@metamask/ethjs-provider-http": { + "@material-ui/core": { + "globals": { + "Image": true, + "_formatMuiErrorMessage": true, + "addEventListener": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "getSelection": true, + "innerHeight": true, + "innerWidth": true, + "matchMedia": true, + "navigator": true, + "performance.now": true, + "removeEventListener": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles": true, + "@material-ui/core>@material-ui/system": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>popper.js": true, + "prop-types": true, + "react": true, + "react-dom": true, + "prop-types>react-is": true, + "@material-ui/core>react-transition-group": true } }, - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { + "@material-ui/core>@material-ui/styles": { "globals": { - "XMLHttpRequest": true + "console.error": true, + "console.warn": true, + "document.createComment": true, + "document.head": true + }, + "packages": { + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, + "@material-ui/core>@material-ui/styles>jss-plugin-global": true, + "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, + "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, + "@material-ui/core>@material-ui/styles>jss": true, + "prop-types": true, + "react": true } }, - "@metamask/ethjs>@metamask/ethjs-unit": { + "@material-ui/core>@material-ui/system": { + "globals": { + "console.error": true + }, "packages": { - "@metamask/ethjs>@metamask/number-to-bn": true, - "bn.js": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "prop-types": true } }, - "@metamask/ethjs>@metamask/ethjs-util": { + "@material-ui/core>@material-ui/utils": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "browserify>buffer": true + "@babel/runtime": true, + "prop-types": true, + "prop-types>react-is": true } }, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "@metamask/abi-utils": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + "@metamask/utils>@metamask/superstruct": true, + "@metamask/abi-utils>@metamask/utils": true } }, - "@metamask/ethjs>@metamask/number-to-bn": { + "@metamask/accounts-controller": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, + "@metamask/eth-snap-keyring": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "uuid": true } }, - "@metamask/ethjs>ethjs-abi": { + "@metamask/address-book-controller": { "packages": { - "@metamask/ethjs>ethjs-abi>number-to-bn": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true } }, - "@metamask/ethjs>ethjs-abi>number-to-bn": { + "@metamask/announcement-controller": { "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true + "@metamask/announcement-controller>@metamask/base-controller": true } }, - "@metamask/ethjs>js-sha3": { + "@metamask/approval-controller": { "globals": { - "define": true + "console.info": true }, "packages": { - "process": true + "@metamask/base-controller": true, + "@metamask/rpc-errors": true, + "nanoid": true } }, - "@metamask/gas-fee-controller": { + "@metamask/assets-controllers": { "globals": { + "AbortController": true, + "Headers": true, + "URL": true, + "URLSearchParams": true, "clearInterval": true, + "clearTimeout": true, "console.error": true, - "setInterval": true + "console.log": true, + "setInterval": true, + "setTimeout": true }, "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/abi-utils": true, + "@metamask/base-controller": true, + "@metamask/contract-metadata": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, + "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, "bn.js": true, + "cockatiel": true, + "lodash": true, + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, + "single-call-balance-checker-abi": true, "uuid": true } }, - "@metamask/jazzicon": { + "@metamask/base-controller": { "globals": { - "document.createElement": true, - "document.createElementNS": true + "setTimeout": true }, "packages": { - "@metamask/jazzicon>color": true, - "@metamask/jazzicon>mersenne-twister": true + "immer": true } }, - "@metamask/jazzicon>color": { + "@metamask/announcement-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/jazzicon>color>clone": true, - "@metamask/jazzicon>color>color-convert": true, - "@metamask/jazzicon>color>color-string": true + "immer": true } }, - "@metamask/jazzicon>color>clone": { + "@metamask/name-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "browserify>buffer": true + "immer": true } }, - "@metamask/jazzicon>color>color-convert": { + "@metamask/rate-limit-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/jazzicon>color>color-convert>color-name": true + "immer": true } }, - "@metamask/jazzicon>color>color-string": { + "@metamask/browser-passworder": { + "globals": { + "CryptoKey": true, + "btoa": true, + "crypto.getRandomValues": true, + "crypto.subtle.decrypt": true, + "crypto.subtle.deriveKey": true, + "crypto.subtle.encrypt": true, + "crypto.subtle.exportKey": true, + "crypto.subtle.importKey": true + }, "packages": { - "jest-canvas-mock>moo-color>color-name": true + "@metamask/browser-passworder>@metamask/utils": true, + "browserify>buffer": true } }, - "@metamask/json-rpc-engine": { - "packages": { - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "@metamask/utils": true + "eth-keyring-controller>@metamask/browser-passworder": { + "globals": { + "crypto": true } }, - "@metamask/json-rpc-middleware-stream": { + "@metamask/controller-utils": { "globals": { - "console.warn": true, + "URL": true, + "console.error": true, + "fetch": true, "setTimeout": true }, "packages": { - "@metamask/safe-event-emitter": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, "@metamask/utils": true, - "readable-stream": true + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "bn.js": true, + "browserify>buffer": true, + "eth-ens-namehash": true, + "eslint>fast-deep-equal": true } }, - "@metamask/keyring-api": { - "globals": { - "URL": true - }, + "@metamask/ens-controller": { "packages": { - "@metamask/keyring-api>@metamask/utils": true, - "@metamask/keyring-api>bech32": true, - "@metamask/keyring-api>uuid": true, - "@metamask/utils>@metamask/superstruct": true + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "punycode": true } }, - "@metamask/keyring-api>@metamask/utils": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "clearTimeout": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/safe-event-emitter": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true, + "pify": true } }, - "@metamask/keyring-api>uuid": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { - "crypto": true - } - }, - "@metamask/keyring-controller": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/base-controller": true, - "@metamask/browser-passworder": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, - "@metamask/keyring-controller>@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, - "@metamask/keyring-controller>ethereumjs-wallet": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/utils": true + "@metamask/safe-event-emitter": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true } }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { @@ -1502,518 +984,459 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, "@metamask/scure-bip39": true, - "browserify>buffer": true + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { + "@metamask/eth-json-rpc-filters": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "console.error": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/safe-event-emitter": true, + "@metamask/name-controller>async-mutex": true, + "pify": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "globals": { + "fetch": true, + "setTimeout": true + }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true + "@metamask/eth-json-rpc-provider": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { + "@metamask/eth-json-rpc-middleware": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "URL": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/eth-sig-util": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/eth-json-rpc-middleware>@metamask/utils": true, + "@metamask/eth-json-rpc-middleware>klona": true, + "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": { + "@metamask/eth-json-rpc-provider": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, - "browserify>buffer": true, - "crypto-browserify>randombytes": true + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "uuid": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "@metamask/eth-ledger-bridge-keyring": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "addEventListener": true, + "console.error": true, + "document.createElement": true, + "document.head.appendChild": true, + "fetch": true, + "removeEventListener": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, + "@metamask/eth-sig-util": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/keyring-controller>ethereumjs-wallet": { + "@metamask/eth-query": { "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, - "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, - "browserify>buffer": true, - "crypto-browserify": true, - "crypto-browserify>randombytes": true, - "eth-lattice-keyring>gridplus-sdk>aes-js": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "uuid": true + "@metamask/eth-query>json-rpc-random-id": true, + "watchify>xtend": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "@metamask/eth-sig-util": { "packages": { - "browserify>assert": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ethers>@ethersproject/sha2>hash.js": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true, - "bn.js": true, - "browserify>assert": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true - } - }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { - "packages": { - "bn.js": true, - "browserify>buffer": true - } - }, - "@metamask/logging-controller": { - "packages": { - "@metamask/base-controller": true, - "uuid": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/logo": { - "globals": { - "addEventListener": true, - "document.body.appendChild": true, - "document.createElementNS": true, - "innerHeight": true, - "innerWidth": true, - "requestAnimationFrame": true - }, + "@metamask/keyring-controller>@metamask/eth-sig-util": { "packages": { - "@metamask/logo>gl-mat4": true, - "@metamask/logo>gl-vec3": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/message-manager": { + "@metamask/signature-controller>@metamask/eth-sig-util": { "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/utils": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/message-manager>jsonschema": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring": { "packages": { - "browserify>url": true - } - }, - "@metamask/message-signing-snap>@noble/ciphers": { - "globals": { - "TextDecoder": true, - "TextEncoder": true, - "crypto": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "crypto-browserify>randombytes": true } }, - "@metamask/message-signing-snap>@noble/curves": { + "@metamask/eth-snap-keyring": { "globals": { - "TextEncoder": true + "URL": true, + "console.error": true }, "packages": { - "@noble/hashes": true + "@ethereumjs/tx": true, + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, + "@metamask/keyring-api": true, + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, + "webpack>events": true, + "@metamask/eth-snap-keyring>uuid": true } }, - "@metamask/name-controller": { + "@metamask/eth-token-tracker": { "globals": { - "fetch": true + "console.warn": true }, "packages": { - "@metamask/controller-utils": true, - "@metamask/name-controller>@metamask/base-controller": true, - "@metamask/name-controller>@metamask/utils": true, - "@metamask/name-controller>async-mutex": true + "@babel/runtime": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true, + "@metamask/safe-event-emitter": true, + "bn.js": true, + "@metamask/eth-token-tracker>deep-equal": true, + "human-standard-token-abi": true } }, - "@metamask/name-controller>@metamask/base-controller": { + "@metamask/eth-trezor-keyring": { "globals": { "setTimeout": true }, "packages": { - "immer": true + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, + "@trezor/connect-web": true, + "browserify>buffer": true, + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/name-controller>@metamask/utils": { + "@metamask/etherscan-link": { "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "URL": true } }, - "@metamask/name-controller>async-mutex": { + "@metamask/ethjs": { "globals": { - "clearTimeout": true, - "setTimeout": true + "clearInterval": true, + "setInterval": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-provider-http": true, + "@metamask/ethjs-query": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true } }, - "@metamask/network-controller": { - "globals": { - "btoa": true, - "fetch": true, - "setTimeout": true - }, + "@metamask/ethjs-contract": { "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-json-rpc-provider": true, - "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/network-controller>reselect": true, - "browserify>assert": true, - "browserify>util": true, - "uri-js": true, - "uuid": true + "@babel/runtime": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true, + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "@metamask/ethjs>@metamask/ethjs-filter": { "globals": { - "setTimeout": true - }, + "clearInterval": true, + "setInterval": true + } + }, + "@metamask/ethjs-query>@metamask/ethjs-format": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "node-fetch": true + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": { + "@metamask/ethjs>@metamask/ethjs-provider-http": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/safe-event-emitter": true + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": { + "@metamask/ethjs-query": { + "globals": { + "console": true + }, "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/ethjs-query>@metamask/ethjs-format": true, + "@metamask/ethjs-query>@metamask/ethjs-rpc": true, + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": { + "@metamask/ethjs-query>@metamask/ethjs-rpc": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true + "promise-to-callback": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/ethjs>@metamask/ethjs-unit": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/ethjs>@metamask/ethjs-util": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": { + "@metamask/gas-fee-controller": { "globals": { - "URL": true, + "clearInterval": true, "console.error": true, - "setTimeout": true + "setInterval": true }, "packages": { - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/polling-controller": true, "bn.js": true, - "pify": true + "uuid": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { + "@metamask/jazzicon": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "document.createElement": true, + "document.createElementNS": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/jazzicon>color": true, + "@metamask/jazzicon>mersenne-twister": true } }, - "@metamask/network-controller>@metamask/json-rpc-engine": { + "@metamask/json-rpc-engine": { "packages": { - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "@metamask/utils": true } }, - "@metamask/network-controller>@metamask/rpc-errors": { + "@metamask/json-rpc-middleware-stream": { + "globals": { + "console.warn": true, + "setTimeout": true + }, "packages": { - "@metamask/network-controller>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true + "@metamask/safe-event-emitter": true, + "@metamask/utils": true, + "readable-stream": true } }, - "@metamask/network-controller>@metamask/utils": { + "@metamask/snaps-sdk>@metamask/key-tree": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "crypto.subtle": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, + "@metamask/scure-bip39": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>reselect": { - "globals": { - "WeakRef": true, - "console.warn": true, - "unstable_autotrackMemoize": true + "@metamask/utils>@scure/base": true } }, - "@metamask/notification-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/keyring-api": { + "packages": { + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-api>@metamask/utils": true, + "@metamask/keyring-api>bech32": true } }, - "@metamask/notification-services-controller": { - "globals": { - "Intl.NumberFormat": true, - "addEventListener": true, - "fetch": true, - "registration": true, - "removeEventListener": true - }, + "@metamask/keyring-controller": { "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, - "@metamask/notification-services-controller>bignumber.js": true, - "@metamask/notification-services-controller>firebase": true, - "@metamask/profile-sync-controller": true, + "@metamask/browser-passworder": true, + "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, + "@metamask/keyring-controller>@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/utils": true, - "loglevel": true, - "uuid": true + "@metamask/name-controller>async-mutex": true, + "@metamask/keyring-controller>ethereumjs-wallet": true } }, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { - "globals": { - "SuppressedError": true + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": { + "packages": { + "@metamask/keyring-snap-client": true } }, - "@metamask/notification-services-controller>bignumber.js": { + "@metamask/keyring-snap-client": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-snap-client>uuid": true + } + }, + "@metamask/keyring-api>@metamask/keyring-utils": { "globals": { - "crypto": true, - "define": true + "URL": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": true } }, - "@metamask/notification-services-controller>firebase": { + "@metamask/logging-controller": { "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/messaging": true + "@metamask/base-controller": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app": { - "globals": { - "FinalizationRegistry": true, - "console.warn": true + "@metamask/logo": { + "globals": { + "addEventListener": true, + "document.body.appendChild": true, + "document.createElementNS": true, + "innerHeight": true, + "innerWidth": true, + "requestAnimationFrame": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/logo>gl-mat4": true, + "@metamask/logo>gl-vec3": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { + "@metamask/message-manager": { "packages": { - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "browserify>buffer": true, + "webpack>events": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { + "@metamask/name-controller": { "globals": { - "console": true + "fetch": true }, "packages": { - "@swc/helpers>tslib": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": { - "globals": { - "DOMException": true, - "IDBCursor": true, - "IDBDatabase": true, - "IDBIndex": true, - "IDBObjectStore": true, - "IDBRequest": true, - "IDBTransaction": true, - "indexedDB.deleteDatabase": true, - "indexedDB.open": true + "@metamask/name-controller>@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/name-controller>@metamask/utils": true, + "@metamask/name-controller>async-mutex": true } }, - "@metamask/notification-services-controller>firebase>@firebase/installations": { + "@metamask/network-controller": { "globals": { - "BroadcastChannel": true, - "Headers": true, "btoa": true, - "console.error": true, - "crypto": true, "fetch": true, - "msCrypto": true, - "navigator.onLine": true, "setTimeout": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, + "@metamask/eth-json-rpc-middleware": true, + "@metamask/eth-json-rpc-provider": true, + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/utils": true, + "eslint>fast-deep-equal": true, + "reselect": true, + "uri-js": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/messaging": { + "@metamask/transaction-controller>@metamask/nonce-tracker": { + "packages": { + "@ethersproject/providers": true, + "browserify>assert": true, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true + } + }, + "@metamask/notification-services-controller": { "globals": { - "Headers": true, - "Notification.maxActions": true, - "Notification.permission": true, - "Notification.requestPermission": true, - "PushSubscription.prototype.hasOwnProperty": true, - "ServiceWorkerRegistration": true, - "URL": true, + "Intl.NumberFormat": true, "addEventListener": true, - "atob": true, - "btoa": true, - "clients.matchAll": true, - "clients.openWindow": true, - "console.warn": true, - "document": true, "fetch": true, - "indexedDB": true, - "location.href": true, - "location.origin": true, - "navigator": true, - "origin.replace": true, - "registration.showNotification": true, - "setTimeout": true + "registration": true, + "removeEventListener": true }, "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/installations": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true, - "@swc/helpers>tslib": true + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/profile-sync-controller": true, + "@metamask/utils": true, + "@metamask/notification-services-controller>bignumber.js": true, + "@metamask/notification-services-controller>firebase": true, + "loglevel": true, + "uuid": true } }, - "@metamask/notification-services-controller>firebase>@firebase/util": { - "globals": { - "atob": true, - "browser": true, - "btoa": true, - "chrome": true, - "console": true, - "document": true, - "indexedDB": true, - "navigator": true, - "process": true, - "self": true, - "setTimeout": true - }, + "@metamask/ethjs>@metamask/number-to-bn": { "packages": { - "process": true + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, "@metamask/object-multiplex": { @@ -2025,11 +1448,6 @@ "readable-stream": true } }, - "@metamask/object-multiplex>once": { - "packages": { - "@metamask/object-multiplex>once>wrappy": true - } - }, "@metamask/obs-store": { "packages": { "@metamask/safe-event-emitter": true, @@ -2044,16 +1462,11 @@ "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/json-rpc-engine": true, - "@metamask/permission-controller>nanoid": true, "@metamask/rpc-errors": true, "@metamask/utils": true, "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/permission-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true + "immer": true, + "nanoid": true } }, "@metamask/permission-log-controller": { @@ -2062,21 +1475,6 @@ "@metamask/permission-log-controller>@metamask/utils": true } }, - "@metamask/permission-log-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/phishing-controller": { "globals": { "TextEncoder": true, @@ -2085,12 +1483,12 @@ "fetch": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/base-controller": true, "@metamask/controller-utils": true, "@noble/hashes": true, - "punycode": true, - "webpack-cli>fastest-levenshtein": true + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack-cli>fastest-levenshtein": true, + "punycode": true } }, "@metamask/polling-controller": { @@ -2121,21 +1519,6 @@ "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2145,48 +1528,11 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, - "@metamask/eth-query>json-rpc-random-id": true, + "await-semaphore": true, + "browserify>buffer": true, "@metamask/ppom-validator>crypto-js": true, "@metamask/ppom-validator>elliptic": true, - "await-semaphore": true, - "browserify>buffer": true - } - }, - "@metamask/ppom-validator>crypto-js": { - "globals": { - "crypto": true, - "define": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "@metamask/ppom-validator>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic>hmac-drbg": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "ethers>@ethersproject/sha2>hash.js": true + "@metamask/eth-query>json-rpc-random-id": true } }, "@metamask/preferences-controller": { @@ -2208,55 +1554,18 @@ "dispatchEvent": true, "fetch": true, "removeEventListener": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/message-signing-snap>@noble/ciphers": true, - "@metamask/profile-sync-controller>siwe": true, - "@noble/hashes": true, - "browserify>buffer": true, - "loglevel": true - } - }, - "@metamask/profile-sync-controller>siwe": { - "globals": { - "console.error": true, - "console.warn": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random": true, - "ethers": true - } - }, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, - "browserify>browser-resolve": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "setTimeout": true + }, "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + "@metamask/base-controller": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/network-controller": true, + "@metamask/profile-sync-controller>@noble/ciphers": true, + "@noble/hashes": true, + "browserify>buffer": true, + "loglevel": true, + "@metamask/profile-sync-controller>siwe": true } }, "@metamask/queued-request-controller": { @@ -2278,64 +1587,22 @@ "@metamask/rate-limit-controller>@metamask/utils": true } }, - "@metamask/rate-limit-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, + "@metamask/remote-feature-flag-controller": { "packages": { - "immer": true + "@metamask/base-controller": true, + "cockatiel": true } }, - "@metamask/rate-limit-controller>@metamask/rpc-errors": { + "@metamask/rpc-errors": { "packages": { - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/utils": true, "@metamask/rpc-errors>fast-safe-stringify": true } }, - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rate-limit-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rpc-errors": { + "@metamask/rate-limit-controller>@metamask/rpc-errors": { "packages": { - "@metamask/rpc-errors>fast-safe-stringify": true, - "@metamask/utils": true - } - }, - "@metamask/rpc-methods-flask>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/rpc-methods>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/rpc-errors>fast-safe-stringify": true } }, "@metamask/safe-event-emitter": { @@ -2355,12 +1622,6 @@ "@metamask/utils>@scure/base": true } }, - "@metamask/scure-bip39>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true - } - }, "@metamask/selected-network-controller": { "packages": { "@metamask/base-controller": true, @@ -2374,40 +1635,14 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/keyring-controller": true, "@metamask/logging-controller": true, - "@metamask/message-manager>jsonschema": true, - "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/utils": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/message-manager>jsonschema": true, + "uuid": true } }, "@metamask/smart-transactions-controller": { @@ -2420,72 +1655,19 @@ "setInterval": true }, "packages": { + "@metamask/smart-transactions-controller>@ethereumjs/tx": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, "@ethersproject/bytes": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "@metamask/smart-transactions-controller>@metamask/polling-controller": true, - "@metamask/smart-transactions-controller>bignumber.js": true, + "@metamask/polling-controller": true, "@metamask/transaction-controller": true, + "@metamask/smart-transactions-controller>bignumber.js": true, "browserify>buffer": true, "fast-json-patch": true, "lodash": true } }, - "@metamask/smart-transactions-controller>@ethereumjs/tx": { - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { - "packages": { - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/util": { - "globals": { - "console.warn": true, - "fetch": true - }, - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/smart-transactions-controller>@metamask/polling-controller": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "uuid": true - } - }, - "@metamask/smart-transactions-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, "@metamask/snaps-controllers": { "globals": { "DecompressionStream": true, @@ -2503,364 +1685,498 @@ "@metamask/permission-controller": true, "@metamask/post-message-stream": true, "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@xstate/fsm": true, - "@metamask/snaps-controllers>concat-stream": true, - "@metamask/snaps-controllers>get-npm-tarball-url": true, - "@metamask/snaps-controllers>nanoid": true, - "@metamask/snaps-controllers>readable-web-to-node-stream": true, - "@metamask/snaps-controllers>tar-stream": true, + "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/snaps-rpc-methods": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/utils": true, + "@metamask/snaps-controllers>@xstate/fsm": true, "browserify>browserify-zlib": true, + "@metamask/snaps-controllers>concat-stream": true, "eslint>fast-deep-equal": true, + "@metamask/snaps-controllers>get-npm-tarball-url": true, "immer": true, + "nanoid": true, "readable-stream": true, - "semver": true + "@metamask/snaps-controllers>readable-web-to-node-stream": true, + "semver": true, + "@metamask/snaps-controllers>tar-stream": true } }, - "@metamask/snaps-controllers-flask>nanoid": { + "@metamask/snaps-execution-environments": { "globals": { - "crypto.getRandomValues": true + "document.getElementById": true + }, + "packages": { + "@metamask/post-message-stream": true, + "@metamask/snaps-utils": true, + "@metamask/utils": true } }, - "@metamask/snaps-controllers>concat-stream": { + "@metamask/snaps-utils>@metamask/snaps-registry": { + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true + } + }, + "@metamask/snaps-rpc-methods": { + "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, + "@metamask/permission-controller": true, + "@metamask/rpc-errors": true, + "@metamask/snaps-sdk": true, + "@metamask/snaps-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true + } + }, + "@metamask/snaps-sdk": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true + } + }, + "@metamask/snaps-utils": { + "globals": { + "File": true, + "FileReader": true, + "TextDecoder": true, + "TextEncoder": true, + "URL": true, + "console.error": true, + "console.log": true, + "console.warn": true, + "crypto": true, + "document.body.appendChild": true, + "document.createElement": true, + "fetch": true + }, + "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, + "@metamask/permission-controller": true, + "@metamask/rpc-errors": true, + "@metamask/snaps-utils>@metamask/slip44": true, + "@metamask/snaps-sdk": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "chalk": true, + "@metamask/snaps-utils>cron-parser": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "@metamask/snaps-utils>fast-xml-parser": true, + "@metamask/snaps-utils>marked": true, + "@metamask/snaps-utils>rfdc": true, + "semver": true, + "@metamask/snaps-utils>validate-npm-package-name": true + } + }, + "@metamask/transaction-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, "packages": { + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/abi": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/metamask-eth-abis": true, + "@metamask/network-controller": true, + "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, + "bn.js": true, "browserify>buffer": true, - "browserify>concat-stream>typedarray": true, - "pumpify>inherits": true, - "readable-stream": true, - "terser>source-map-support>buffer-from": true + "eth-method-registry": true, + "webpack>events": true, + "fast-json-patch": true, + "lodash": true, + "uuid": true } }, - "@metamask/snaps-controllers>nanoid": { + "@metamask/user-operation-controller": { "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/snaps-controllers>readable-web-to-node-stream": { - "packages": { - "readable-stream": true - } - }, - "@metamask/snaps-controllers>tar-stream": { + "fetch": true + }, "packages": { - "@metamask/snaps-controllers>tar-stream>b4a": true, - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx": true, - "browserify>browser-resolve": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/transaction-controller": true, + "@metamask/utils": true, + "bn.js": true, + "webpack>events": true, + "lodash": true, + "uuid": true } }, - "@metamask/snaps-controllers>tar-stream>b4a": { + "@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx": { + }, "packages": { - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true, - "webpack>events": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { - "globals": { - "queueMicrotask": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-execution-environments": { + "@metamask/abi-utils>@metamask/utils": { "globals": { - "document.getElementById": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/post-message-stream": true, - "@metamask/snaps-utils": true, - "@metamask/utils": true - } - }, - "@metamask/snaps-rpc-methods": { - "packages": { - "@metamask/permission-controller": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk": { + "@metamask/browser-passworder>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk>@metamask/key-tree": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/scure-bip39": true, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": { + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils": { + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { "globals": { - "File": true, - "FileReader": true, "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true + "TextEncoder": true }, "packages": { - "@metamask/permission-controller": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, "@noble/hashes": true, - "chalk": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils>@metamask/snaps-registry": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>cron-parser": { + "@metamask/eth-json-rpc-middleware>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>browser-resolve": true, - "luxon": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>fast-xml-parser": { + "@metamask/eth-sig-util>@metamask/utils": { "globals": { - "entityName": true, - "val": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/snaps-utils>fast-xml-parser>strnum": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>marked": { + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { "globals": { - "console.error": true, - "console.warn": true, - "define": true - } - }, - "@metamask/snaps-utils>rfdc": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>buffer": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name": { + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/snaps-utils>validate-npm-package-name>builtins": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name>builtins": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "process": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/test-bundler>@ethersproject/networks": { + "@metamask/eth-snap-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "ethers>@ethersproject/logger": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller": { + "@metamask/keyring-api>@metamask/utils": { "globals": { - "clearTimeout": true, - "console.error": true, - "fetch": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/abi": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/network-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller>@metamask/nonce-tracker": true, - "@metamask/utils": true, - "bn.js": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "eth-method-registry": true, - "fast-json-patch": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker": { + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@ethersproject/providers": true, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true, - "browserify>assert": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "@metamask/name-controller>@metamask/utils": { "globals": { - "clearTimeout": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller": { + "@metamask/permission-log-controller>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/polling-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller": true, - "@metamask/user-operation-controller>@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "bn.js": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller>@metamask/utils": { + "@metamask/post-message-stream>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils": { + "@metamask/rate-limit-controller>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils>@scure/base": { + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, "@ngraveio/bc-ur": { "packages": { "@ngraveio/bc-ur>@keystonehq/alias-sampling": true, + "browserify>assert": true, "@ngraveio/bc-ur>bignumber.js": true, + "browserify>buffer": true, "@ngraveio/bc-ur>cbor-sync": true, "@ngraveio/bc-ur>crc": true, "@ngraveio/bc-ur>jsbi": true, - "addons-linter>sha.js": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@ngraveio/bc-ur>assert>object-is": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true + "addons-linter>sha.js": true } }, - "@ngraveio/bc-ur>bignumber.js": { + "@metamask/profile-sync-controller>@noble/ciphers": { "globals": { - "crypto": true, - "define": true + "TextDecoder": true, + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>cbor-sync": { + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": { "globals": { - "define": true + "TextEncoder": true }, "packages": { - "browserify>buffer": true + "@noble/hashes": true } }, - "@ngraveio/bc-ur>crc": { - "packages": { - "browserify>buffer": true + "@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>jsbi": { + "@metamask/scure-bip39>@noble/hashes": { "globals": { - "define": true + "TextEncoder": true, + "crypto": true } }, - "@noble/hashes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { "globals": { "TextEncoder": true, "crypto": true @@ -2877,6 +2193,20 @@ "navigator.userAgent": true } }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { + "globals": { + "console.log": true + } + }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { + "globals": { + "XMLHttpRequest": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + } + }, "@reduxjs/toolkit": { "globals": { "AbortController": true, @@ -2888,42 +2218,46 @@ "setTimeout": true }, "packages": { - "@reduxjs/toolkit>reselect": true, "immer": true, "process": true, "redux": true, - "redux-thunk": true + "redux-thunk": true, + "@reduxjs/toolkit>reselect": true } }, - "@segment/loosely-validate-event": { - "packages": { - "@segment/loosely-validate-event>component-type": true, - "@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@sentry/browser": { + "react-router-dom-v5-compat>@remix-run/router": { "globals": { - "PerformanceObserver.supportedEntryTypes": true, + "AbortController": true, + "DOMException": true, + "FormData": true, + "Headers": true, "Request": true, + "Response": true, "URL": true, - "XMLHttpRequest.prototype": true, - "__SENTRY_DEBUG__": true, - "__SENTRY_RELEASE__": true, - "addEventListener": true, - "console.error": true, - "indexedDB.open": true, - "performance.timeOrigin": true, - "setTimeout": true - }, + "URLSearchParams": true, + "console": true, + "document.defaultView": true + } + }, + "@metamask/utils>@scure/base": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + } + }, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { "packages": { - "@sentry/browser>@sentry-internal/browser-utils": true, - "@sentry/browser>@sentry-internal/feedback": true, - "@sentry/browser>@sentry-internal/replay": true, - "@sentry/browser>@sentry-internal/replay-canvas": true, - "@sentry/browser>@sentry/core": true, - "@sentry/utils": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true + } + }, + "@segment/loosely-validate-event": { + "packages": { + "browserify>assert": true, + "browserify>buffer": true, + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true } }, "@sentry/browser>@sentry-internal/browser-utils": { @@ -2962,6 +2296,25 @@ "@sentry/utils": true } }, + "@sentry/browser>@sentry-internal/replay-canvas": { + "globals": { + "Blob": true, + "HTMLCanvasElement": true, + "HTMLImageElement": true, + "ImageData": true, + "URL.createObjectURL": true, + "WeakRef": true, + "Worker": true, + "cancelAnimationFrame": true, + "console.error": true, + "createImageBitmap": true, + "document": true + }, + "packages": { + "@sentry/browser>@sentry/core": true, + "@sentry/utils": true + } + }, "@sentry/browser>@sentry-internal/replay": { "globals": { "Blob": true, @@ -3011,21 +2364,25 @@ "@sentry/utils": true } }, - "@sentry/browser>@sentry-internal/replay-canvas": { + "@sentry/browser": { "globals": { - "Blob": true, - "HTMLCanvasElement": true, - "HTMLImageElement": true, - "ImageData": true, - "URL.createObjectURL": true, - "WeakRef": true, - "Worker": true, - "cancelAnimationFrame": true, + "PerformanceObserver.supportedEntryTypes": true, + "Request": true, + "URL": true, + "XMLHttpRequest.prototype": true, + "__SENTRY_DEBUG__": true, + "__SENTRY_RELEASE__": true, + "addEventListener": true, "console.error": true, - "createImageBitmap": true, - "document": true + "indexedDB.open": true, + "performance.timeOrigin": true, + "setTimeout": true }, "packages": { + "@sentry/browser>@sentry-internal/browser-utils": true, + "@sentry/browser>@sentry-internal/feedback": true, + "@sentry/browser>@sentry-internal/replay-canvas": true, + "@sentry/browser>@sentry-internal/replay": true, "@sentry/browser>@sentry/core": true, "@sentry/utils": true } @@ -3121,20 +2478,61 @@ "btoa": true } }, - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { + "@metamask/controller-utils>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "react-markdown>unist-util-visit": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@storybook/addon-knobs>qs": { + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@swc/helpers>tslib": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + } + }, + "@metamask/profile-sync-controller>siwe>@stablelib/random": { "globals": { - "SuppressedError": true, - "define": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, + "browserify>browser-resolve": true + } + }, + "@trezor/connect-web>@trezor/connect-common": { + "globals": { + "console.warn": true, + "localStorage.getItem": true, + "localStorage.setItem": true, + "navigator": true, + "setTimeout": true, + "window": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true + } + }, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { + "packages": { + "@metamask/eth-sig-util": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web": { @@ -3161,35 +2559,20 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/connect-common": true, + "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/utils": true, - "webpack>events": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect": { "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, "@trezor/connect-web>@trezor/connect>@trezor/transport": true, - "@trezor/connect-web>@trezor/utils": true - } - }, - "@trezor/connect-web>@trezor/connect-common": { - "globals": { - "console.warn": true, - "localStorage.getItem": true, - "localStorage.setItem": true, - "navigator": true, - "setTimeout": true, - "window": true - }, - "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, - "@trezor/connect-web>@trezor/utils": true + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": { @@ -3205,54 +2588,17 @@ "screen.width": true }, "packages": { + "process": true, "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true, - "process": true - } - }, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { - "globals": { - "define": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true } }, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": { "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, - "browserify>buffer": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { - "globals": { - "process": true, - "setTimeout": true - }, - "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { - "globals": { - "console.log": true - } - }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { - "globals": { - "XMLHttpRequest": true - }, - "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + "browserify>buffer": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": { @@ -3279,16 +2625,10 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/utils>bignumber.js": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@trezor/connect-web>@trezor/utils>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@welldone-software/why-did-you-render": { @@ -3299,63 +2639,197 @@ "console.groupEnd": true, "console.log": true, "console.warn": true, - "define": true, + "define": true, + "setTimeout": true + }, + "packages": { + "lodash": true, + "react": true + } + }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, + "@zxing/library": { + "globals": { + "HTMLImageElement": true, + "HTMLVideoElement": true, + "TextDecoder": true, + "TextEncoder": true, + "URL.createObjectURL": true, + "btoa": true, + "console.log": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library>ts-custom-error": true + } + }, + "@lavamoat/lavapack>readable-stream>abort-controller": { + "globals": { + "AbortController": true + } + }, + "currency-formatter>accounting": { + "globals": { + "define": true + } + }, + "ethers>@ethersproject/json-wallets>aes-js": { + "globals": { + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>aes-js": { + "globals": { + "define": true + } + }, + "chalk>ansi-styles": { + "packages": { + "chalk>ansi-styles>color-convert": true + } + }, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { + "packages": { + "browserify>buffer": true + } + }, + "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true + } + }, + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "browserify>vm-browserify": true + } + }, + "browserify>assert": { + "globals": { + "Buffer": true + }, + "packages": { + "react>object-assign": true, + "browserify>assert>util": true + } + }, + "@metamask/name-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "string.prototype.matchall>es-abstract>available-typed-arrays": { + "packages": { + "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + } + }, + "await-semaphore": { + "packages": { + "process": true, + "browserify>timers-browserify": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { + "globals": { + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, + "console.warn": true, + "document": true, + "location.href": true, + "navigator": true, "setTimeout": true }, "packages": { - "lodash": true, - "react": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/browser": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { "globals": { - "HTMLElement": true, - "HTMLImageElement": true, - "HTMLVideoElement": true, - "clearTimeout": true, - "console.error": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/library": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { "globals": { - "HTMLImageElement": true, - "HTMLVideoElement": true, - "TextDecoder": true, - "TextEncoder": true, - "URL.createObjectURL": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, "btoa": true, - "console.log": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library>ts-custom-error": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "addons-linter>sha.js": { - "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@metamask/snaps-controllers>tar-stream>b4a": { + "globals": { + "TextDecoder": true, + "TextEncoder": true } }, - "await-semaphore": { + "@ensdomains/content-hash>multihashes>multibase>base-x": { "packages": { - "browserify>timers-browserify": true, - "process": true - } - }, - "axios>form-data": { - "globals": { - "FormData": true + "koa>content-disposition>safe-buffer": true } }, "base32-encode": { @@ -3369,6 +2843,53 @@ "define": true } }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/notification-services-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/smart-transactions-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@ngraveio/bc-ur>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@trezor/connect-web>@trezor/utils>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bitwise": { + "packages": { + "browserify>buffer": true + } + }, "blo": { "globals": { "btoa": true @@ -3382,132 +2903,147 @@ "browserify>browser-resolve": true } }, + "eth-lattice-keyring>gridplus-sdk>borc": { + "globals": { + "console": true + }, + "packages": { + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "browserify>buffer": true, + "buffer>ieee754": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + } + }, "bowser": { "globals": { "define": true } }, - "browserify>assert": { + "@metamask/ppom-validator>elliptic>brorand": { "globals": { - "Buffer": true + "crypto": true, + "msCrypto": true }, "packages": { - "browserify>assert>util": true, - "react>object-assign": true + "browserify>browser-resolve": true } }, - "browserify>assert>util": { - "globals": { - "console.error": true, - "console.log": true, - "console.trace": true, - "process": true - }, + "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { - "browserify>assert>util>inherits": true, - "process": true + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>browserify-zlib": { + "crypto-browserify>browserify-cipher": { + "packages": { + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "crypto-browserify>browserify-cipher>browserify-des": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des": { "packages": { - "browserify>assert": true, - "browserify>browserify-zlib>pako": true, "browserify>buffer": true, - "browserify>util": true, - "process": true, - "stream-browserify": true + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>browserify-des>des.js": true, + "pumpify>inherits": true } }, - "browserify>buffer": { - "globals": { - "console": true - }, + "crypto-browserify>public-encrypt>browserify-rsa": { "packages": { - "base64-js": true, - "buffer>ieee754": true + "bn.js": true, + "browserify>buffer": true, + "crypto-browserify>randombytes": true } }, - "browserify>punycode": { - "globals": { - "define": true + "crypto-browserify>browserify-sign": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>create-hmac": true, + "@metamask/ppom-validator>elliptic": true, + "pumpify>inherits": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "stream-browserify": true } }, - "browserify>string_decoder": { + "browserify>browserify-zlib": { "packages": { - "koa>content-disposition>safe-buffer": true + "browserify>assert": true, + "browserify>buffer": true, + "browserify>browserify-zlib>pako": true, + "process": true, + "stream-browserify": true, + "browserify>util": true } }, - "browserify>timers-browserify": { - "globals": { - "clearInterval": true, - "clearTimeout": true, - "setInterval": true, - "setTimeout": true - }, + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { "packages": { - "process": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true } }, - "browserify>url": { + "ethereumjs-util>ethereum-cryptography>bs58check": { "packages": { - "@storybook/addon-knobs>qs": true, - "browserify>punycode": true + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, + "ethereumjs-util>create-hash": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>util": { + "buffer": { "globals": { - "console.error": true, - "console.log": true, - "console.trace": true + "console": true }, "packages": { - "browserify>util>is-arguments": true, - "browserify>util>is-typed-array": true, - "browserify>util>which-typed-array": true, - "koa>is-generator-function": true, - "process": true, - "pumpify>inherits": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>is-arguments": { + "terser>source-map-support>buffer-from": { "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "browserify>buffer": true } }, - "browserify>util>is-typed-array": { + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { "packages": { - "browserify>util>which-typed-array": true + "browserify>buffer": true } }, - "browserify>util>which-typed-array": { + "browserify>buffer": { + "globals": { + "console": true + }, "packages": { - "browserify>util>which-typed-array>for-each": true, - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>available-typed-arrays": true, - "string.prototype.matchall>es-abstract>gopd": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>which-typed-array>for-each": { + "@metamask/snaps-utils>validate-npm-package-name>builtins": { "packages": { - "string.prototype.matchall>es-abstract>is-callable": true + "process": true, + "semver": true } }, - "browserify>vm-browserify": { - "globals": { - "document.body.appendChild": true, - "document.body.removeChild": true, - "document.createElement": true + "string.prototype.matchall>call-bind": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>call-bind>set-function-length": true } }, - "buffer": { + "@ngraveio/bc-ur>cbor-sync": { "globals": { - "console": true + "define": true }, "packages": { - "base64-js": true, - "buffer>ieee754": true + "browserify>buffer": true } }, "chalk": { @@ -3516,16 +3052,6 @@ "chalk>supports-color": true } }, - "chalk>ansi-styles": { - "packages": { - "chalk>ansi-styles>color-convert": true - } - }, - "chalk>ansi-styles>color-convert": { - "packages": { - "jest-canvas-mock>moo-color>color-name": true - } - }, "chart.js": { "globals": { "Intl.NumberFormat": true, @@ -3547,9 +3073,20 @@ "chart.js>@kurkle/color": true } }, - "chart.js>@kurkle/color": { - "globals": { - "define": true + "@ensdomains/content-hash>cids": { + "packages": { + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>cids>multihashes": true, + "@ensdomains/content-hash>cids>uint8arrays": true + } + }, + "ethereumjs-util>create-hash>cipher-base": { + "packages": { + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true, + "stream-browserify": true, + "browserify>string_decoder": true } }, "classnames": { @@ -3558,6 +3095,11 @@ "define": true } }, + "@metamask/jazzicon>color>clone": { + "packages": { + "browserify>buffer": true + } + }, "cockatiel": { "globals": { "AbortController": true, @@ -3571,6 +3113,37 @@ "process": true } }, + "chalk>ansi-styles>color-convert": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color>color-convert": { + "packages": { + "@metamask/jazzicon>color>color-convert>color-name": true + } + }, + "@metamask/jazzicon>color>color-string": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color": { + "packages": { + "@metamask/jazzicon>color>clone": true, + "@metamask/jazzicon>color>color-convert": true, + "@metamask/jazzicon>color>color-string": true + } + }, + "@metamask/snaps-controllers>concat-stream": { + "packages": { + "terser>source-map-support>buffer-from": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "readable-stream": true, + "browserify>concat-stream>typedarray": true + } + }, "copy-to-clipboard": { "globals": { "clipboardData": true, @@ -3589,10 +3162,47 @@ "copy-to-clipboard>toggle-selection": true } }, - "copy-to-clipboard>toggle-selection": { + "@ethereumjs/tx>@ethereumjs/common>crc-32": { "globals": { - "document.activeElement": true, - "document.getSelection": true + "DO_NOT_EXPORT_CRC": true, + "define": true + } + }, + "@ngraveio/bc-ur>crc": { + "packages": { + "browserify>buffer": true + } + }, + "crypto-browserify>create-ecdh": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "@metamask/ppom-validator>elliptic": true + } + }, + "ethereumjs-util>create-hash": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>md5.js": true, + "ethereumjs-util>create-hash>ripemd160": true, + "addons-linter>sha.js": true + } + }, + "crypto-browserify>create-hmac": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>create-hash": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true + } + }, + "@metamask/snaps-utils>cron-parser": { + "packages": { + "browserify>browser-resolve": true, + "luxon": true } }, "crypto-browserify": { @@ -3600,303 +3210,484 @@ "crypto-browserify>browserify-cipher": true, "crypto-browserify>browserify-sign": true, "crypto-browserify>create-ecdh": true, + "ethereumjs-util>create-hash": true, "crypto-browserify>create-hmac": true, "crypto-browserify>diffie-hellman": true, "crypto-browserify>pbkdf2": true, "crypto-browserify>public-encrypt": true, "crypto-browserify>randombytes": true, - "crypto-browserify>randomfill": true, - "ethereumjs-util>create-hash": true + "crypto-browserify>randomfill": true } }, - "crypto-browserify>browserify-cipher": { + "@metamask/ppom-validator>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, "packages": { - "crypto-browserify>browserify-cipher>browserify-des": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "browserify>browser-resolve": true } }, - "crypto-browserify>browserify-cipher>browserify-des": { + "react-beautiful-dnd>css-box-model": { + "globals": { + "getComputedStyle": true, + "pageXOffset": true, + "pageYOffset": true + }, "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>browserify-des>des.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "pumpify>inherits": true + "react-router-dom>tiny-invariant": true } }, - "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { + "globals": { + "document.createElement": true, + "document.documentElement": true, + "getComputedStyle": true + }, "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true } }, - "crypto-browserify>browserify-cipher>evp_bytestokey": { + "currency-formatter": { "packages": { - "ethereumjs-util>create-hash>md5.js": true, - "koa>content-disposition>safe-buffer": true + "currency-formatter>accounting": true, + "currency-formatter>locale-currency": true, + "react>object-assign": true } }, - "crypto-browserify>browserify-sign": { + "debounce-stream": { + "packages": { + "debounce-stream>debounce": true, + "debounce-stream>duplexer": true, + "debounce-stream>through": true + } + }, + "debounce-stream>debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true + } + }, + "nock>debug": { + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, + "packages": { + "nock>debug>ms": true, + "process": true + } + }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, + "string.prototype.matchall>call-bind": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, + "string.prototype.matchall>get-intrinsic": true, + "browserify>util>is-arguments": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "string.prototype.matchall>es-abstract>is-regex": true, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "@ngraveio/bc-ur>assert>object-is": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true, + "gulp>vinyl-fs>object.assign": true, + "string.prototype.matchall>regexp.prototype.flags": true, + "string.prototype.matchall>side-channel": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, + "@metamask/eth-token-tracker>deep-equal>which-collection": true, + "browserify>util>which-typed-array": true + } + }, + "string.prototype.matchall>define-properties>define-data-property": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>gopd": true + } + }, + "string.prototype.matchall>define-properties": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "crypto-browserify>diffie-hellman": { "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "ethereumjs-util>create-hash": true, - "pumpify>inherits": true, + "crypto-browserify>diffie-hellman>miller-rabin": true, + "crypto-browserify>randombytes": true + } + }, + "@material-ui/core>react-transition-group>dom-helpers": { + "packages": { + "@babel/runtime": true + } + }, + "debounce-stream>duplexer": { + "packages": { "stream-browserify": true } }, - "crypto-browserify>create-ecdh": { + "ethers>@ethersproject/signing-key>elliptic": { "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, - "browserify>buffer": true + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>create-hmac": { + "@metamask/ppom-validator>elliptic": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true + } + }, + "eth-lattice-keyring>gridplus-sdk>elliptic": { + "packages": { + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>diffie-hellman": { + "string.prototype.matchall>call-bind>es-define-property": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify>diffie-hellman>miller-rabin": true, - "crypto-browserify>randombytes": true + "string.prototype.matchall>get-intrinsic": true } }, - "crypto-browserify>diffie-hellman>miller-rabin": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "bn.js": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>has-symbols": true, + "browserify>util>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "eslint-plugin-react>array-includes>is-string": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "process": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true } }, - "crypto-browserify>pbkdf2": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { "globals": { - "crypto": true, - "process": true, - "queueMicrotask": true, - "setImmediate": true, - "setTimeout": true + "intToBuffer": true }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "bn.js": true, + "buffer": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>public-encrypt": { + "eth-ens-namehash": { + "globals": { + "name": "write" + }, "packages": { - "bn.js": true, "browserify>buffer": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>create-hash": true + "eth-ens-namehash>idna-uts46-hx": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>public-encrypt>browserify-rsa": { + "eth-lattice-keyring": { + "globals": { + "addEventListener": true, + "browser": true, + "clearInterval": true, + "fetch": true, + "open": true, + "setInterval": true + }, "packages": { + "eth-lattice-keyring>@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, "bn.js": true, "browserify>buffer": true, - "crypto-browserify>randombytes": true + "crypto-browserify": true, + "webpack>events": true, + "eth-lattice-keyring>gridplus-sdk": true, + "eth-lattice-keyring>rlp": true } }, - "crypto-browserify>public-encrypt>parse-asn1": { + "eth-method-registry": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "crypto-browserify>pbkdf2": true, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true } }, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "@ethereumjs/tx>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "bn.js": true, - "browserify>buffer": true, - "browserify>vm-browserify": true, - "pumpify>inherits": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true } }, - "crypto-browserify>randombytes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "msCrypto": true + "TextDecoder": true, + "crypto": true }, "packages": { - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "crypto-browserify>randomfill": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "msCrypto": true + "TextDecoder": true, + "crypto": true }, "packages": { - "crypto-browserify>randombytes": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "currency-formatter": { + "ethereumjs-util>ethereum-cryptography": { "packages": { - "currency-formatter>accounting": true, - "currency-formatter>locale-currency": true, - "react>object-assign": true - } - }, - "currency-formatter>accounting": { - "globals": { - "define": true + "browserify>buffer": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "ganache>secp256k1": true } }, - "currency-formatter>locale-currency": { - "globals": { - "countryCode": true + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify>create-hmac": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true } }, - "debounce-stream": { + "ethereumjs-util": { "packages": { - "debounce-stream>debounce": true, - "debounce-stream>duplexer": true, - "debounce-stream>through": true + "browserify>assert": true, + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util>rlp": true } }, - "debounce-stream>debounce": { - "globals": { - "clearTimeout": true, - "setTimeout": true + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "packages": { + "browserify>assert": true, + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true } }, - "debounce-stream>duplexer": { + "@metamask/keyring-controller>ethereumjs-wallet": { "packages": { - "stream-browserify": true + "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, + "crypto-browserify>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, + "uuid": true } }, - "debounce-stream>through": { + "ethers": { "packages": { - "process": true, - "stream-browserify": true + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "ethers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "depcheck>@vue/compiler-sfc>postcss>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { + "packages": { + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "depcheck>is-core-module>hasown": { + "@metamask/ethjs>ethjs-abi": { "packages": { - "browserify>has>function-bind": true + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>js-sha3": true, + "@metamask/ethjs>ethjs-abi>number-to-bn": true } }, - "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "webpack>events": { "globals": { - "crypto.getRandomValues": true + "console": true } }, - "eslint-plugin-react>array-includes>is-string": { + "crypto-browserify>browserify-cipher>evp_bytestokey": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "ethereumjs-util>create-hash>md5.js": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-ens-namehash": { - "globals": { - "name": "write" - }, + "extension-port-stream": { "packages": { - "@metamask/ethjs>js-sha3": true, "browserify>buffer": true, - "eth-ens-namehash>idna-uts46-hx": true + "extension-port-stream>readable-stream": true + } + }, + "fast-json-patch": { + "globals": { + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true } }, - "eth-ens-namehash>idna-uts46-hx": { + "@metamask/snaps-utils>fast-xml-parser": { "globals": { - "define": true + "entityName": true, + "val": true }, "packages": { - "browserify>punycode": true + "@metamask/snaps-utils>fast-xml-parser>strnum": true } }, - "eth-keyring-controller>@metamask/browser-passworder": { - "globals": { - "crypto": true + "@metamask/notification-services-controller>firebase": { + "packages": { + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/messaging": true } }, - "eth-lattice-keyring": { + "react-focus-lock>focus-lock": { "globals": { - "addEventListener": true, - "browser": true, - "clearInterval": true, - "fetch": true, - "open": true, - "setInterval": true + "HTMLIFrameElement": true, + "Node.DOCUMENT_FRAGMENT_NODE": true, + "Node.DOCUMENT_NODE": true, + "Node.DOCUMENT_POSITION_CONTAINED_BY": true, + "Node.DOCUMENT_POSITION_CONTAINS": true, + "Node.ELEMENT_NODE": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify": true, - "eth-lattice-keyring>@ethereumjs/tx": true, - "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "webpack>events": true + "@swc/helpers>tslib": true } }, - "eth-lattice-keyring>@ethereumjs/tx": { + "browserify>util>which-typed-array>for-each": { "packages": { - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>es-abstract>is-callable": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { - "packages": { - "browserify": true, - "browserify>buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true + "axios>form-data": { + "globals": { + "FormData": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { + "fuse.js": { "globals": { - "WeakRef": true - }, - "packages": { - "browserify": true + "console": true, + "define": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { + "string.prototype.matchall>get-intrinsic": { "globals": { - "TextDecoder": true, - "crypto": true + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true }, "packages": { - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>es-abstract>has-proto": true, + "string.prototype.matchall>has-symbols": true, + "depcheck>is-core-module>hasown": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true + "string.prototype.matchall>es-abstract>gopd": { + "packages": { + "string.prototype.matchall>get-intrinsic": true } }, "eth-lattice-keyring>gridplus-sdk": { @@ -3914,230 +3705,307 @@ "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethersproject/abi": true, - "@metamask/ethjs>js-sha3": true, - "@metamask/keyring-api>bech32": true, - "bn.js": true, - "browserify>buffer": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, + "@ethersproject/abi": true, "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "@metamask/keyring-api>bech32": true, "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, "eth-lattice-keyring>gridplus-sdk>bitwise": true, + "bn.js": true, "eth-lattice-keyring>gridplus-sdk>borc": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, "eth-lattice-keyring>gridplus-sdk>elliptic": true, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, - "eth-lattice-keyring>gridplus-sdk>uuid": true, - "eth-lattice-keyring>rlp": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ethjs>js-sha3": true, + "lodash": true, + "eth-lattice-keyring>rlp": true, "ganache>secp256k1": true, - "lodash": true + "eth-lattice-keyring>gridplus-sdk>uuid": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { + "string.prototype.matchall>es-abstract>has-property-descriptors": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "string.prototype.matchall>call-bind>es-define-property": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { + "koa>is-generator-function>has-tostringtag": { "packages": { - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>has-symbols": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "ethereumjs-util>create-hash>md5.js>hash-base": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "pumpify>inherits": true, + "readable-stream": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { + "ethers>@ethersproject/sha2>hash.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "depcheck>is-core-module>hasown": { + "packages": { + "browserify>has>function-bind": true + } + }, + "@metamask/eth-trezor-keyring>hdkey": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "crypto-browserify": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true + } + }, + "he": { "globals": { - "TextDecoder": true, - "crypto": true + "define": true + } + }, + "history": { + "globals": { + "console": true, + "define": true, + "document.defaultView": true, + "document.querySelector": true + } + }, + "react-router-dom>history": { + "globals": { + "addEventListener": true, + "confirm": true, + "document": true, + "history": true, + "location": true, + "navigator.userAgent": true, + "removeEventListener": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "react-router-dom>history>resolve-pathname": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true, + "react-router-dom>history>value-equal": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "@metamask/ppom-validator>elliptic>hmac-drbg": { + "packages": { + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true + } + }, + "react-redux>hoist-non-react-statics": { + "packages": { + "prop-types>react-is": true + } + }, + "https-browserify": { + "packages": { + "stream-http": true, + "browserify>url": true + } + }, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": { "globals": { - "TextEncoder": true, - "crypto": true + "DOMException": true, + "IDBCursor": true, + "IDBDatabase": true, + "IDBIndex": true, + "IDBObjectStore": true, + "IDBRequest": true, + "IDBTransaction": true, + "indexedDB.deleteDatabase": true, + "indexedDB.open": true } }, - "eth-lattice-keyring>gridplus-sdk>aes-js": { + "eth-ens-namehash>idna-uts46-hx": { "globals": { "define": true + }, + "packages": { + "browserify>punycode": true } }, - "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "string.prototype.matchall>internal-slot": { + "packages": { + "string.prototype.matchall>call-bind>es-errors": true, + "depcheck>is-core-module>hasown": true, + "string.prototype.matchall>side-channel": true + } + }, + "browserify>util>is-arguments": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "string.prototype.matchall>es-abstract>is-array-buffer": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { + "packages": { + "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "string.prototype.matchall>es-abstract>is-callable": { "globals": { - "crypto": true, - "define": true + "document": true } }, - "eth-lattice-keyring>gridplus-sdk>bitwise": { + "@metamask/eth-token-tracker>deep-equal>is-date-object": { "packages": { - "browserify>buffer": true + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc": { - "globals": { - "console": true - }, + "koa>is-generator-function": { "packages": { - "browserify>buffer": true, - "buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "@material-ui/core>@material-ui/styles>jss>is-in-browser": { "globals": { - "crypto": true, - "define": true + "document": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { - "globals": { - "URL": true, - "URLSearchParams": true, - "location": true + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>elliptic": { + "string.prototype.matchall>es-abstract>is-regex": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { - "globals": { - "intToBuffer": true - }, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": { "packages": { - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "buffer": true + "string.prototype.matchall>call-bind": true } }, - "eth-lattice-keyring>gridplus-sdk>uuid": { - "globals": { - "crypto": true + "eslint-plugin-react>array-includes>is-string": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>rlp": { - "globals": { - "TextEncoder": true + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "packages": { + "string.prototype.matchall>has-symbols": true } }, - "eth-method-registry": { + "browserify>util>is-typed-array": { "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true + "browserify>util>which-typed-array": true } }, - "ethereumjs-util": { + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { "packages": { - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true } }, - "ethereumjs-util>create-hash": { + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { + "globals": { + "URL": true, + "URLSearchParams": true, + "location": true + } + }, + "@ensdomains/content-hash>js-base64": { + "globals": { + "Base64": "write", + "TextDecoder": true, + "TextEncoder": true, + "atob": true, + "btoa": true, + "define": true + }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>md5.js": true, - "ethereumjs-util>create-hash>ripemd160": true, - "pumpify>inherits": true + "browserify>buffer": true } }, - "ethereumjs-util>create-hash>cipher-base": { + "@metamask/ethjs>js-sha3": { + "globals": { + "define": true + }, "packages": { - "browserify>string_decoder": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "stream-browserify": true + "process": true } }, - "ethereumjs-util>create-hash>md5.js": { + "@ngraveio/bc-ur>jsbi": { + "globals": { + "define": true + } + }, + "@metamask/message-manager>jsonschema": { "packages": { - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "browserify>url": true } }, - "ethereumjs-util>create-hash>md5.js>hash-base": { + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "readable-stream": true + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true } }, - "ethereumjs-util>create-hash>ripemd160": { + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { + "globals": { + "CSS": true + }, "packages": { - "browserify>buffer": true, - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "pumpify>inherits": true + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography": { + "@material-ui/core>@material-ui/styles>jss-plugin-global": { "packages": { - "browserify>buffer": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ganache>secp256k1": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes": { + "@material-ui/core>@material-ui/styles>jss-plugin-nested": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@babel/runtime": true, + "react-router-dom>tiny-warning": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { "packages": { - "browserify>buffer": true + "@material-ui/core>@material-ui/styles>jss": true, + "react-router-dom>tiny-warning": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { "packages": { - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, - "koa>content-disposition>safe-buffer": true + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { + "@material-ui/core>@material-ui/styles>jss": { + "globals": { + "CSS": true, + "document.createElement": true, + "document.querySelector": true + }, "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, + "react-router-dom>tiny-warning": true } }, "ethereumjs-util>ethereum-cryptography>keccak": { @@ -4146,538 +4014,496 @@ "readable-stream": true } }, - "ethereumjs-util>rlp": { - "packages": { - "bn.js": true, - "browserify>buffer": true - } - }, - "ethereumjs-wallet>randombytes": { + "currency-formatter>locale-currency": { "globals": { - "crypto.getRandomValues": true + "countryCode": true } }, - "ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/web": true, - "ethers>@ethersproject/wordlists": true + "localforage": { + "globals": { + "Blob": true, + "BlobBuilder": true, + "FileReader": true, + "IDBKeyRange": true, + "MSBlobBuilder": true, + "MozBlobBuilder": true, + "OIndexedDB": true, + "WebKitBlobBuilder": true, + "atob": true, + "btoa": true, + "console.error": true, + "console.info": true, + "console.warn": true, + "define": true, + "fetch": true, + "indexedDB": true, + "localStorage": true, + "mozIndexedDB": true, + "msIndexedDB": true, + "navigator.platform": true, + "navigator.userAgent": true, + "openDatabase": true, + "setTimeout": true, + "webkitIndexedDB": true } }, - "ethers>@ethersproject/abstract-provider": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "lodash": { + "globals": { + "clearTimeout": true, + "define": true, + "setTimeout": true } }, - "ethers>@ethersproject/abstract-signer": { - "packages": { - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "loglevel": { + "globals": { + "console": true, + "define": true, + "document.cookie": true, + "localStorage": true, + "log": "write", + "navigator": true } }, - "ethers>@ethersproject/address": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "lottie-web": { + "globals": { + "Blob": true, + "Howl": true, + "OffscreenCanvas": true, + "URL.createObjectURL": true, + "Worker": true, + "XMLHttpRequest": true, + "bodymovin": "write", + "clearInterval": true, + "console": true, + "define": true, + "document.body": true, + "document.createElement": true, + "document.createElementNS": true, + "document.getElementsByClassName": true, + "document.getElementsByTagName": true, + "document.querySelectorAll": true, + "document.readyState": true, + "location.origin": true, + "location.pathname": true, + "navigator": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true } }, - "ethers>@ethersproject/base64": { + "luxon": { "globals": { - "atob": true, - "btoa": true - }, - "packages": { - "@ethersproject/bytes": true + "Intl": true } }, - "ethers>@ethersproject/basex": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/properties": true + "@metamask/snaps-utils>marked": { + "globals": { + "console.error": true, + "console.warn": true, + "define": true } }, - "ethers>@ethersproject/constants": { + "ethereumjs-util>create-hash>md5.js": { "packages": { - "@ethersproject/bignumber": true + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "ethers>@ethersproject/json-wallets": { + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hdnode": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { - "globals": { - "define": true + "react-markdown>remark-parse>mdast-util-from-markdown": { + "packages": { + "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, + "react-syntax-highlighter>refractor>parse-entities": true, + "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { + "react-markdown>remark-rehype>mdast-util-to-hast": { "globals": { - "define": true, - "setTimeout": true + "console.warn": true }, "packages": { - "browserify>timers-browserify": true - } - }, - "ethers>@ethersproject/keccak256": { - "packages": { - "@ethersproject/bytes": true, - "@metamask/ethjs>js-sha3": true + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, + "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/logger": { + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { "globals": { - "console": true + "Headers": true, + "TextDecoder": true, + "URL": true, + "btoa": true, + "fetch": true + }, + "packages": { + "browserify>browserify-zlib": true, + "browserify>buffer": true, + "https-browserify": true, + "process": true, + "stream-http": true, + "browserify>url": true, + "browserify>util": true } }, - "ethers>@ethersproject/pbkdf2": { + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "react-syntax-highlighter>refractor>parse-entities": true } }, - "ethers>@ethersproject/properties": { + "crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "ethers>@ethersproject/logger": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true } }, - "ethers>@ethersproject/providers": { + "@ensdomains/content-hash>cids>multibase": { "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>@ethersproject/networks": true, - "ethers>@ethersproject/providers>@ethersproject/web": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true } }, - "ethers>@ethersproject/providers>@ethersproject/networks": { + "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true, + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, + "@ensdomains/content-hash>multicodec": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "@ensdomains/content-hash>multicodec>uint8arrays": true, + "sass-embedded>varint": true } }, - "ethers>@ethersproject/random": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "console.warn": true, + "crypto.subtle.digest": true } }, - "ethers>@ethersproject/rlp": { + "@ensdomains/content-hash>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/sha2": { + "@ensdomains/content-hash>cids>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>cids>multihashes>varint": true } }, - "ethers>@ethersproject/sha2>hash.js": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/signing-key": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/signing-key>elliptic": true + "@metamask/approval-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/signing-key>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/solidity": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "@metamask/notification-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/strings": { - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "@metamask/permission-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/transactions": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/rpc-methods-flask>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/units": { - "packages": { - "@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "@metamask/snaps-controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/web": { + "@metamask/snaps-controllers-flask>nanoid": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/wordlists": { - "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "depcheck>@vue/compiler-sfc>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream": { - "packages": { - "browserify>buffer": true, - "extension-port-stream>readable-stream": true + "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream>readable-stream": { + "node-fetch": { "globals": { - "AbortController": true, - "AggregateError": true, - "Blob": true - }, - "packages": { - "browserify>buffer": true, - "browserify>string_decoder": true, - "extension-port-stream>readable-stream>abort-controller": true, - "process": true, - "webpack>events": true + "Headers": true, + "Request": true, + "Response": true, + "fetch": true } }, - "extension-port-stream>readable-stream>abort-controller": { + "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { "globals": { - "AbortController": true + "fetch": true } }, - "fast-json-patch": { + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { "globals": { - "addEventListener": true, - "clearTimeout": true, - "removeEventListener": true, - "setTimeout": true + "fetch": true } }, - "fuse.js": { + "@metamask/ethjs>ethjs-abi>number-to-bn": { + "packages": { + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true + } + }, + "string.prototype.matchall>es-abstract>object-inspect": { "globals": { - "console": true, - "define": true + "HTMLElement": true, + "WeakRef": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "ganache>secp256k1": { + "@ngraveio/bc-ur>assert>object-is": { "packages": { - "@metamask/ppom-validator>elliptic": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true } }, "gulp>vinyl-fs>object.assign": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, "string.prototype.matchall>call-bind": true, "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>has-symbols": true + "string.prototype.matchall>has-symbols": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "he": { - "globals": { - "define": true + "@metamask/object-multiplex>once": { + "packages": { + "@metamask/object-multiplex>once>wrappy": true } }, - "history": { - "globals": { - "console": true, - "define": true, - "document.defaultView": true, - "document.querySelector": true + "crypto-browserify>public-encrypt>parse-asn1": { + "packages": { + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "browserify>buffer": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "crypto-browserify>pbkdf2": true } }, - "https-browserify": { - "packages": { - "browserify>url": true, - "stream-http": true + "react-syntax-highlighter>refractor>parse-entities": { + "globals": { + "document.createElement": true } }, - "koa>content-disposition>safe-buffer": { + "path-browserify": { "packages": { - "browserify>buffer": true + "process": true } }, - "koa>is-generator-function": { + "serve-handler>path-to-regexp": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "serve-handler>path-to-regexp>isarray": true } }, - "koa>is-generator-function>has-tostringtag": { + "crypto-browserify>pbkdf2": { + "globals": { + "crypto": true, + "process": true, + "queueMicrotask": true, + "setImmediate": true, + "setTimeout": true + }, "packages": { - "string.prototype.matchall>has-symbols": true + "ethereumjs-util>create-hash": true, + "process": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true } }, - "localforage": { + "@material-ui/core>popper.js": { "globals": { - "Blob": true, - "BlobBuilder": true, - "FileReader": true, - "IDBKeyRange": true, - "MSBlobBuilder": true, - "MozBlobBuilder": true, - "OIndexedDB": true, - "WebKitBlobBuilder": true, - "atob": true, - "btoa": true, - "console.error": true, - "console.info": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, "console.warn": true, "define": true, - "fetch": true, - "indexedDB": true, - "localStorage": true, - "mozIndexedDB": true, - "msIndexedDB": true, - "navigator.platform": true, - "navigator.userAgent": true, - "openDatabase": true, - "setTimeout": true, - "webkitIndexedDB": true + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator": true, + "requestAnimationFrame": true, + "setTimeout": true } }, - "lodash": { + "react-tippy>popper.js": { "globals": { - "clearTimeout": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, + "console.warn": true, "define": true, + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.userAgent": true, + "requestAnimationFrame": true, "setTimeout": true } }, - "loglevel": { + "process": { "globals": { - "console": true, - "define": true, - "document.cookie": true, - "localStorage": true, - "log": "write", - "navigator": true + "clearTimeout": true, + "setTimeout": true } }, - "lottie-web": { - "globals": { - "Blob": true, - "Howl": true, - "OffscreenCanvas": true, - "URL.createObjectURL": true, - "Worker": true, - "XMLHttpRequest": true, - "bodymovin": "write", - "clearInterval": true, - "console": true, - "define": true, - "document.body": true, - "document.createElement": true, - "document.createElementNS": true, - "document.getElementsByClassName": true, - "document.getElementsByTagName": true, - "document.querySelectorAll": true, - "document.readyState": true, - "location.origin": true, - "location.pathname": true, - "navigator": true, - "requestAnimationFrame": true, - "setInterval": true, - "setTimeout": true + "promise-to-callback": { + "packages": { + "promise-to-callback>is-fn": true, + "promise-to-callback>set-immediate-shim": true } }, - "luxon": { + "prop-types": { "globals": { - "Intl": true + "console": true + }, + "packages": { + "react>object-assign": true, + "prop-types>react-is": true } }, - "nanoid": { - "globals": { - "crypto": true, - "msCrypto": true, - "navigator": true + "react-markdown>property-information": { + "packages": { + "watchify>xtend": true } }, - "nock>debug": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "process": true, + "setTimeout": true }, "packages": { - "nock>debug>ms": true, - "process": true + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true + } + }, + "crypto-browserify>public-encrypt": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "crypto-browserify>randombytes": true } }, - "node-fetch": { + "browserify>punycode": { "globals": { - "Headers": true, - "Request": true, - "Response": true, - "fetch": true + "define": true } }, - "path-browserify": { - "packages": { - "process": true + "qrcode-generator": { + "globals": { + "define": true } }, - "process": { + "qrcode.react": { "globals": { - "clearTimeout": true, - "setTimeout": true + "Path2D": true, + "devicePixelRatio": true + }, + "packages": { + "react": true } }, - "promise-to-callback": { + "@storybook/addon-knobs>qs": { "packages": { - "promise-to-callback>is-fn": true, - "promise-to-callback>set-immediate-shim": true + "string.prototype.matchall>side-channel": true } }, - "promise-to-callback>set-immediate-shim": { + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { "globals": { - "setTimeout.apply": true - }, - "packages": { - "browserify>timers-browserify": true + "queueMicrotask": true } }, - "prop-types": { + "react-beautiful-dnd>raf-schd": { "globals": { - "console": true - }, - "packages": { - "prop-types>react-is": true, - "react>object-assign": true + "cancelAnimationFrame": true, + "requestAnimationFrame": true } }, - "prop-types>react-is": { + "crypto-browserify>randombytes": { "globals": { - "console": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "process": true, + "koa>content-disposition>safe-buffer": true } }, - "qrcode-generator": { + "ethereumjs-wallet>randombytes": { "globals": { - "define": true + "crypto.getRandomValues": true } }, - "qrcode.react": { + "crypto-browserify>randomfill": { "globals": { - "Path2D": true, - "devicePixelRatio": true + "crypto": true, + "msCrypto": true }, "packages": { - "react": true + "process": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true } }, "react": { @@ -4685,8 +4511,8 @@ "console": true }, "packages": { - "prop-types": true, - "react>object-assign": true + "react>object-assign": true, + "prop-types": true } }, "react-beautiful-dnd": { @@ -4708,43 +4534,28 @@ }, "packages": { "@babel/runtime": true, - "react": true, "react-beautiful-dnd>css-box-model": true, "react-beautiful-dnd>memoize-one": true, "react-beautiful-dnd>raf-schd": true, - "react-beautiful-dnd>use-memo-one": true, + "react": true, "react-dom": true, "react-redux": true, - "redux": true + "redux": true, + "react-beautiful-dnd>use-memo-one": true } }, - "react-beautiful-dnd>css-box-model": { + "react-chartjs-2": { "globals": { - "getComputedStyle": true, - "pageXOffset": true, - "pageYOffset": true + "setTimeout": true }, "packages": { - "react-router-dom>tiny-invariant": true - } - }, - "react-beautiful-dnd>raf-schd": { - "globals": { - "cancelAnimationFrame": true, - "requestAnimationFrame": true - } - }, - "react-beautiful-dnd>use-memo-one": { - "packages": { + "chart.js": true, "react": true } }, - "react-chartjs-2": { - "globals": { - "setTimeout": true - }, + "react-focus-lock>react-clientside-effect": { "packages": { - "chart.js": true, + "@babel/runtime": true, "react": true } }, @@ -4789,22 +4600,28 @@ "trustedTypes": true }, "packages": { + "react>object-assign": true, "prop-types": true, "react": true, - "react-dom>scheduler": true, - "react>object-assign": true + "react-dom>scheduler": true } }, - "react-dom>scheduler": { + "react-responsive-carousel>react-easy-swipe": { "globals": { - "MessageChannel": true, - "cancelAnimationFrame": true, - "clearTimeout": true, - "console": true, - "navigator": true, - "performance": true, - "requestAnimationFrame": true, - "setTimeout": true + "addEventListener": true, + "define": true, + "document.addEventListener": true, + "document.removeEventListener": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-popper>react-fast-compare": { + "globals": { + "Element": true, + "console.warn": true } }, "react-focus-lock": { @@ -4818,660 +4635,726 @@ }, "packages": { "@babel/runtime": true, + "react-focus-lock>focus-lock": true, "prop-types": true, "react": true, - "react-focus-lock>focus-lock": true, "react-focus-lock>react-clientside-effect": true, "react-focus-lock>use-callback-ref": true, "react-focus-lock>use-sidecar": true } }, - "react-focus-lock>focus-lock": { + "react-idle-timer": { "globals": { - "HTMLIFrameElement": true, - "Node.DOCUMENT_FRAGMENT_NODE": true, - "Node.DOCUMENT_NODE": true, - "Node.DOCUMENT_POSITION_CONTAINED_BY": true, - "Node.DOCUMENT_POSITION_CONTAINS": true, - "Node.ELEMENT_NODE": true, - "console.error": true, + "clearTimeout": true, + "document": true, + "setTimeout": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-inspector": { + "globals": { + "Node": true, + "chromeDark": true, + "chromeLight": true + }, + "packages": { + "react": true + } + }, + "prop-types>react-is": { + "globals": { + "console": true + } + }, + "react-markdown>react-is": { + "globals": { + "console": true + } + }, + "react-redux>react-is": { + "globals": { + "console": true + } + }, + "react-markdown": { + "globals": { + "console.warn": true + }, + "packages": { + "react-markdown>comma-separated-tokens": true, + "prop-types": true, + "react-markdown>property-information": true, + "react": true, + "react-markdown>react-is": true, + "react-markdown>remark-parse": true, + "react-markdown>remark-rehype": true, + "react-markdown>space-separated-tokens": true, + "react-markdown>style-to-object": true, + "react-markdown>unified": true, + "react-markdown>unist-util-visit": true, + "react-markdown>vfile": true + } + }, + "react-popper": { + "globals": { + "document": true + }, + "packages": { + "@popperjs/core": true, + "react": true, + "react-popper>react-fast-compare": true, + "react-popper>warning": true + } + }, + "react-redux": { + "globals": { + "console": true, + "document": true + }, + "packages": { + "@babel/runtime": true, + "react-redux>hoist-non-react-statics": true, + "prop-types": true, + "react": true, + "react-dom": true, + "react-redux>react-is": true + } + }, + "react-responsive-carousel": { + "globals": { + "HTMLElement": true, + "addEventListener": true, + "clearTimeout": true, "console.warn": true, "document": true, "getComputedStyle": true, + "removeEventListener": true, + "setTimeout": true + }, + "packages": { + "classnames": true, + "react": true, + "react-dom": true, + "react-responsive-carousel>react-easy-swipe": true + } + }, + "react-router-dom": { + "packages": { + "react-router-dom>history": true, + "prop-types": true, + "react": true, + "react-router-dom>react-router": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true + } + }, + "react-router-dom-v5-compat": { + "globals": { + "FormData": true, + "URL": true, + "URLSearchParams": true, + "__reactRouterVersion": "write", + "addEventListener": true, + "confirm": true, + "define": true, + "document": true, + "history.scrollRestoration": true, + "location.href": true, + "removeEventListener": true, + "scrollTo": true, + "scrollY": true, + "sessionStorage.getItem": true, + "sessionStorage.setItem": true, "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true + "react-router-dom-v5-compat>@remix-run/router": true, + "history": true, + "react": true, + "react-dom": true, + "react-router-dom": true, + "react-router-dom-v5-compat>react-router": true } }, - "react-focus-lock>react-clientside-effect": { + "react-router-dom>react-router": { "packages": { - "@babel/runtime": true, - "react": true + "react-router-dom>history": true, + "react-redux>hoist-non-react-statics": true, + "serve-handler>path-to-regexp": true, + "prop-types": true, + "react": true, + "prop-types>react-is": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true } }, - "react-focus-lock>use-callback-ref": { + "react-router-dom-v5-compat>react-router": { + "globals": { + "console.error": true, + "define": true + }, "packages": { + "react-router-dom-v5-compat>@remix-run/router": true, "react": true } }, - "react-focus-lock>use-sidecar": { + "react-simple-file-input": { "globals": { - "console.error": true + "File": true, + "FileReader": true, + "console.warn": true }, "packages": { - "@swc/helpers>tslib": true, - "react": true, - "react-focus-lock>use-sidecar>detect-node-es": true + "prop-types": true, + "react": true } }, - "react-idle-timer": { + "react-tippy": { "globals": { + "Element": true, + "MSStream": true, + "MutationObserver": true, + "addEventListener": true, "clearTimeout": true, + "console.error": true, + "console.warn": true, + "define": true, "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.maxTouchPoints": true, + "navigator.msMaxTouchPoints": true, + "navigator.userAgent": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "react-tippy>popper.js": true, + "react": true, + "react-dom": true } }, - "react-inspector": { + "react-toggle-button": { "globals": { - "Node": true, - "chromeDark": true, - "chromeLight": true + "clearTimeout": true, + "console.warn": true, + "define": true, + "performance": true, + "setTimeout": true }, "packages": { "react": true } }, - "react-markdown": { + "@material-ui/core>react-transition-group": { "globals": { - "console.warn": true + "Element": true, + "setTimeout": true }, "packages": { + "@material-ui/core>react-transition-group>dom-helpers": true, "prop-types": true, "react": true, - "react-markdown>comma-separated-tokens": true, - "react-markdown>property-information": true, - "react-markdown>react-is": true, - "react-markdown>remark-parse": true, - "react-markdown>remark-rehype": true, - "react-markdown>space-separated-tokens": true, - "react-markdown>style-to-object": true, - "react-markdown>unified": true, - "react-markdown>unist-util-visit": true, - "react-markdown>vfile": true + "react-dom": true } }, - "react-markdown>property-information": { + "readable-stream": { "packages": { - "watchify>xtend": true + "browserify>browser-resolve": true, + "browserify>buffer": true, + "webpack>events": true, + "pumpify>inherits": true, + "process": true, + "browserify>string_decoder": true, + "readable-stream>util-deprecate": true } }, - "react-markdown>react-is": { + "extension-port-stream>readable-stream": { "globals": { - "console": true - } - }, - "react-markdown>remark-parse": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, - "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true, - "react-syntax-highlighter>refractor>parse-entities": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "ERR_INVALID_ARG_TYPE": true, + "queueMicrotask": true + }, "packages": { - "react-syntax-highlighter>refractor>parse-entities": true + "@lavamoat/lavapack>readable-stream>abort-controller": true, + "browserify>buffer": true, + "webpack>events": true, + "process": true, + "browserify>string_decoder": true } }, - "react-markdown>remark-rehype": { + "@metamask/snaps-controllers>readable-web-to-node-stream": { "packages": { - "react-markdown>remark-rehype>mdast-util-to-hast": true + "readable-stream": true } }, - "react-markdown>remark-rehype>mdast-util-to-hast": { + "redux": { "globals": { - "console.warn": true + "console": true }, "packages": { - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, - "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, - "react-markdown>unist-util-visit": true + "@babel/runtime": true } }, - "react-markdown>style-to-object": { + "string.prototype.matchall>regexp.prototype.flags": { "packages": { - "react-markdown>style-to-object>inline-style-parser": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": true } }, - "react-markdown>unified": { + "react-markdown>remark-parse": { "packages": { - "mocha>yargs-unparser>is-plain-obj": true, - "react-markdown>unified>bail": true, - "react-markdown>unified>extend": true, - "react-markdown>unified>is-buffer": true, - "react-markdown>unified>trough": true, - "react-markdown>vfile": true + "react-markdown>remark-parse>mdast-util-from-markdown": true } }, - "react-markdown>unist-util-visit": { + "react-markdown>remark-rehype": { "packages": { - "react-markdown>unist-util-visit>unist-util-visit-parents": true + "react-markdown>remark-rehype>mdast-util-to-hast": true } }, - "react-markdown>unist-util-visit>unist-util-visit-parents": { + "react-markdown>vfile>replace-ext": { "packages": { - "react-markdown>unist-util-visit>unist-util-is": true + "path-browserify": true } }, - "react-markdown>vfile": { - "packages": { - "path-browserify": true, - "process": true, - "react-markdown>vfile>is-buffer": true, - "react-markdown>vfile>replace-ext": true, - "react-markdown>vfile>vfile-message": true + "reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true } }, - "react-markdown>vfile>replace-ext": { + "@metamask/snaps-utils>rfdc": { "packages": { - "path-browserify": true + "browserify>buffer": true } }, - "react-markdown>vfile>vfile-message": { + "ethereumjs-util>create-hash>ripemd160": { "packages": { - "react-markdown>vfile>unist-util-stringify-position": true + "browserify>buffer": true, + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true } }, - "react-popper": { - "globals": { - "document": true - }, + "@keystonehq/metamask-airgapped-keyring>rlp": { "packages": { - "@popperjs/core": true, - "react": true, - "react-popper>react-fast-compare": true, - "react-popper>warning": true - } - }, - "react-popper>react-fast-compare": { - "globals": { - "Element": true, - "console.warn": true + "bn.js": true, + "browserify>buffer": true } }, - "react-popper>warning": { + "eth-lattice-keyring>rlp": { "globals": { - "console": true + "TextEncoder": true } }, - "react-redux": { - "globals": { - "console": true, - "document": true - }, + "ethereumjs-util>rlp": { "packages": { - "@babel/runtime": true, - "prop-types": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true, - "react-redux>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>hoist-non-react-statics": { + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { "packages": { - "prop-types>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>react-is": { + "wait-on>rxjs": { "globals": { - "console": true + "cancelAnimationFrame": true, + "clearInterval": true, + "clearTimeout": true, + "performance": true, + "requestAnimationFrame": true, + "setInterval.apply": true, + "setTimeout.apply": true } }, - "react-responsive-carousel": { + "koa>content-disposition>safe-buffer": { + "packages": { + "browserify>buffer": true + } + }, + "react-dom>scheduler": { "globals": { - "HTMLElement": true, - "addEventListener": true, + "MessageChannel": true, + "cancelAnimationFrame": true, "clearTimeout": true, - "console.warn": true, - "document": true, - "getComputedStyle": true, - "removeEventListener": true, + "console": true, + "navigator": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true - }, - "packages": { - "classnames": true, - "react": true, - "react-dom": true, - "react-responsive-carousel>react-easy-swipe": true } }, - "react-responsive-carousel>react-easy-swipe": { + "ethers>@ethersproject/json-wallets>scrypt-js": { "globals": { - "addEventListener": true, "define": true, - "document.addEventListener": true, - "document.removeEventListener": true + "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "browserify>timers-browserify": true } }, - "react-router-dom": { + "ganache>secp256k1": { "packages": { - "prop-types": true, - "react": true, - "react-router-dom>history": true, - "react-router-dom>react-router": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "@metamask/ppom-validator>elliptic": true } }, - "react-router-dom-v5-compat": { + "semver": { "globals": { - "FormData": true, - "URL": true, - "URLSearchParams": true, - "__reactRouterVersion": "write", - "addEventListener": true, - "confirm": true, - "define": true, - "document": true, - "history.scrollRestoration": true, - "location.href": true, - "removeEventListener": true, - "scrollTo": true, - "scrollY": true, - "sessionStorage.getItem": true, - "sessionStorage.setItem": true, - "setTimeout": true + "console.error": true }, "packages": { - "history": true, - "react": true, - "react-dom": true, - "react-router-dom": true, - "react-router-dom-v5-compat>@remix-run/router": true, - "react-router-dom-v5-compat>react-router": true + "process": true } }, - "react-router-dom-v5-compat>@remix-run/router": { - "globals": { - "AbortController": true, - "DOMException": true, - "FormData": true, - "Headers": true, - "Request": true, - "Response": true, - "URL": true, - "URLSearchParams": true, - "console": true, - "document.defaultView": true + "string.prototype.matchall>call-bind>set-function-length": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>gopd": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom-v5-compat>react-router": { - "globals": { - "console.error": true, - "define": true - }, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": { "packages": { - "react": true, - "react-router-dom-v5-compat>@remix-run/router": true + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom>history": { + "promise-to-callback>set-immediate-shim": { "globals": { - "addEventListener": true, - "confirm": true, - "document": true, - "history": true, - "location": true, - "navigator.userAgent": true, - "removeEventListener": true + "setTimeout.apply": true }, "packages": { - "react-router-dom>history>resolve-pathname": true, - "react-router-dom>history>value-equal": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "browserify>timers-browserify": true } }, - "react-router-dom>react-router": { + "addons-linter>sha.js": { "packages": { - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-redux>hoist-non-react-statics": true, - "react-router-dom>history": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true, - "serve-handler>path-to-regexp": true + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "react-router-dom>tiny-warning": { - "globals": { - "console": true + "string.prototype.matchall>side-channel": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>object-inspect": true } }, - "react-simple-file-input": { + "@metamask/profile-sync-controller>siwe": { "globals": { - "File": true, - "FileReader": true, + "console.error": true, "console.warn": true }, "packages": { - "prop-types": true, - "react": true + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random": true, + "ethers": true, + "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true } }, - "react-syntax-highlighter>refractor>parse-entities": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { "globals": { - "document.createElement": true + "StopIteration": true + }, + "packages": { + "string.prototype.matchall>internal-slot": true } }, - "react-tippy": { + "stream-browserify": { + "packages": { + "webpack>events": true, + "pumpify>inherits": true, + "readable-stream": true + } + }, + "stream-http": { "globals": { - "Element": true, - "MSStream": true, - "MutationObserver": true, - "addEventListener": true, + "AbortController": true, + "Blob": true, + "MSStreamReader": true, + "ReadableStream": true, + "WritableStream": true, + "XDomainRequest": true, + "XMLHttpRequest": true, "clearTimeout": true, - "console.error": true, - "console.warn": true, - "define": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.maxTouchPoints": true, - "navigator.msMaxTouchPoints": true, - "navigator.userAgent": true, - "performance": true, - "requestAnimationFrame": true, + "fetch": true, + "location.protocol.search": true, "setTimeout": true }, "packages": { - "react": true, - "react-dom": true, - "react-tippy>popper.js": true + "browserify>buffer": true, + "stream-http>builtin-status-codes": true, + "pumpify>inherits": true, + "process": true, + "readable-stream": true, + "browserify>url": true, + "watchify>xtend": true } }, - "react-tippy>popper.js": { - "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.userAgent": true, - "requestAnimationFrame": true, - "setTimeout": true + "@metamask/snaps-controllers>tar-stream>streamx": { + "packages": { + "webpack>events": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true } }, - "react-toggle-button": { - "globals": { - "clearTimeout": true, - "console.warn": true, - "define": true, - "performance": true, - "setTimeout": true - }, + "browserify>string_decoder": { "packages": { - "react": true + "koa>content-disposition>safe-buffer": true } }, - "readable-stream": { + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "packages": { + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + } + }, + "react-markdown>style-to-object": { "packages": { + "react-markdown>style-to-object>inline-style-parser": true + } + }, + "@metamask/snaps-controllers>tar-stream": { + "packages": { + "@metamask/snaps-controllers>tar-stream>b4a": true, "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>string_decoder": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx": true + } + }, + "debounce-stream>through": { + "packages": { "process": true, - "pumpify>inherits": true, - "readable-stream>util-deprecate": true, - "webpack>events": true + "stream-browserify": true } }, - "readable-stream>util-deprecate": { + "browserify>timers-browserify": { "globals": { - "console.trace": true, - "console.warn": true, - "localStorage": true + "clearInterval": true, + "clearTimeout": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "process": true } }, - "redux": { + "react-router-dom>tiny-warning": { "globals": { "console": true - }, - "packages": { - "@babel/runtime": true } }, - "semver": { + "copy-to-clipboard>toggle-selection": { "globals": { - "console.error": true - }, - "packages": { - "process": true + "document.activeElement": true, + "document.getSelection": true } }, - "serve-handler>path-to-regexp": { + "@swc/helpers>tslib": { + "globals": { + "SuppressedError": true, + "define": true + } + }, + "@metamask/eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, "packages": { - "serve-handler>path-to-regexp>isarray": true + "browserify>browser-resolve": true } }, - "stream-browserify": { - "packages": { - "pumpify>inherits": true, - "readable-stream": true, - "webpack>events": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { + "globals": { + "define": true } }, - "stream-http": { + "@ensdomains/content-hash>cids>uint8arrays": { "globals": { - "AbortController": true, - "Blob": true, - "MSStreamReader": true, - "ReadableStream": true, - "WritableStream": true, - "XDomainRequest": true, - "XMLHttpRequest": true, - "clearTimeout": true, - "fetch": true, - "location.protocol.search": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "browserify>buffer": true, - "browserify>url": true, - "process": true, - "pumpify>inherits": true, - "readable-stream": true, - "stream-http>builtin-status-codes": true, - "watchify>xtend": true + "@ensdomains/content-hash>cids>multibase": true } }, - "string.prototype.matchall>call-bind": { + "@ensdomains/content-hash>multicodec>uint8arrays": { + "globals": { + "Buffer": true, + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>has>function-bind": true, - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>call-bind>set-function-length": true, - "string.prototype.matchall>get-intrinsic": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "string.prototype.matchall>call-bind>es-define-property": { + "react-markdown>unified": { "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unified>bail": true, + "react-markdown>unified>extend": true, + "react-markdown>unified>is-buffer": true, + "mocha>yargs-unparser>is-plain-obj": true, + "react-markdown>unified>trough": true, + "react-markdown>vfile": true } }, - "string.prototype.matchall>call-bind>set-function-length": { + "react-markdown>unist-util-visit>unist-util-visit-parents": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>gopd": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unist-util-visit>unist-util-is": true } }, - "string.prototype.matchall>define-properties": { + "react-markdown>unist-util-visit": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "react-markdown>unist-util-visit>unist-util-visit-parents": true } }, - "string.prototype.matchall>define-properties>define-data-property": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>gopd": true + "uri-js": { + "globals": { + "define": true } }, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "browserify>url": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true + "browserify>punycode": true, + "@storybook/addon-knobs>qs": true } }, - "string.prototype.matchall>es-abstract>available-typed-arrays": { + "react-focus-lock>use-callback-ref": { "packages": { - "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + "react": true } }, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "react-beautiful-dnd>use-memo-one": { "packages": { - "string.prototype.matchall>has-symbols": true + "react": true } }, - "string.prototype.matchall>es-abstract>gopd": { + "react-focus-lock>use-sidecar": { + "globals": { + "console.error": true + }, "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-focus-lock>use-sidecar>detect-node-es": true, + "react": true, + "@swc/helpers>tslib": true } }, - "string.prototype.matchall>es-abstract>has-property-descriptors": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true + "readable-stream>util-deprecate": { + "globals": { + "console.trace": true, + "console.warn": true, + "localStorage": true } }, - "string.prototype.matchall>es-abstract>is-array-buffer": { + "browserify>assert>util": { + "globals": { + "console.error": true, + "console.log": true, + "console.trace": true, + "process": true + }, "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "browserify>assert>util>inherits": true, + "process": true } }, - "string.prototype.matchall>es-abstract>is-callable": { + "browserify>util": { "globals": { - "document": true - } - }, - "string.prototype.matchall>es-abstract>is-regex": { + "console.error": true, + "console.log": true, + "console.trace": true + }, "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "pumpify>inherits": true, + "browserify>util>is-arguments": true, + "koa>is-generator-function": true, + "browserify>util>is-typed-array": true, + "process": true, + "browserify>util>which-typed-array": true } }, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": { - "packages": { - "string.prototype.matchall>call-bind": true + "uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "string.prototype.matchall>es-abstract>object-inspect": { + "@metamask/eth-snap-keyring>uuid": { "globals": { - "HTMLElement": true, - "WeakRef": true - }, - "packages": { - "browserify>browser-resolve": true + "crypto": true } }, - "string.prototype.matchall>get-intrinsic": { + "@metamask/keyring-snap-client>uuid": { "globals": { - "AggregateError": true, - "FinalizationRegistry": true, - "WeakRef": true - }, - "packages": { - "browserify>has>function-bind": true, - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>has-proto": true, - "string.prototype.matchall>has-symbols": true + "crypto": true } }, - "string.prototype.matchall>internal-slot": { - "packages": { - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>side-channel": true + "eth-lattice-keyring>gridplus-sdk>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": true + "web3-stream-provider>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": { + "@metamask/snaps-utils>validate-npm-package-name": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "@metamask/snaps-utils>validate-npm-package-name>builtins": true } }, - "string.prototype.matchall>side-channel": { + "react-markdown>vfile>vfile-message": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>object-inspect": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>vfile>unist-util-stringify-position": true } }, - "terser>source-map-support>buffer-from": { + "react-markdown>vfile": { "packages": { - "browserify>buffer": true + "react-markdown>vfile>is-buffer": true, + "path-browserify": true, + "process": true, + "react-markdown>vfile>replace-ext": true, + "react-markdown>vfile>vfile-message": true } }, - "uri-js": { + "browserify>vm-browserify": { "globals": { - "define": true + "document.body.appendChild": true, + "document.body.removeChild": true, + "document.createElement": true } }, - "uuid": { + "react-popper>warning": { "globals": { - "crypto": true, - "msCrypto": true + "console": true } }, - "wait-on>rxjs": { + "@ensdomains/content-hash>multihashes>web-encoding": { "globals": { - "cancelAnimationFrame": true, - "clearInterval": true, - "clearTimeout": true, - "performance": true, - "requestAnimationFrame": true, - "setInterval.apply": true, - "setTimeout.apply": true + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "browserify>util": true } }, "web3": { @@ -5484,14 +5367,14 @@ "setTimeout": true }, "packages": { - "browserify>util": true, "readable-stream": true, + "browserify>util": true, "web3-stream-provider>uuid": true } }, - "web3-stream-provider>uuid": { + "@metamask/controllers>web3": { "globals": { - "crypto": true + "XMLHttpRequest": true } }, "webextension-polyfill": { @@ -5503,9 +5386,35 @@ "define": true } }, - "webpack>events": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, + "eslint-plugin-react>array-includes>is-string": true, + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-collection": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true + } + }, + "browserify>util>which-typed-array": { + "packages": { + "string.prototype.matchall>es-abstract>available-typed-arrays": true, + "string.prototype.matchall>call-bind": true, + "browserify>util>which-typed-array>for-each": true, + "string.prototype.matchall>es-abstract>gopd": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { "globals": { - "console": true + "XMLHttpRequest": true } } } diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index b4f5e137de6b..a2453b1686dc 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -5,144 +5,124 @@ "regeneratorRuntime": "write" } }, - "@ensdomains/content-hash": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { "globals": { - "console.warn": true + "WeakRef": true }, "packages": { - "@ensdomains/content-hash>cids": true, - "@ensdomains/content-hash>js-base64": true, - "@ensdomains/content-hash>multicodec": true, - "@ensdomains/content-hash>multihashes": true, - "browserify>buffer": true + "browserify": true } }, - "@ensdomains/content-hash>cids": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes": true, - "@ensdomains/content-hash>cids>uint8arrays": true, - "@ensdomains/content-hash>multicodec": true + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, + "browserify": true, + "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true } }, - "@ensdomains/content-hash>cids>multibase": { + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "SuppressedError": true + } + }, + "@ensdomains/content-hash": { + "globals": { + "console.warn": true }, "packages": { - "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true + "browserify>buffer": true, + "@ensdomains/content-hash>cids": true, + "@ensdomains/content-hash>js-base64": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>multihashes": true } }, - "@ensdomains/content-hash>cids>multihashes": { + "@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multihashes>varint": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>cids>uint8arrays": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>cids>multibase": true + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "webpack>events": true } }, - "@ensdomains/content-hash>js-base64": { - "globals": { - "Base64": "write", - "TextDecoder": true, - "TextEncoder": true, - "atob": true, - "btoa": true, - "define": true - }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { "packages": { - "browserify>buffer": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays": true, - "sass-embedded>varint": true + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "webpack>events": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays": { + "@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "Buffer": true, - "TextDecoder": true, "TextEncoder": true - }, - "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { "globals": { - "TextDecoder": true, - "TextEncoder": true, - "console.warn": true, - "crypto.subtle.digest": true - } - }, - "@ensdomains/content-hash>multihashes": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase": true, - "@ensdomains/content-hash>multihashes>varint": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true } }, - "@ensdomains/content-hash>multihashes>multibase>base-x": { + "@ethereumjs/tx": { "packages": { - "koa>content-disposition>safe-buffer": true + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, - "@ensdomains/content-hash>multihashes>web-encoding": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/smart-transactions-controller>@ethereumjs/tx": { "packages": { - "browserify>util": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@ethereumjs/tx": { + "eth-lattice-keyring>@ethereumjs/tx": { "packages": { + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, "@ethereumjs/tx>@ethereumjs/common": true, "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, + "@ethersproject/providers": true, "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true, "browserify>insert-module-globals>is-buffer": true } }, - "@ethereumjs/tx>@ethereumjs/common": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, + "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx>@ethereumjs/rlp": true, "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/providers": true, "browserify>buffer": true, - "webpack>events": true - } - }, - "@ethereumjs/tx>@ethereumjs/common>crc-32": { - "globals": { - "DO_NOT_EXPORT_CRC": true, - "define": true - } - }, - "@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true } }, "@ethereumjs/tx>@ethereumjs/util": { @@ -151,70 +131,83 @@ }, "packages": { "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true, - "@ethereumjs/tx>ethereum-cryptography": true, "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true, "browserify>insert-module-globals>is-buffer": true, - "webpack>events": true + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": true } }, - "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { + "@metamask/smart-transactions-controller>@ethereumjs/util": { "globals": { - "Headers": true, - "TextDecoder": true, - "URL": true, - "btoa": true, + "console.warn": true, "fetch": true }, "packages": { - "browserify>browserify-zlib": true, - "browserify>buffer": true, - "browserify>url": true, - "browserify>util": true, - "https-browserify": true, - "process": true, - "stream-http": true + "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack>events": true } }, - "@ethereumjs/tx>ethereum-cryptography": { + "@ethersproject/abi": { "globals": { - "TextDecoder": true, - "crypto": true + "console.log": true }, "packages": { - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true, - "@metamask/message-signing-snap>@noble/curves": true, - "@noble/hashes": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { + "ethers>@ethersproject/abstract-provider": { "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "@ethersproject/abi": { - "globals": { - "console.log": true - }, + "ethers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/address": { "packages": { "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/basex": { + "packages": { + "@ethersproject/bytes": true, + "ethers>@ethersproject/properties": true } }, "@ethersproject/bignumber": { "packages": { "@ethersproject/bytes": true, - "bn.js": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/logger": true, + "bn.js": true } }, "@ethersproject/bytes": { @@ -222,17 +215,22 @@ "ethers>@ethersproject/logger": true } }, + "ethers>@ethersproject/constants": { + "packages": { + "@ethersproject/bignumber": true + } + }, "@ethersproject/contracts": { "globals": { "setTimeout": true }, "packages": { "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/abstract-provider": true, "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/transactions": true @@ -240,10 +238,10 @@ }, "@ethersproject/hash": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, "ethers>@ethersproject/address": true, "ethers>@ethersproject/base64": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, @@ -252,9 +250,9 @@ }, "@ethersproject/hdnode": { "packages": { + "ethers>@ethersproject/basex": true, "@ethersproject/bignumber": true, "@ethersproject/bytes": true, - "ethers>@ethersproject/basex": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, @@ -265,851 +263,891 @@ "ethers>@ethersproject/wordlists": true } }, - "@ethersproject/providers": { - "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true - }, + "ethers>@ethersproject/json-wallets": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/providers>bech32": true, - "@metamask/test-bundler>@ethersproject/networks": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true - } - }, - "@ethersproject/providers>@ethersproject/random": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@ethersproject/providers>@ethersproject/web": { - "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true - } - }, - "@ethersproject/wallet": { - "packages": { "@ethersproject/bytes": true, - "@ethersproject/hash": true, "@ethersproject/hdnode": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets": true, "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@keystonehq/bc-ur-registry-eth": { + "ethers>@ethersproject/keccak256": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "uuid": true + "@ethersproject/bytes": true, + "@metamask/ethjs>js-sha3": true } }, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { + "ethers>@ethersproject/logger": { "globals": { - "define": true - }, + "console": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { "packages": { - "@ngraveio/bc-ur": true, - "@swc/helpers>tslib": true, - "browserify>buffer": true, - "buffer": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring": { + "@metamask/test-bundler>@ethersproject/networks": { "packages": { - "@ethereumjs/tx": true, - "@keystonehq/bc-ur-registry-eth": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>rlp": true, - "@metamask/obs-store": true, - "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "ethers>@ethersproject/logger": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "ethers>@ethersproject/pbkdf2": { "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@keystonehq/bc-ur-registry-eth": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "eth-lattice-keyring>rlp": true, - "uuid": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/sha2": true } }, - "@keystonehq/metamask-airgapped-keyring>rlp": { + "ethers>@ethersproject/properties": { "packages": { - "bn.js": true, - "browserify>buffer": true + "ethers>@ethersproject/logger": true } }, - "@lavamoat/lavadome-react": { + "@ethersproject/providers": { "globals": { - "Document.prototype": true, - "DocumentFragment.prototype": true, - "Element.prototype": true, - "Node.prototype": true, + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, "console.warn": true, - "document": true + "setInterval": true, + "setTimeout": true }, "packages": { - "react": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "@metamask/test-bundler>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "@ethersproject/providers>@ethersproject/web": true, + "@ethersproject/providers>bech32": true } }, - "@material-ui/core": { + "ethers>@ethersproject/providers": { "globals": { - "Image": true, - "_formatMuiErrorMessage": true, - "addEventListener": true, + "WebSocket": true, "clearInterval": true, "clearTimeout": true, - "console.error": true, + "console.log": true, "console.warn": true, - "document": true, - "getComputedStyle": true, - "getSelection": true, - "innerHeight": true, - "innerWidth": true, - "matchMedia": true, - "navigator": true, - "performance.now": true, - "removeEventListener": true, - "requestAnimationFrame": true, "setInterval": true, "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles": true, - "@material-ui/core>@material-ui/system": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "@material-ui/core>popper.js": true, - "@material-ui/core>react-transition-group": true, - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true } }, - "@material-ui/core>@material-ui/styles": { + "@ethersproject/providers>@ethersproject/random": { "globals": { - "console.error": true, - "console.warn": true, - "document.createComment": true, - "document.head": true - }, + "crypto.getRandomValues": true + } + }, + "ethers>@ethersproject/random": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, - "@material-ui/core>@material-ui/styles>jss-plugin-global": true, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, - "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "prop-types": true, - "react": true, - "react-redux>hoist-non-react-statics": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss": { - "globals": { - "CSS": true, - "document.createElement": true, - "document.querySelector": true - }, + "ethers>@ethersproject/rlp": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { + "ethers>@ethersproject/sha2": { "packages": { - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { - "globals": { - "CSS": true - }, + "ethers>@ethersproject/signing-key": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-global": { + "ethers>@ethersproject/solidity": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": { + "ethers>@ethersproject/strings": { "packages": { - "@babel/runtime": true, - "react-router-dom>tiny-warning": true + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { + "ethers>@ethersproject/transactions": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "react-router-dom>tiny-warning": true + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/signing-key": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { + "ethers>@ethersproject/units": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true + "@ethersproject/bignumber": true, + "ethers>@ethersproject/logger": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { - "globals": { - "document.createElement": true, - "document.documentElement": true, - "getComputedStyle": true - }, + "@ethersproject/wallet": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true - } - }, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": { - "globals": { - "document": true + "ethers>@ethersproject/abstract-provider": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/transactions": true } }, - "@material-ui/core>@material-ui/system": { + "@ethersproject/providers>@ethersproject/web": { "globals": { - "console.error": true + "clearTimeout": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/utils": true, - "prop-types": true - } - }, - "@material-ui/core>@material-ui/utils": { - "packages": { - "@babel/runtime": true, - "prop-types": true, - "prop-types>react-is": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>popper.js": { + "ethers>@ethersproject/providers>@ethersproject/web": { "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator": true, - "requestAnimationFrame": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@material-ui/core>react-transition-group": { + "ethers>@ethersproject/web": { "globals": { - "Element": true, + "clearTimeout": true, + "fetch": true, "setTimeout": true }, "packages": { - "@material-ui/core>react-transition-group>dom-helpers": true, - "prop-types": true, - "react": true, - "react-dom": true - } - }, - "@material-ui/core>react-transition-group>dom-helpers": { - "packages": { - "@babel/runtime": true + "ethers>@ethersproject/base64": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask-institutional/custody-controller": { + "ethers>@ethersproject/wordlists": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask-institutional/custody-keyring": true, - "@metamask/obs-store": true + "@ethersproject/bytes": true, + "@ethersproject/hash": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/strings": true } }, - "@metamask-institutional/custody-keyring": { + "@metamask/notification-services-controller>firebase>@firebase/app": { "globals": { - "console.error": true, - "console.log": true, + "FinalizationRegistry": true, "console.warn": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask-institutional/custody-keyring>@metamask-institutional/configuration-client": true, - "@metamask-institutional/sdk": true, - "@metamask-institutional/types": true, - "@metamask/obs-store": true, - "crypto-browserify": true, - "gulp-sass>lodash.clonedeep": true, - "webpack>events": true + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask-institutional/custody-keyring>@metamask-institutional/configuration-client": { - "globals": { - "console.log": true, - "fetch": true + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { + "packages": { + "@metamask/notification-services-controller>firebase>@firebase/util": true } }, - "@metamask-institutional/extension": { + "@metamask/notification-services-controller>firebase>@firebase/installations": { "globals": { - "console.log": true + "BroadcastChannel": true, + "Headers": true, + "btoa": true, + "console.error": true, + "crypto": true, + "fetch": true, + "msCrypto": true, + "navigator.onLine": true, + "setTimeout": true }, "packages": { - "@metamask-institutional/custody-controller": true, - "@metamask-institutional/sdk": true, - "@metamask-institutional/types": true, - "gulp-sass>lodash.clonedeep": true - } - }, - "@metamask-institutional/institutional-features": { - "packages": { - "@metamask-institutional/custody-keyring": true, - "@metamask/obs-store": true - } - }, - "@metamask-institutional/rpc-allowlist": { - "globals": { - "URL": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true } }, - "@metamask-institutional/sdk": { + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { "globals": { - "URLSearchParams": true, - "console.debug": true, - "console.error": true, - "console.log": true, - "fetch": true + "console": true }, "packages": { - "@metamask-institutional/sdk>@metamask-institutional/simplecache": true, - "crypto-browserify": true, - "webpack>events": true + "@swc/helpers>tslib": true } }, - "@metamask-institutional/transaction-update": { + "@metamask/notification-services-controller>firebase>@firebase/messaging": { "globals": { - "clearInterval": true, - "console.info": true, - "console.log": true, - "setInterval": true + "Headers": true, + "Notification.maxActions": true, + "Notification.permission": true, + "Notification.requestPermission": true, + "PushSubscription.prototype.hasOwnProperty": true, + "ServiceWorkerRegistration": true, + "URL": true, + "addEventListener": true, + "atob": true, + "btoa": true, + "clients.matchAll": true, + "clients.openWindow": true, + "console.warn": true, + "document": true, + "fetch": true, + "indexedDB": true, + "location.href": true, + "location.origin": true, + "navigator": true, + "origin.replace": true, + "registration.showNotification": true, + "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask-institutional/sdk": true, - "@metamask-institutional/transaction-update>@metamask-institutional/websocket-client": true, - "@metamask/obs-store": true, - "webpack>events": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, + "@metamask/notification-services-controller>firebase>@firebase/installations": true, + "@metamask/notification-services-controller>firebase>@firebase/util": true, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, + "@swc/helpers>tslib": true } }, - "@metamask-institutional/transaction-update>@metamask-institutional/websocket-client": { + "@metamask/notification-services-controller>firebase>@firebase/util": { "globals": { - "WebSocket": true, - "clearTimeout": true, - "console.log": true, + "atob": true, + "browser": true, + "btoa": true, + "chrome": true, + "console": true, + "document": true, + "indexedDB": true, + "navigator": true, + "process": true, + "self": true, "setTimeout": true }, "packages": { - "webpack>events": true + "process": true } }, - "@metamask/abi-utils": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "packages": { + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "eth-lattice-keyring>rlp": true, + "uuid": true + } + }, + "@keystonehq/bc-ur-registry-eth": { "packages": { - "@metamask/abi-utils>@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, + "browserify>buffer": true, + "@metamask/eth-trezor-keyring>hdkey": true, + "uuid": true } }, - "@metamask/abi-utils>@metamask/utils": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "define": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@ngraveio/bc-ur": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "buffer": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@swc/helpers>tslib": true } }, - "@metamask/accounts-controller": { + "@keystonehq/metamask-airgapped-keyring": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/base-controller": true, - "@metamask/eth-snap-keyring": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/utils": true, + "@ethereumjs/tx": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, + "@keystonehq/bc-ur-registry-eth": true, + "@metamask/obs-store": true, + "browserify>buffer": true, + "webpack>events": true, + "@keystonehq/metamask-airgapped-keyring>rlp": true, "uuid": true } }, - "@metamask/address-book-controller": { + "chart.js>@kurkle/color": { + "globals": { + "define": true + } + }, + "@lavamoat/lavadome-react": { + "globals": { + "Document.prototype": true, + "DocumentFragment.prototype": true, + "Element.prototype": true, + "Node.prototype": true, + "console.warn": true, + "document": true + }, "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true + "react": true } }, - "@metamask/announcement-controller": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { "packages": { - "@metamask/announcement-controller>@metamask/base-controller": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true } }, - "@metamask/announcement-controller>@metamask/base-controller": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { "globals": { - "setTimeout": true + "console.warn": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { + "packages": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, + "@metamask/ppom-validator>crypto-js": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true + } + }, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { + "globals": { + "console.warn": true }, "packages": { - "immer": true + "@ethersproject/abi": true, + "ethers>@ethersproject/rlp": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, + "browserify>buffer": true, + "semver": true } }, - "@metamask/approval-controller": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { "globals": { - "console.info": true + "console.warn": true }, "packages": { - "@metamask/approval-controller>nanoid": true, - "@metamask/base-controller": true, - "@metamask/rpc-errors": true + "wait-on>rxjs": true } }, - "@metamask/approval-controller>nanoid": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { "globals": { - "crypto.getRandomValues": true + "__ledgerLogsListen": "write", + "console.error": true } }, - "@metamask/assets-controllers": { + "@material-ui/core": { "globals": { - "AbortController": true, - "Headers": true, - "URL": true, - "URLSearchParams": true, + "Image": true, + "_formatMuiErrorMessage": true, + "addEventListener": true, "clearInterval": true, "clearTimeout": true, "console.error": true, - "console.log": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "getSelection": true, + "innerHeight": true, + "innerWidth": true, + "matchMedia": true, + "navigator": true, + "performance.now": true, + "removeEventListener": true, + "requestAnimationFrame": true, "setInterval": true, "setTimeout": true }, "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/bignumber": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/abi-utils": true, - "@metamask/assets-controllers>@metamask/polling-controller": true, - "@metamask/base-controller": true, - "@metamask/contract-metadata": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "bn.js": true, - "cockatiel": true, - "ethers>@ethersproject/address": true, - "lodash": true, - "single-call-balance-checker-abi": true, - "uuid": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles": true, + "@material-ui/core>@material-ui/system": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>popper.js": true, + "prop-types": true, + "react": true, + "react-dom": true, + "prop-types>react-is": true, + "@material-ui/core>react-transition-group": true } }, - "@metamask/assets-controllers>@metamask/polling-controller": { + "@material-ui/core>@material-ui/styles": { "globals": { - "clearTimeout": true, "console.error": true, - "setTimeout": true + "console.warn": true, + "document.createComment": true, + "document.head": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "uuid": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "react-redux>hoist-non-react-statics": true, + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, + "@material-ui/core>@material-ui/styles>jss-plugin-global": true, + "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, + "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, + "@material-ui/core>@material-ui/styles>jss": true, + "prop-types": true, + "react": true } }, - "@metamask/base-controller": { + "@material-ui/core>@material-ui/system": { "globals": { - "setTimeout": true + "console.error": true }, "packages": { - "immer": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "prop-types": true } }, - "@metamask/browser-passworder": { - "globals": { - "CryptoKey": true, - "btoa": true, - "crypto.getRandomValues": true, - "crypto.subtle.decrypt": true, - "crypto.subtle.deriveKey": true, - "crypto.subtle.encrypt": true, - "crypto.subtle.exportKey": true, - "crypto.subtle.importKey": true - }, + "@material-ui/core>@material-ui/utils": { "packages": { - "@metamask/browser-passworder>@metamask/utils": true, - "browserify>buffer": true + "@babel/runtime": true, + "prop-types": true, + "prop-types>react-is": true } }, - "@metamask/browser-passworder>@metamask/utils": { + "@metamask-institutional/custody-keyring>@metamask-institutional/configuration-client": { "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "console.log": true, + "fetch": true + } + }, + "@metamask-institutional/custody-controller": { "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask-institutional/custody-keyring": true, + "@metamask/obs-store": true } }, - "@metamask/controller-utils": { + "@metamask-institutional/custody-keyring": { "globals": { - "URL": true, "console.error": true, - "fetch": true, - "setTimeout": true + "console.log": true, + "console.warn": true }, "packages": { "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/controller-utils>@spruceid/siwe-parser": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/utils": true, - "bn.js": true, - "browserify>buffer": true, - "eslint>fast-deep-equal": true, - "eth-ens-namehash": true + "@metamask-institutional/custody-keyring>@metamask-institutional/configuration-client": true, + "@metamask-institutional/sdk": true, + "@metamask-institutional/types": true, + "@metamask/obs-store": true, + "crypto-browserify": true, + "webpack>events": true, + "gulp-sass>lodash.clonedeep": true } }, - "@metamask/controller-utils>@spruceid/siwe-parser": { + "@metamask-institutional/extension": { "globals": { - "console.error": true, "console.log": true }, "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true + "@metamask-institutional/custody-controller": true, + "@metamask-institutional/sdk": true, + "@metamask-institutional/types": true, + "gulp-sass>lodash.clonedeep": true } }, - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { + "@metamask-institutional/institutional-features": { "packages": { - "browserify>buffer": true + "@metamask-institutional/custody-keyring": true, + "@metamask/obs-store": true } }, - "@metamask/controllers>web3": { + "@metamask-institutional/rpc-allowlist": { "globals": { - "XMLHttpRequest": true + "URL": true } }, - "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { + "@metamask-institutional/sdk": { "globals": { + "URLSearchParams": true, + "console.debug": true, + "console.error": true, + "console.log": true, "fetch": true + }, + "packages": { + "@metamask-institutional/sdk>@metamask-institutional/simplecache": true, + "crypto-browserify": true, + "webpack>events": true } }, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { + "@metamask-institutional/transaction-update": { "globals": { - "fetch": true + "clearInterval": true, + "console.info": true, + "console.log": true, + "setInterval": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask-institutional/sdk": true, + "@metamask-institutional/transaction-update>@metamask-institutional/websocket-client": true, + "@metamask/obs-store": true, + "webpack>events": true } }, - "@metamask/ens-controller": { + "@metamask-institutional/transaction-update>@metamask-institutional/websocket-client": { + "globals": { + "WebSocket": true, + "clearTimeout": true, + "console.log": true, + "setTimeout": true + }, "packages": { - "@ethersproject/providers": true, + "webpack>events": true + } + }, + "@metamask/abi-utils": { + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/abi-utils>@metamask/utils": true + } + }, + "@metamask/accounts-controller": { + "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/ens-controller>@metamask/utils": true, - "punycode": true + "@metamask/eth-snap-keyring": true, + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "uuid": true + } + }, + "@metamask/address-book-controller": { + "packages": { + "@metamask/base-controller": true, + "@metamask/controller-utils": true + } + }, + "@metamask/announcement-controller": { + "packages": { + "@metamask/announcement-controller>@metamask/base-controller": true } }, - "@metamask/ens-controller>@metamask/utils": { + "@metamask/approval-controller": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "console.info": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/base-controller": true, + "@metamask/rpc-errors": true, + "nanoid": true } }, - "@metamask/eth-json-rpc-filters": { + "@metamask/assets-controllers": { "globals": { - "console.error": true + "AbortController": true, + "Headers": true, + "URL": true, + "URLSearchParams": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.log": true, + "setInterval": true, + "setTimeout": true }, "packages": { + "@ethereumjs/tx>@ethereumjs/util": true, + "ethers>@ethersproject/address": true, + "@ethersproject/bignumber": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/abi-utils": true, + "@metamask/base-controller": true, + "@metamask/contract-metadata": true, + "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/json-rpc-engine": true, + "@metamask/metamask-eth-abis": true, + "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, "@metamask/name-controller>async-mutex": true, - "@metamask/safe-event-emitter": true, - "pify": true + "bn.js": true, + "cockatiel": true, + "lodash": true, + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true, + "single-call-balance-checker-abi": true, + "uuid": true } }, - "@metamask/eth-json-rpc-middleware": { + "@metamask/base-controller": { "globals": { - "URL": true, - "console.error": true, "setTimeout": true }, "packages": { - "@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true + "immer": true } }, - "@metamask/eth-json-rpc-middleware>@metamask/utils": { + "@metamask/announcement-controller>@metamask/base-controller": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "setTimeout": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "immer": true } }, - "@metamask/eth-json-rpc-provider": { + "@metamask/name-controller>@metamask/base-controller": { + "globals": { + "setTimeout": true + }, "packages": { - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true, - "uuid": true + "immer": true } }, - "@metamask/eth-ledger-bridge-keyring": { + "@metamask/rate-limit-controller>@metamask/base-controller": { "globals": { - "addEventListener": true, - "console.error": true, - "document.createElement": true, - "document.head.appendChild": true, - "fetch": true, - "removeEventListener": true + "setTimeout": true }, "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, - "@metamask/eth-sig-util": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "browserify>buffer": true, - "webpack>events": true + "immer": true } }, - "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": { + "@metamask/browser-passworder": { "globals": { - "TextEncoder": true + "CryptoKey": true, + "btoa": true, + "crypto.getRandomValues": true, + "crypto.subtle.decrypt": true, + "crypto.subtle.deriveKey": true, + "crypto.subtle.encrypt": true, + "crypto.subtle.exportKey": true, + "crypto.subtle.importKey": true + }, + "packages": { + "@metamask/browser-passworder>@metamask/utils": true, + "browserify>buffer": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": { + "eth-keyring-controller>@metamask/browser-passworder": { "globals": { - "console.warn": true + "crypto": true + } + }, + "@metamask/controller-utils": { + "globals": { + "URL": true, + "console.error": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@ethersproject/abi": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/utils": true, + "@metamask/controller-utils>@spruceid/siwe-parser": true, + "bn.js": true, "browserify>buffer": true, - "ethers>@ethersproject/rlp": true, - "semver": true + "eth-ens-namehash": true, + "eslint>fast-deep-equal": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service": { + "@metamask/ens-controller": { "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": true + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, + "punycode": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, + "clearTimeout": true, + "console.error": true, "setTimeout": true }, "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true + "@metamask/safe-event-emitter": true, + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true, + "pify": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/errors": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { - "console.warn": true + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/safe-event-emitter": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/eth-query>json-rpc-random-id": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools": { + "@metamask/keyring-controller>@metamask/eth-hd-keyring": { + "globals": { + "TextEncoder": true + }, "packages": { - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/cryptoassets-evm-signatures": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": true, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": true, - "@metamask/ppom-validator>crypto-js": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-sig-util": true, + "@metamask/scure-bip39": true, + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>@ledgerhq/live-env": { + "@metamask/eth-json-rpc-filters": { "globals": { - "console.warn": true + "console.error": true }, "packages": { - "wait-on>rxjs": true + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/safe-event-emitter": true, + "@metamask/name-controller>async-mutex": true, + "pify": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura": { "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, + "fetch": true, "setTimeout": true }, "packages": { - "axios>form-data": true, - "browserify>buffer": true, - "process": true + "@metamask/eth-json-rpc-provider": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { - "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/providers": true, - "@ethersproject/providers>@ethersproject/web": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/wordlists": true + "@metamask/eth-json-rpc-middleware": { + "globals": { + "URL": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/eth-sig-util": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/eth-json-rpc-middleware>@metamask/utils": true, + "@metamask/eth-json-rpc-middleware>klona": true, + "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/logs": { - "globals": { - "__ledgerLogsListen": "write", - "console.error": true + "@metamask/eth-json-rpc-provider": { + "packages": { + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/safe-event-emitter": true, + "uuid": true } }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { + "@metamask/eth-ledger-bridge-keyring": { "globals": { - "Blob": true, - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true + "addEventListener": true, + "console.error": true, + "document.createElement": true, + "document.head.appendChild": true, + "fetch": true, + "removeEventListener": true }, "packages": { - "axios>form-data": true, + "@metamask/eth-ledger-bridge-keyring>@ethereumjs/rlp": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth": true, + "@metamask/eth-sig-util": true, "browserify>buffer": true, - "process": true - } - }, - "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, "@metamask/eth-query": { @@ -1121,83 +1159,71 @@ "@metamask/eth-sig-util": { "packages": { "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, "@metamask/abi-utils": true, "@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/eth-sig-util>tweetnacl": true, "@metamask/utils>@scure/base": true, - "browserify>buffer": true + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { "packages": { - "@metamask/utils>@metamask/superstruct": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/eth-sig-util>tweetnacl": { - "globals": { - "crypto": true, - "msCrypto": true, - "nacl": "write" - }, + "@metamask/keyring-controller>@metamask/eth-sig-util": { "packages": { - "browserify>browser-resolve": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/eth-snap-keyring": { - "globals": { - "URL": true, - "console.error": true - }, + "@metamask/signature-controller>@metamask/eth-sig-util": { "packages": { - "@ethereumjs/tx": true, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/eth-snap-keyring>uuid": true, - "@metamask/keyring-api": true, - "@metamask/utils>@metamask/superstruct": true, - "webpack>events": true + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/abi-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "@metamask/eth-sig-util>tweetnacl": true } }, - "@metamask/eth-snap-keyring>@metamask/eth-sig-util": { + "@metamask/keyring-controller>@metamask/eth-simple-keyring": { "packages": { "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-sig-util": true, + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, + "browserify>buffer": true, "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true + "crypto-browserify>randombytes": true } }, - "@metamask/eth-snap-keyring>@metamask/utils": { + "@metamask/eth-snap-keyring": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "URL": true, + "console.error": true }, "packages": { + "@ethereumjs/tx": true, + "@metamask/eth-snap-keyring>@metamask/eth-sig-util": true, + "@metamask/keyring-api": true, + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/eth-snap-keyring>uuid": { - "globals": { - "crypto": true + "@metamask/eth-snap-keyring>@metamask/utils": true, + "webpack>events": true, + "@metamask/eth-snap-keyring>uuid": true } }, "@metamask/eth-token-tracker": { @@ -1207,192 +1233,79 @@ "packages": { "@babel/runtime": true, "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/eth-token-tracker>deep-equal": true, "@metamask/ethjs-contract": true, "@metamask/ethjs-query": true, "@metamask/safe-event-emitter": true, "bn.js": true, + "@metamask/eth-token-tracker>deep-equal": true, "human-standard-token-abi": true } }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": { + "@metamask/eth-trezor-keyring": { "globals": { - "clearTimeout": true, - "console.error": true, "setTimeout": true }, "packages": { - "@metamask/eth-query>json-rpc-random-id": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": true, - "@metamask/safe-event-emitter": true, - "pify": true + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, + "@trezor/connect-web": true, + "browserify>buffer": true, + "webpack>events": true, + "@metamask/eth-trezor-keyring>hdkey": true } }, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { + "@metamask/etherscan-link": { "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "URL": true } }, - "@metamask/eth-token-tracker>deep-equal": { + "@metamask/ethjs": { + "globals": { + "clearInterval": true, + "setInterval": true + }, "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, - "@metamask/eth-token-tracker>deep-equal>is-date-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, - "@metamask/eth-token-tracker>deep-equal>which-collection": true, - "@ngraveio/bc-ur>assert>object-is": true, - "browserify>util>is-arguments": true, - "browserify>util>which-typed-array": true, - "gulp>vinyl-fs>object.assign": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true, - "string.prototype.matchall>es-abstract>is-regex": true, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>regexp.prototype.flags": true, - "string.prototype.matchall>side-channel": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-provider-http": true, + "@metamask/ethjs-query": true, + "@metamask/ethjs>@metamask/ethjs-unit": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true } }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { + "@metamask/ethjs-contract": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true, - "browserify>util>is-arguments": true, - "eslint-plugin-react>array-includes>is-string": true, - "process": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>has-symbols": true + "@babel/runtime": true, + "@metamask/ethjs>@metamask/ethjs-filter": true, + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>ethjs-abi": true, + "@metamask/ethjs>js-sha3": true, + "promise-to-callback": true } }, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { + "@metamask/ethjs>@metamask/ethjs-filter": { "globals": { - "StopIteration": true - }, - "packages": { - "string.prototype.matchall>internal-slot": true + "clearInterval": true, + "setInterval": true } }, - "@metamask/eth-token-tracker>deep-equal>is-date-object": { + "@metamask/ethjs-query>@metamask/ethjs-format": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "@metamask/ethjs>@metamask/ethjs-util": true, + "@metamask/ethjs>@metamask/number-to-bn": true, + "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, - "eslint-plugin-react>array-includes>is-string": true, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { - "packages": { - "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection": { - "packages": { - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, - "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true - } - }, - "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true - } - }, - "@metamask/eth-trezor-keyring": { - "globals": { - "setTimeout": true - }, - "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": true, - "@metamask/eth-trezor-keyring>hdkey": true, - "@trezor/connect-web": true, - "browserify>buffer": true, - "webpack>events": true - } - }, - "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { - "packages": { - "@metamask/eth-sig-util": true, - "@swc/helpers>tslib": true - } - }, - "@metamask/eth-trezor-keyring>hdkey": { - "packages": { - "browserify>assert": true, - "crypto-browserify": true, - "ethereumjs-util>create-hash>ripemd160": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true - } - }, - "@metamask/etherscan-link": { - "globals": { - "URL": true - } - }, - "@metamask/ethjs": { - "globals": { - "clearInterval": true, - "setInterval": true - }, - "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-provider-http": true, - "@metamask/ethjs>@metamask/ethjs-unit": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/number-to-bn": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true - } - }, - "@metamask/ethjs-contract": { + "@metamask/ethjs>@metamask/ethjs-provider-http": { "packages": { - "@babel/runtime": true, - "@metamask/ethjs>@metamask/ethjs-filter": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>ethjs-abi": true, - "@metamask/ethjs>js-sha3": true, - "promise-to-callback": true + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true } }, "@metamask/ethjs-query": { @@ -1405,35 +1318,11 @@ "promise-to-callback": true } }, - "@metamask/ethjs-query>@metamask/ethjs-format": { - "packages": { - "@metamask/ethjs-query>@metamask/ethjs-format>ethjs-schema": true, - "@metamask/ethjs>@metamask/ethjs-util": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "@metamask/ethjs>@metamask/number-to-bn": true - } - }, "@metamask/ethjs-query>@metamask/ethjs-rpc": { "packages": { "promise-to-callback": true } }, - "@metamask/ethjs>@metamask/ethjs-filter": { - "globals": { - "clearInterval": true, - "setInterval": true - } - }, - "@metamask/ethjs>@metamask/ethjs-provider-http": { - "packages": { - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": true - } - }, - "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { - "globals": { - "XMLHttpRequest": true - } - }, "@metamask/ethjs>@metamask/ethjs-unit": { "packages": { "@metamask/ethjs>@metamask/number-to-bn": true, @@ -1442,42 +1331,9 @@ }, "@metamask/ethjs>@metamask/ethjs-util": { "packages": { + "browserify>buffer": true, "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "browserify>buffer": true - } - }, - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { - "packages": { - "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true - } - }, - "@metamask/ethjs>@metamask/number-to-bn": { - "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true - } - }, - "@metamask/ethjs>ethjs-abi": { - "packages": { - "@metamask/ethjs>ethjs-abi>number-to-bn": true, - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "browserify>buffer": true - } - }, - "@metamask/ethjs>ethjs-abi>number-to-bn": { - "packages": { - "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true, - "bn.js": true - } - }, - "@metamask/ethjs>js-sha3": { - "globals": { - "define": true - }, - "packages": { - "process": true + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, "@metamask/gas-fee-controller": { @@ -1504,28 +1360,6 @@ "@metamask/jazzicon>mersenne-twister": true } }, - "@metamask/jazzicon>color": { - "packages": { - "@metamask/jazzicon>color>clone": true, - "@metamask/jazzicon>color>color-convert": true, - "@metamask/jazzicon>color>color-string": true - } - }, - "@metamask/jazzicon>color>clone": { - "packages": { - "browserify>buffer": true - } - }, - "@metamask/jazzicon>color>color-convert": { - "packages": { - "@metamask/jazzicon>color>color-convert>color-name": true - } - }, - "@metamask/jazzicon>color>color-string": { - "packages": { - "jest-canvas-mock>moo-color>color-name": true - } - }, "@metamask/json-rpc-engine": { "packages": { "@metamask/rpc-errors": true, @@ -1544,35 +1378,24 @@ "readable-stream": true } }, - "@metamask/keyring-api": { + "@metamask/snaps-sdk>@metamask/key-tree": { "globals": { - "URL": true + "crypto.subtle": true }, "packages": { - "@metamask/keyring-api>@metamask/utils": true, - "@metamask/keyring-api>bech32": true, - "@metamask/keyring-api>uuid": true, - "@metamask/utils>@metamask/superstruct": true + "@metamask/scure-bip39": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true } }, - "@metamask/keyring-api>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, + "@metamask/keyring-api": { "packages": { + "@metamask/keyring-api>@metamask/keyring-utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/keyring-api>uuid": { - "globals": { - "crypto": true + "@metamask/keyring-api>@metamask/utils": true, + "@metamask/keyring-api>bech32": true } }, "@metamask/keyring-controller": { @@ -1583,856 +1406,300 @@ "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/keyring-controller>@metamask/eth-sig-util": true, "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, - "@metamask/keyring-controller>ethereumjs-wallet": true, + "@metamask/utils": true, "@metamask/name-controller>async-mutex": true, - "@metamask/utils": true + "@metamask/keyring-controller>ethereumjs-wallet": true } }, - "@metamask/keyring-controller>@metamask/eth-hd-keyring": { - "globals": { - "TextEncoder": true - }, + "@metamask/eth-snap-keyring>@metamask/keyring-internal-snap-client": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": true, - "@metamask/scure-bip39": true, - "browserify>buffer": true + "@metamask/keyring-snap-client": true } }, - "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { + "@metamask/keyring-snap-client": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-api>@metamask/keyring-utils": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/keyring-snap-client>uuid": true + } + }, + "@metamask/keyring-api>@metamask/keyring-utils": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "URL": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util": { + "@metamask/logging-controller": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true + "@metamask/base-controller": true, + "uuid": true } }, - "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { + "@metamask/logo": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "addEventListener": true, + "document.body.appendChild": true, + "document.createElementNS": true, + "innerHeight": true, + "innerWidth": true, + "requestAnimationFrame": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/logo>gl-mat4": true, + "@metamask/logo>gl-vec3": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring": { + "@metamask/message-manager": { "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/utils": true, "browserify>buffer": true, - "crypto-browserify>randombytes": true + "webpack>events": true, + "uuid": true } }, - "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "@metamask/name-controller": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "fetch": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/name-controller>@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/name-controller>@metamask/utils": true, + "@metamask/name-controller>async-mutex": true } }, - "@metamask/keyring-controller>ethereumjs-wallet": { + "@metamask/network-controller": { + "globals": { + "btoa": true, + "fetch": true, + "setTimeout": true + }, "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, - "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, - "browserify>buffer": true, - "crypto-browserify": true, - "crypto-browserify>randombytes": true, - "eth-lattice-keyring>gridplus-sdk>aes-js": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, + "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, + "@metamask/eth-json-rpc-middleware": true, + "@metamask/eth-json-rpc-provider": true, + "@metamask/eth-query": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/utils": true, + "eslint>fast-deep-equal": true, + "reselect": true, + "uri-js": true, "uuid": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { + "@metamask/transaction-controller>@metamask/nonce-tracker": { "packages": { + "@ethersproject/providers": true, "browserify>assert": true, - "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ethers>@ethersproject/sha2>hash.js": true, - "ganache>secp256k1": true, - "koa>content-disposition>safe-buffer": true + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { + "@metamask/notification-services-controller": { + "globals": { + "Intl.NumberFormat": true, + "addEventListener": true, + "fetch": true, + "registration": true, + "removeEventListener": true + }, "packages": { - "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true + "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/profile-sync-controller": true, + "@metamask/utils": true, + "@metamask/notification-services-controller>bignumber.js": true, + "@metamask/notification-services-controller>firebase": true, + "loglevel": true, + "uuid": true } }, - "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { + "@metamask/ethjs>@metamask/number-to-bn": { "packages": { "bn.js": true, - "browserify>buffer": true + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "@metamask/logging-controller": { + "@metamask/object-multiplex": { + "globals": { + "console.warn": true + }, "packages": { - "@metamask/base-controller": true, - "uuid": true + "@metamask/object-multiplex>once": true, + "readable-stream": true } }, - "@metamask/logo": { - "globals": { - "addEventListener": true, - "document.body.appendChild": true, - "document.createElementNS": true, - "innerHeight": true, - "innerWidth": true, - "requestAnimationFrame": true - }, + "@metamask/obs-store": { "packages": { - "@metamask/logo>gl-mat4": true, - "@metamask/logo>gl-vec3": true + "@metamask/safe-event-emitter": true, + "readable-stream": true } }, - "@metamask/message-manager": { + "@metamask/permission-controller": { + "globals": { + "console.error": true + }, "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, "@metamask/utils": true, - "browserify>buffer": true, - "uuid": true, - "webpack>events": true + "deep-freeze-strict": true, + "immer": true, + "nanoid": true } }, - "@metamask/message-manager>jsonschema": { + "@metamask/permission-log-controller": { "packages": { - "browserify>url": true + "@metamask/base-controller": true, + "@metamask/permission-log-controller>@metamask/utils": true } }, - "@metamask/message-signing-snap>@noble/ciphers": { + "@metamask/phishing-controller": { "globals": { - "TextDecoder": true, "TextEncoder": true, - "crypto": true - } - }, - "@metamask/message-signing-snap>@noble/curves": { - "globals": { - "TextEncoder": true + "URL": true, + "console.error": true, + "fetch": true }, "packages": { - "@noble/hashes": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@noble/hashes": true, + "@ethereumjs/tx>ethereum-cryptography": true, + "webpack-cli>fastest-levenshtein": true, + "punycode": true } }, - "@metamask/name-controller": { + "@metamask/polling-controller": { "globals": { - "fetch": true + "clearTimeout": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@metamask/controller-utils": true, - "@metamask/name-controller>@metamask/base-controller": true, - "@metamask/name-controller>@metamask/utils": true, - "@metamask/name-controller>async-mutex": true + "@metamask/base-controller": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "uuid": true } }, - "@metamask/name-controller>@metamask/base-controller": { + "@metamask/post-message-stream": { "globals": { - "setTimeout": true + "MessageEvent.prototype": true, + "WorkerGlobalScope": true, + "addEventListener": true, + "browser": true, + "chrome": true, + "location.origin": true, + "postMessage": true, + "removeEventListener": true }, "packages": { - "immer": true + "@metamask/post-message-stream>@metamask/utils": true, + "readable-stream": true } }, - "@metamask/name-controller>@metamask/utils": { + "@metamask/ppom-validator": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "URL": true, + "console.error": true, + "crypto": true }, "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "await-semaphore": true, "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/ppom-validator>crypto-js": true, + "@metamask/ppom-validator>elliptic": true, + "@metamask/eth-query>json-rpc-random-id": true } }, - "@metamask/name-controller>async-mutex": { - "globals": { - "clearTimeout": true, - "setTimeout": true - }, + "@metamask/preferences-controller": { "packages": { - "@swc/helpers>tslib": true + "@metamask/base-controller": true, + "@metamask/controller-utils": true } }, - "@metamask/network-controller": { + "@metamask/profile-sync-controller": { "globals": { - "btoa": true, + "Event": true, + "Headers": true, + "TextDecoder": true, + "TextEncoder": true, + "URL": true, + "URLSearchParams": true, + "addEventListener": true, + "console.error": true, + "dispatchEvent": true, "fetch": true, + "removeEventListener": true, "setTimeout": true }, "packages": { "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-json-rpc-provider": true, - "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/network-controller>reselect": true, - "browserify>assert": true, - "browserify>util": true, - "uri-js": true, - "uuid": true + "@metamask/keyring-api": true, + "@metamask/keyring-controller": true, + "@metamask/network-controller": true, + "@metamask/profile-sync-controller>@noble/ciphers": true, + "@noble/hashes": true, + "browserify>buffer": true, + "loglevel": true, + "@metamask/profile-sync-controller>siwe": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura": { + "@metamask/queued-request-controller": { + "packages": { + "@metamask/base-controller": true, + "@metamask/json-rpc-engine": true, + "@metamask/rpc-errors": true, + "@metamask/selected-network-controller": true, + "@metamask/utils": true + } + }, + "@metamask/rate-limit-controller": { "globals": { "setTimeout": true }, "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "node-fetch": true + "@metamask/rate-limit-controller>@metamask/base-controller": true, + "@metamask/rate-limit-controller>@metamask/rpc-errors": true, + "@metamask/rate-limit-controller>@metamask/utils": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/eth-json-rpc-provider": { + "@metamask/remote-feature-flag-controller": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": true, - "@metamask/safe-event-emitter": true + "@metamask/base-controller": true, + "cockatiel": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/json-rpc-engine": { + "@metamask/rpc-errors": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": true, - "@metamask/safe-event-emitter": true + "@metamask/utils": true, + "@metamask/rpc-errors>fast-safe-stringify": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors": { + "@metamask/rate-limit-controller>@metamask/rpc-errors": { "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": true, + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, "@metamask/rpc-errors>fast-safe-stringify": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/rpc-errors>@metamask/utils": { + "@metamask/safe-event-emitter": { "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware": { - "globals": { - "URL": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-json-rpc-middleware>klona": true, - "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, - "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/network-controller>@metamask/json-rpc-engine": true, - "@metamask/network-controller>@metamask/rpc-errors": true, - "bn.js": true, - "pify": true - } - }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>@metamask/json-rpc-engine": { - "packages": { - "@metamask/network-controller>@metamask/rpc-errors": true, - "@metamask/network-controller>@metamask/utils": true, - "@metamask/safe-event-emitter": true - } - }, - "@metamask/network-controller>@metamask/rpc-errors": { - "packages": { - "@metamask/network-controller>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true - } - }, - "@metamask/network-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/network-controller>reselect": { - "globals": { - "WeakRef": true, - "console.warn": true, - "unstable_autotrackMemoize": true - } - }, - "@metamask/notification-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/notification-services-controller": { - "globals": { - "Intl.NumberFormat": true, - "addEventListener": true, - "fetch": true, - "registration": true, - "removeEventListener": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": true, - "@metamask/notification-services-controller>bignumber.js": true, - "@metamask/notification-services-controller>firebase": true, - "@metamask/profile-sync-controller": true, - "@metamask/utils": true, - "loglevel": true, - "uuid": true - } - }, - "@metamask/notification-services-controller>@contentful/rich-text-html-renderer": { - "globals": { - "SuppressedError": true - } - }, - "@metamask/notification-services-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, - "@metamask/notification-services-controller>firebase": { - "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/messaging": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app": { - "globals": { - "FinalizationRegistry": true, - "console.warn": true - }, - "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": { - "packages": { - "@metamask/notification-services-controller>firebase>@firebase/util": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/logger": { - "globals": { - "console": true - }, - "packages": { - "@swc/helpers>tslib": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": { - "globals": { - "DOMException": true, - "IDBCursor": true, - "IDBDatabase": true, - "IDBIndex": true, - "IDBObjectStore": true, - "IDBRequest": true, - "IDBTransaction": true, - "indexedDB.deleteDatabase": true, - "indexedDB.open": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/installations": { - "globals": { - "BroadcastChannel": true, - "Headers": true, - "btoa": true, - "console.error": true, - "crypto": true, - "fetch": true, - "msCrypto": true, - "navigator.onLine": true, - "setTimeout": true - }, - "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/messaging": { - "globals": { - "Headers": true, - "Notification.maxActions": true, - "Notification.permission": true, - "Notification.requestPermission": true, - "PushSubscription.prototype.hasOwnProperty": true, - "ServiceWorkerRegistration": true, - "URL": true, - "addEventListener": true, - "atob": true, - "btoa": true, - "clients.matchAll": true, - "clients.openWindow": true, - "console.warn": true, - "document": true, - "fetch": true, - "indexedDB": true, - "location.href": true, - "location.origin": true, - "navigator": true, - "origin.replace": true, - "registration.showNotification": true, - "setTimeout": true - }, - "packages": { - "@metamask/notification-services-controller>firebase>@firebase/app": true, - "@metamask/notification-services-controller>firebase>@firebase/app>@firebase/component": true, - "@metamask/notification-services-controller>firebase>@firebase/app>idb": true, - "@metamask/notification-services-controller>firebase>@firebase/installations": true, - "@metamask/notification-services-controller>firebase>@firebase/util": true, - "@swc/helpers>tslib": true - } - }, - "@metamask/notification-services-controller>firebase>@firebase/util": { - "globals": { - "atob": true, - "browser": true, - "btoa": true, - "chrome": true, - "console": true, - "document": true, - "indexedDB": true, - "navigator": true, - "process": true, - "self": true, - "setTimeout": true - }, - "packages": { - "process": true - } - }, - "@metamask/object-multiplex": { - "globals": { - "console.warn": true - }, - "packages": { - "@metamask/object-multiplex>once": true, - "readable-stream": true - } - }, - "@metamask/object-multiplex>once": { - "packages": { - "@metamask/object-multiplex>once>wrappy": true - } - }, - "@metamask/obs-store": { - "packages": { - "@metamask/safe-event-emitter": true, - "readable-stream": true - } - }, - "@metamask/permission-controller": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/json-rpc-engine": true, - "@metamask/permission-controller>nanoid": true, - "@metamask/rpc-errors": true, - "@metamask/utils": true, - "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/permission-controller>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/permission-log-controller": { - "packages": { - "@metamask/base-controller": true, - "@metamask/permission-log-controller>@metamask/utils": true - } - }, - "@metamask/permission-log-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/phishing-controller": { - "globals": { - "TextEncoder": true, - "URL": true, - "console.error": true, - "fetch": true - }, - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@noble/hashes": true, - "punycode": true, - "webpack-cli>fastest-levenshtein": true - } - }, - "@metamask/polling-controller": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "uuid": true - } - }, - "@metamask/post-message-stream": { - "globals": { - "MessageEvent.prototype": true, - "WorkerGlobalScope": true, - "addEventListener": true, - "browser": true, - "chrome": true, - "location.origin": true, - "postMessage": true, - "removeEventListener": true - }, - "packages": { - "@metamask/post-message-stream>@metamask/utils": true, - "readable-stream": true - } - }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/ppom-validator": { - "globals": { - "URL": true, - "console.error": true, - "crypto": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query>json-rpc-random-id": true, - "@metamask/ppom-validator>crypto-js": true, - "@metamask/ppom-validator>elliptic": true, - "await-semaphore": true, - "browserify>buffer": true - } - }, - "@metamask/ppom-validator>crypto-js": { - "globals": { - "crypto": true, - "define": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "@metamask/ppom-validator>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "@metamask/ppom-validator>elliptic>hmac-drbg": { - "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "ethers>@ethersproject/sha2>hash.js": true - } - }, - "@metamask/preferences-controller": { - "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true - } - }, - "@metamask/profile-sync-controller": { - "globals": { - "Event": true, - "Headers": true, - "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "URLSearchParams": true, - "addEventListener": true, - "console.error": true, - "dispatchEvent": true, - "fetch": true, - "removeEventListener": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/keyring-api": true, - "@metamask/keyring-controller": true, - "@metamask/message-signing-snap>@noble/ciphers": true, - "@metamask/profile-sync-controller>siwe": true, - "@noble/hashes": true, - "browserify>buffer": true, - "loglevel": true - } - }, - "@metamask/profile-sync-controller>siwe": { - "globals": { - "console.error": true, - "console.warn": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random": true, - "ethers": true - } - }, - "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true, - "@noble/hashes": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, - "browserify>browser-resolve": true - } - }, - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { - "packages": { - "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true - } - }, - "@metamask/queued-request-controller": { - "packages": { - "@metamask/base-controller": true, - "@metamask/json-rpc-engine": true, - "@metamask/rpc-errors": true, - "@metamask/selected-network-controller": true, - "@metamask/utils": true - } - }, - "@metamask/rate-limit-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "@metamask/rate-limit-controller>@metamask/base-controller": true, - "@metamask/rate-limit-controller>@metamask/rpc-errors": true, - "@metamask/rate-limit-controller>@metamask/utils": true - } - }, - "@metamask/rate-limit-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, - "@metamask/rate-limit-controller>@metamask/rpc-errors": { - "packages": { - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": true, - "@metamask/rpc-errors>fast-safe-stringify": true - } - }, - "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rate-limit-controller>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, - "@metamask/rpc-errors": { - "packages": { - "@metamask/rpc-errors>fast-safe-stringify": true, - "@metamask/utils": true - } - }, - "@metamask/rpc-methods-flask>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/rpc-methods>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/safe-event-emitter": { - "globals": { - "setTimeout": true + "setTimeout": true }, "packages": { "webpack>events": true @@ -2447,12 +1714,6 @@ "@metamask/utils>@scure/base": true } }, - "@metamask/scure-bip39>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true - } - }, "@metamask/selected-network-controller": { "packages": { "@metamask/base-controller": true, @@ -2466,40 +1727,14 @@ "packages": { "@metamask/base-controller": true, "@metamask/controller-utils": true, + "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/keyring-controller": true, "@metamask/logging-controller": true, - "@metamask/message-manager>jsonschema": true, - "@metamask/signature-controller>@metamask/eth-sig-util": true, "@metamask/utils": true, "browserify>buffer": true, - "uuid": true, - "webpack>events": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util": { - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/abi-utils": true, - "@metamask/eth-sig-util>tweetnacl": true, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "browserify>buffer": true - } - }, - "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true, + "@metamask/message-manager>jsonschema": true, + "uuid": true } }, "@metamask/smart-transactions-controller": { @@ -2512,72 +1747,19 @@ "setInterval": true }, "packages": { + "@metamask/smart-transactions-controller>@ethereumjs/tx": true, + "@metamask/smart-transactions-controller>@ethereumjs/util": true, "@ethersproject/bytes": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "@metamask/smart-transactions-controller>@metamask/polling-controller": true, - "@metamask/smart-transactions-controller>bignumber.js": true, + "@metamask/polling-controller": true, "@metamask/transaction-controller": true, + "@metamask/smart-transactions-controller>bignumber.js": true, "browserify>buffer": true, "fast-json-patch": true, "lodash": true } }, - "@metamask/smart-transactions-controller>@ethereumjs/tx": { - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "@metamask/smart-transactions-controller>@ethereumjs/util": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/common": { - "packages": { - "@metamask/smart-transactions-controller>@ethereumjs/util": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": { - "globals": { - "TextEncoder": true - } - }, - "@metamask/smart-transactions-controller>@ethereumjs/util": { - "globals": { - "console.warn": true, - "fetch": true - }, - "packages": { - "@ethereumjs/tx>ethereum-cryptography": true, - "@metamask/smart-transactions-controller>@ethereumjs/tx>@ethereumjs/rlp": true, - "webpack>events": true - } - }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/smart-transactions-controller>@metamask/polling-controller": { - "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/base-controller": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "uuid": true - } - }, - "@metamask/smart-transactions-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, "@metamask/snaps-controllers": { "globals": { "DecompressionStream": true, @@ -2595,72 +1777,22 @@ "@metamask/permission-controller": true, "@metamask/post-message-stream": true, "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@xstate/fsm": true, - "@metamask/snaps-controllers>concat-stream": true, - "@metamask/snaps-controllers>get-npm-tarball-url": true, - "@metamask/snaps-controllers>nanoid": true, - "@metamask/snaps-controllers>readable-web-to-node-stream": true, - "@metamask/snaps-controllers>tar-stream": true, + "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/snaps-rpc-methods": true, "@metamask/snaps-sdk": true, "@metamask/snaps-utils": true, - "@metamask/snaps-utils>@metamask/snaps-registry": true, "@metamask/utils": true, + "@metamask/snaps-controllers>@xstate/fsm": true, "browserify>browserify-zlib": true, + "@metamask/snaps-controllers>concat-stream": true, "eslint>fast-deep-equal": true, + "@metamask/snaps-controllers>get-npm-tarball-url": true, "immer": true, + "nanoid": true, "readable-stream": true, - "semver": true - } - }, - "@metamask/snaps-controllers-flask>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/snaps-controllers>concat-stream": { - "packages": { - "browserify>buffer": true, - "browserify>concat-stream>typedarray": true, - "pumpify>inherits": true, - "readable-stream": true, - "terser>source-map-support>buffer-from": true - } - }, - "@metamask/snaps-controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/snaps-controllers>readable-web-to-node-stream": { - "packages": { - "readable-stream": true - } - }, - "@metamask/snaps-controllers>tar-stream": { - "packages": { - "@metamask/snaps-controllers>tar-stream>b4a": true, - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx": true, - "browserify>browser-resolve": true - } - }, - "@metamask/snaps-controllers>tar-stream>b4a": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx": { - "packages": { - "@metamask/snaps-controllers>tar-stream>fast-fifo": true, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true, - "webpack>events": true - } - }, - "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { - "globals": { - "queueMicrotask": true + "@metamask/snaps-controllers>readable-web-to-node-stream": true, + "semver": true, + "@metamask/snaps-controllers>tar-stream": true } }, "@metamask/snaps-execution-environments": { @@ -2673,15 +1805,23 @@ "@metamask/utils": true } }, + "@metamask/snaps-utils>@metamask/snaps-registry": { + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true + } + }, "@metamask/snaps-rpc-methods": { "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, "@metamask/permission-controller": true, "@metamask/rpc-errors": true, "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, "@metamask/snaps-utils": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, "@noble/hashes": true } }, @@ -2691,32 +1831,8 @@ }, "packages": { "@metamask/rpc-errors": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true - } - }, - "@metamask/snaps-sdk>@metamask/key-tree": { - "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/scure-bip39": true, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true - } - }, - "@metamask/snaps-sdk>@metamask/key-tree>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "@metamask/utils": true } }, "@metamask/snaps-utils": { @@ -2735,224 +1851,424 @@ "fetch": true }, "packages": { + "@metamask/snaps-sdk>@metamask/key-tree": true, "@metamask/permission-controller": true, "@metamask/rpc-errors": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, "@metamask/snaps-utils>@metamask/slip44": true, + "@metamask/snaps-sdk": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "chalk": true, "@metamask/snaps-utils>cron-parser": true, "@metamask/snaps-utils>fast-json-stable-stringify": true, "@metamask/snaps-utils>fast-xml-parser": true, "@metamask/snaps-utils>marked": true, "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, + "semver": true, + "@metamask/snaps-utils>validate-npm-package-name": true + } + }, + "@metamask/transaction-controller": { + "globals": { + "clearTimeout": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/tx>@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, + "@ethersproject/abi": true, + "@ethersproject/contracts": true, + "@ethersproject/providers": true, + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/metamask-eth-abis": true, + "@metamask/network-controller": true, + "@metamask/transaction-controller>@metamask/nonce-tracker": true, + "@metamask/rpc-errors": true, + "@metamask/utils": true, + "@metamask/name-controller>async-mutex": true, + "bn.js": true, + "browserify>buffer": true, + "eth-method-registry": true, + "webpack>events": true, + "fast-json-patch": true, + "lodash": true, + "uuid": true + } + }, + "@metamask/user-operation-controller": { + "globals": { + "fetch": true + }, + "packages": { + "@metamask/base-controller": true, + "@metamask/controller-utils": true, + "@metamask/eth-query": true, + "@metamask/gas-fee-controller": true, + "@metamask/polling-controller": true, + "@metamask/rpc-errors": true, + "@metamask/utils>@metamask/superstruct": true, + "@metamask/transaction-controller": true, "@metamask/utils": true, + "bn.js": true, + "webpack>events": true, + "lodash": true, + "uuid": true + } + }, + "@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true + } + }, + "@metamask/abi-utils>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, "@noble/hashes": true, - "chalk": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/snaps-utils>@metamask/snaps-registry": { + "@metamask/browser-passworder>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/message-signing-snap>@noble/curves": true, - "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@noble/hashes": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>cron-parser": { + "@metamask/eth-token-tracker>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>browser-resolve": true, - "luxon": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>fast-xml-parser": { + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { "globals": { - "entityName": true, - "val": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/snaps-utils>fast-xml-parser>strnum": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>marked": { + "@metamask/keyring-controller>@metamask/eth-hd-keyring>@metamask/utils": { "globals": { - "console.error": true, - "console.warn": true, - "define": true + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>rfdc": { + "@metamask/network-controller>@metamask/eth-json-rpc-infura>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>buffer": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name": { + "@metamask/eth-json-rpc-middleware>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@metamask/snaps-utils>validate-npm-package-name>builtins": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/snaps-utils>validate-npm-package-name>builtins": { + "@metamask/eth-sig-util>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "process": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/test-bundler>@ethersproject/networks": { + "@metamask/keyring-controller>@metamask/eth-sig-util>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "ethers>@ethersproject/logger": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true + } + }, + "@metamask/signature-controller>@metamask/eth-sig-util>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true + } + }, + "@metamask/keyring-controller>@metamask/eth-simple-keyring>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller": { + "@metamask/eth-snap-keyring>@metamask/utils": { "globals": { - "clearTimeout": true, - "console.error": true, - "fetch": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@ethereumjs/tx": true, - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/abi": true, - "@ethersproject/contracts": true, - "@ethersproject/providers": true, - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/metamask-eth-abis": true, - "@metamask/name-controller>async-mutex": true, - "@metamask/network-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller>@metamask/nonce-tracker": true, - "@metamask/utils": true, - "bn.js": true, + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, - "eth-method-registry": true, - "fast-json-patch": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker": { + "@metamask/keyring-api>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@ethersproject/providers": true, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": true, - "browserify>assert": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { + "@metamask/keyring-api>@metamask/keyring-utils>@metamask/utils": { "globals": { - "clearTimeout": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@swc/helpers>tslib": true + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller": { + "@metamask/name-controller>@metamask/utils": { "globals": { - "fetch": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "@metamask/base-controller": true, - "@metamask/controller-utils": true, - "@metamask/eth-query": true, - "@metamask/gas-fee-controller": true, - "@metamask/polling-controller": true, - "@metamask/rpc-errors": true, - "@metamask/transaction-controller": true, - "@metamask/user-operation-controller>@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "bn.js": true, - "lodash": true, - "uuid": true, - "webpack>events": true + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, - "@metamask/user-operation-controller>@metamask/utils": { + "@metamask/permission-log-controller>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils": { + "@metamask/post-message-stream>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true }, "packages": { "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, "@metamask/utils>pony-cause": true, + "semver": true + } + }, + "@metamask/rate-limit-controller>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "browserify>buffer": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/utils>@scure/base": { + "@metamask/rate-limit-controller>@metamask/rpc-errors>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true, + "browserify>buffer": true, + "nock>debug": true, + "@metamask/utils>pony-cause": true, + "semver": true } }, "@ngraveio/bc-ur": { "packages": { "@ngraveio/bc-ur>@keystonehq/alias-sampling": true, + "browserify>assert": true, "@ngraveio/bc-ur>bignumber.js": true, + "browserify>buffer": true, "@ngraveio/bc-ur>cbor-sync": true, "@ngraveio/bc-ur>crc": true, "@ngraveio/bc-ur>jsbi": true, - "addons-linter>sha.js": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "@ngraveio/bc-ur>assert>object-is": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true + "addons-linter>sha.js": true } }, - "@ngraveio/bc-ur>bignumber.js": { + "@metamask/profile-sync-controller>@noble/ciphers": { "globals": { - "crypto": true, - "define": true + "TextDecoder": true, + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>cbor-sync": { + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": { "globals": { - "define": true + "TextEncoder": true }, "packages": { - "browserify>buffer": true + "@noble/hashes": true } }, - "@ngraveio/bc-ur>crc": { - "packages": { - "browserify>buffer": true + "@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true } }, - "@ngraveio/bc-ur>jsbi": { + "@metamask/scure-bip39>@noble/hashes": { "globals": { - "define": true + "TextEncoder": true, + "crypto": true } }, - "@noble/hashes": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { "globals": { "TextEncoder": true, "crypto": true @@ -2969,6 +2285,20 @@ "navigator.userAgent": true } }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { + "globals": { + "console.log": true + } + }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { + "globals": { + "XMLHttpRequest": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + } + }, "@reduxjs/toolkit": { "globals": { "AbortController": true, @@ -2980,42 +2310,46 @@ "setTimeout": true }, "packages": { - "@reduxjs/toolkit>reselect": true, "immer": true, "process": true, "redux": true, - "redux-thunk": true - } - }, - "@segment/loosely-validate-event": { - "packages": { - "@segment/loosely-validate-event>component-type": true, - "@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true + "redux-thunk": true, + "@reduxjs/toolkit>reselect": true } }, - "@sentry/browser": { + "react-router-dom-v5-compat>@remix-run/router": { "globals": { - "PerformanceObserver.supportedEntryTypes": true, + "AbortController": true, + "DOMException": true, + "FormData": true, + "Headers": true, "Request": true, + "Response": true, "URL": true, - "XMLHttpRequest.prototype": true, - "__SENTRY_DEBUG__": true, - "__SENTRY_RELEASE__": true, - "addEventListener": true, - "console.error": true, - "indexedDB.open": true, - "performance.timeOrigin": true, - "setTimeout": true - }, + "URLSearchParams": true, + "console": true, + "document.defaultView": true + } + }, + "@metamask/utils>@scure/base": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + } + }, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": { "packages": { - "@sentry/browser>@sentry-internal/browser-utils": true, - "@sentry/browser>@sentry-internal/feedback": true, - "@sentry/browser>@sentry-internal/replay": true, - "@sentry/browser>@sentry-internal/replay-canvas": true, - "@sentry/browser>@sentry/core": true, - "@sentry/utils": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@metamask/utils>@scure/base": true + } + }, + "@segment/loosely-validate-event": { + "packages": { + "browserify>assert": true, + "browserify>buffer": true, + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true } }, "@sentry/browser>@sentry-internal/browser-utils": { @@ -3054,6 +2388,25 @@ "@sentry/utils": true } }, + "@sentry/browser>@sentry-internal/replay-canvas": { + "globals": { + "Blob": true, + "HTMLCanvasElement": true, + "HTMLImageElement": true, + "ImageData": true, + "URL.createObjectURL": true, + "WeakRef": true, + "Worker": true, + "cancelAnimationFrame": true, + "console.error": true, + "createImageBitmap": true, + "document": true + }, + "packages": { + "@sentry/browser>@sentry/core": true, + "@sentry/utils": true + } + }, "@sentry/browser>@sentry-internal/replay": { "globals": { "Blob": true, @@ -3103,21 +2456,25 @@ "@sentry/utils": true } }, - "@sentry/browser>@sentry-internal/replay-canvas": { + "@sentry/browser": { "globals": { - "Blob": true, - "HTMLCanvasElement": true, - "HTMLImageElement": true, - "ImageData": true, - "URL.createObjectURL": true, - "WeakRef": true, - "Worker": true, - "cancelAnimationFrame": true, + "PerformanceObserver.supportedEntryTypes": true, + "Request": true, + "URL": true, + "XMLHttpRequest.prototype": true, + "__SENTRY_DEBUG__": true, + "__SENTRY_RELEASE__": true, + "addEventListener": true, "console.error": true, - "createImageBitmap": true, - "document": true + "indexedDB.open": true, + "performance.timeOrigin": true, + "setTimeout": true }, "packages": { + "@sentry/browser>@sentry-internal/browser-utils": true, + "@sentry/browser>@sentry-internal/feedback": true, + "@sentry/browser>@sentry-internal/replay-canvas": true, + "@sentry/browser>@sentry-internal/replay": true, "@sentry/browser>@sentry/core": true, "@sentry/utils": true } @@ -3213,20 +2570,61 @@ "btoa": true } }, - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { + "@metamask/controller-utils>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "react-markdown>unist-util-visit": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@storybook/addon-knobs>qs": { + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "@noble/hashes": true, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": true } }, - "@swc/helpers>tslib": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": { + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary>@stablelib/int": true + } + }, + "@metamask/profile-sync-controller>siwe>@stablelib/random": { "globals": { - "SuppressedError": true, - "define": true + "crypto": true, + "msCrypto": true + }, + "packages": { + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/binary": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random>@stablelib/wipe": true, + "browserify>browser-resolve": true + } + }, + "@trezor/connect-web>@trezor/connect-common": { + "globals": { + "console.warn": true, + "localStorage.getItem": true, + "localStorage.setItem": true, + "navigator": true, + "setTimeout": true, + "window": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true + } + }, + "@metamask/eth-trezor-keyring>@trezor/connect-plugin-ethereum": { + "packages": { + "@metamask/eth-sig-util": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web": { @@ -3253,35 +2651,20 @@ "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/connect-common": true, + "@trezor/connect-web>@trezor/connect": true, "@trezor/connect-web>@trezor/utils": true, - "webpack>events": true + "webpack>events": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect": { "packages": { - "@swc/helpers>tslib": true, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, "@trezor/connect-web>@trezor/connect>@trezor/transport": true, - "@trezor/connect-web>@trezor/utils": true - } - }, - "@trezor/connect-web>@trezor/connect-common": { - "globals": { - "console.warn": true, - "localStorage.getItem": true, - "localStorage.setItem": true, - "navigator": true, - "setTimeout": true, - "window": true - }, - "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": true, - "@trezor/connect-web>@trezor/utils": true + "@trezor/connect-web>@trezor/utils": true, + "@swc/helpers>tslib": true } }, "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils": { @@ -3297,157 +2680,248 @@ "screen.width": true }, "packages": { + "process": true, "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true, - "process": true - } - }, - "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { - "globals": { - "define": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": true } }, "@trezor/connect-web>@trezor/connect>@trezor/protobuf": { "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": true, - "browserify>buffer": true + "browserify>buffer": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": true, + "@swc/helpers>tslib": true } }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { + "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": { "globals": { - "process": true, + "console.warn": true + }, + "packages": { + "@trezor/connect-web>@trezor/connect>@trezor/schema-utils>@sinclair/typebox": true, + "browserify>buffer": true, + "ts-mixer": true + } + }, + "@trezor/connect-web>@trezor/utils": { + "globals": { + "AbortController": true, + "Intl.NumberFormat": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.info": true, + "console.log": true, + "console.warn": true, + "setInterval": true, "setTimeout": true }, "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true + "@trezor/connect-web>@trezor/utils>bignumber.js": true, + "browserify>buffer": true, + "webpack>events": true, + "@swc/helpers>tslib": true } }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": { + "@welldone-software/why-did-you-render": { "globals": { - "console.log": true + "Element": true, + "console.group": true, + "console.groupCollapsed": true, + "console.groupEnd": true, + "console.log": true, + "console.warn": true, + "define": true, + "setTimeout": true + }, + "packages": { + "lodash": true, + "react": true } }, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": { + "@zxing/browser": { "globals": { - "XMLHttpRequest": true + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true }, "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, - "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true + "@zxing/library": true } }, - "@trezor/connect-web>@trezor/connect>@trezor/schema-utils": { + "@zxing/library": { "globals": { - "console.warn": true + "HTMLImageElement": true, + "HTMLVideoElement": true, + "TextDecoder": true, + "TextEncoder": true, + "URL.createObjectURL": true, + "btoa": true, + "console.log": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true }, "packages": { - "@trezor/connect-web>@trezor/connect>@trezor/schema-utils>@sinclair/typebox": true, + "@zxing/library>ts-custom-error": true + } + }, + "@lavamoat/lavapack>readable-stream>abort-controller": { + "globals": { + "AbortController": true + } + }, + "currency-formatter>accounting": { + "globals": { + "define": true + } + }, + "ethers>@ethersproject/json-wallets>aes-js": { + "globals": { + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>aes-js": { + "globals": { + "define": true + } + }, + "chalk>ansi-styles": { + "packages": { + "chalk>ansi-styles>color-convert": true + } + }, + "@metamask/controller-utils>@spruceid/siwe-parser>apg-js": { + "packages": { + "browserify>buffer": true + } + }, + "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true + } + }, + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "packages": { + "bn.js": true, "browserify>buffer": true, - "ts-mixer": true + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "browserify>vm-browserify": true } }, - "@trezor/connect-web>@trezor/utils": { + "browserify>assert": { + "globals": { + "Buffer": true + }, + "packages": { + "react>object-assign": true, + "browserify>assert>util": true + } + }, + "@metamask/name-controller>async-mutex": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, + "packages": { + "@swc/helpers>tslib": true + } + }, + "@metamask/transaction-controller>@metamask/nonce-tracker>async-mutex": { "globals": { - "AbortController": true, - "Intl.NumberFormat": true, - "clearInterval": true, "clearTimeout": true, - "console.error": true, - "console.info": true, - "console.log": true, - "console.warn": true, - "setInterval": true, "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true, - "@trezor/connect-web>@trezor/utils>bignumber.js": true, - "browserify>buffer": true, - "webpack>events": true + "@swc/helpers>tslib": true + } + }, + "string.prototype.matchall>es-abstract>available-typed-arrays": { + "packages": { + "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true } }, - "@trezor/connect-web>@trezor/utils>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "await-semaphore": { + "packages": { + "process": true, + "browserify>timers-browserify": true } }, - "@welldone-software/why-did-you-render": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>axios": { "globals": { - "Element": true, - "console.group": true, - "console.groupCollapsed": true, - "console.groupEnd": true, - "console.log": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, "console.warn": true, - "define": true, + "document": true, + "location.href": true, + "navigator": true, "setTimeout": true }, "packages": { - "lodash": true, - "react": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/browser": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>axios": { "globals": { - "HTMLElement": true, - "HTMLImageElement": true, - "HTMLVideoElement": true, - "clearTimeout": true, - "console.error": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, + "btoa": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "@zxing/library": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>axios": { "globals": { - "HTMLImageElement": true, - "HTMLVideoElement": true, - "TextDecoder": true, - "TextEncoder": true, - "URL.createObjectURL": true, + "Blob": true, + "FormData": true, + "URLSearchParams": true, + "XMLHttpRequest": true, "btoa": true, - "console.log": true, "console.warn": true, "document": true, + "location.href": true, "navigator": true, "setTimeout": true }, "packages": { - "@zxing/library>ts-custom-error": true + "browserify>buffer": true, + "axios>form-data": true, + "process": true } }, - "addons-linter>sha.js": { - "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@metamask/snaps-controllers>tar-stream>b4a": { + "globals": { + "TextDecoder": true, + "TextEncoder": true } }, - "await-semaphore": { + "@ensdomains/content-hash>multihashes>multibase>base-x": { "packages": { - "browserify>timers-browserify": true, - "process": true - } - }, - "axios>form-data": { - "globals": { - "FormData": true + "koa>content-disposition>safe-buffer": true } }, "base32-encode": { @@ -3461,139 +2935,178 @@ "define": true } }, - "blo": { + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>bignumber.js": { "globals": { - "btoa": true + "crypto": true, + "define": true } }, - "bn.js": { + "@metamask/notification-services-controller>bignumber.js": { "globals": { - "Buffer": true - }, - "packages": { - "browserify>browser-resolve": true + "crypto": true, + "define": true } }, - "bowser": { + "@metamask/smart-transactions-controller>bignumber.js": { "globals": { + "crypto": true, "define": true } }, - "browserify>assert": { + "@ngraveio/bc-ur>bignumber.js": { "globals": { - "Buffer": true - }, - "packages": { - "browserify>assert>util": true, - "react>object-assign": true + "crypto": true, + "define": true } }, - "browserify>assert>util": { + "@trezor/connect-web>@trezor/utils>bignumber.js": { "globals": { - "console.error": true, - "console.log": true, - "console.trace": true, - "process": true - }, + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "eth-lattice-keyring>gridplus-sdk>bitwise": { "packages": { - "browserify>assert>util>inherits": true, - "process": true + "browserify>buffer": true } }, - "browserify>browserify-zlib": { + "blo": { + "globals": { + "btoa": true + } + }, + "bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "browserify>assert": true, - "browserify>browserify-zlib>pako": true, - "browserify>buffer": true, - "browserify>util": true, - "process": true, - "stream-browserify": true + "browserify>browser-resolve": true } }, - "browserify>buffer": { + "eth-lattice-keyring>gridplus-sdk>borc": { "globals": { "console": true }, "packages": { - "base64-js": true, - "buffer>ieee754": true + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "browserify>buffer": true, + "buffer>ieee754": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true } }, - "browserify>punycode": { + "bowser": { "globals": { "define": true } }, - "browserify>string_decoder": { + "@metamask/ppom-validator>elliptic>brorand": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "pumpify>inherits": true, "koa>content-disposition>safe-buffer": true } }, - "browserify>timers-browserify": { - "globals": { - "clearInterval": true, - "clearTimeout": true, - "setInterval": true, - "setTimeout": true - }, + "crypto-browserify>browserify-cipher": { "packages": { - "process": true + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "crypto-browserify>browserify-cipher>browserify-des": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true } }, - "browserify>url": { + "crypto-browserify>browserify-cipher>browserify-des": { "packages": { - "@storybook/addon-knobs>qs": true, - "browserify>punycode": true + "browserify>buffer": true, + "ethereumjs-util>create-hash>cipher-base": true, + "crypto-browserify>browserify-cipher>browserify-des>des.js": true, + "pumpify>inherits": true } }, - "browserify>util": { - "globals": { - "console.error": true, - "console.log": true, - "console.trace": true - }, + "crypto-browserify>public-encrypt>browserify-rsa": { "packages": { - "browserify>util>is-arguments": true, - "browserify>util>is-typed-array": true, - "browserify>util>which-typed-array": true, - "koa>is-generator-function": true, + "bn.js": true, + "browserify>buffer": true, + "crypto-browserify>randombytes": true + } + }, + "crypto-browserify>browserify-sign": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>create-hmac": true, + "@metamask/ppom-validator>elliptic": true, + "pumpify>inherits": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "stream-browserify": true + } + }, + "browserify>browserify-zlib": { + "packages": { + "browserify>assert": true, + "browserify>buffer": true, + "browserify>browserify-zlib>pako": true, "process": true, - "pumpify>inherits": true + "stream-browserify": true, + "browserify>util": true } }, - "browserify>util>is-arguments": { + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true } }, - "browserify>util>is-typed-array": { + "ethereumjs-util>ethereum-cryptography>bs58check": { "packages": { - "browserify>util>which-typed-array": true + "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, + "ethereumjs-util>create-hash": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>util>which-typed-array": { + "buffer": { + "globals": { + "console": true + }, "packages": { - "browserify>util>which-typed-array>for-each": true, - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>available-typed-arrays": true, - "string.prototype.matchall>es-abstract>gopd": true + "base64-js": true, + "buffer>ieee754": true } }, - "browserify>util>which-typed-array>for-each": { + "terser>source-map-support>buffer-from": { "packages": { - "string.prototype.matchall>es-abstract>is-callable": true + "browserify>buffer": true } }, - "browserify>vm-browserify": { - "globals": { - "document.body.appendChild": true, - "document.body.removeChild": true, - "document.createElement": true + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { + "packages": { + "browserify>buffer": true } }, - "buffer": { + "browserify>buffer": { "globals": { "console": true }, @@ -3602,20 +3115,33 @@ "buffer>ieee754": true } }, - "chalk": { + "@metamask/snaps-utils>validate-npm-package-name>builtins": { "packages": { - "chalk>ansi-styles": true, - "chalk>supports-color": true + "process": true, + "semver": true } }, - "chalk>ansi-styles": { + "string.prototype.matchall>call-bind": { "packages": { - "chalk>ansi-styles>color-convert": true + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>call-bind>set-function-length": true } }, - "chalk>ansi-styles>color-convert": { + "@ngraveio/bc-ur>cbor-sync": { + "globals": { + "define": true + }, "packages": { - "jest-canvas-mock>moo-color>color-name": true + "browserify>buffer": true + } + }, + "chalk": { + "packages": { + "chalk>ansi-styles": true, + "chalk>supports-color": true } }, "chart.js": { @@ -3639,9 +3165,20 @@ "chart.js>@kurkle/color": true } }, - "chart.js>@kurkle/color": { - "globals": { - "define": true + "@ensdomains/content-hash>cids": { + "packages": { + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>cids>multihashes": true, + "@ensdomains/content-hash>cids>uint8arrays": true + } + }, + "ethereumjs-util>create-hash>cipher-base": { + "packages": { + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true, + "stream-browserify": true, + "browserify>string_decoder": true } }, "classnames": { @@ -3650,6 +3187,11 @@ "define": true } }, + "@metamask/jazzicon>color>clone": { + "packages": { + "browserify>buffer": true + } + }, "cockatiel": { "globals": { "AbortController": true, @@ -3663,6 +3205,37 @@ "process": true } }, + "chalk>ansi-styles>color-convert": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color>color-convert": { + "packages": { + "@metamask/jazzicon>color>color-convert>color-name": true + } + }, + "@metamask/jazzicon>color>color-string": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/jazzicon>color": { + "packages": { + "@metamask/jazzicon>color>clone": true, + "@metamask/jazzicon>color>color-convert": true, + "@metamask/jazzicon>color>color-string": true + } + }, + "@metamask/snaps-controllers>concat-stream": { + "packages": { + "terser>source-map-support>buffer-from": true, + "browserify>buffer": true, + "pumpify>inherits": true, + "readable-stream": true, + "browserify>concat-stream>typedarray": true + } + }, "copy-to-clipboard": { "globals": { "clipboardData": true, @@ -3681,10 +3254,47 @@ "copy-to-clipboard>toggle-selection": true } }, - "copy-to-clipboard>toggle-selection": { + "@ethereumjs/tx>@ethereumjs/common>crc-32": { "globals": { - "document.activeElement": true, - "document.getSelection": true + "DO_NOT_EXPORT_CRC": true, + "define": true + } + }, + "@ngraveio/bc-ur>crc": { + "packages": { + "browserify>buffer": true + } + }, + "crypto-browserify>create-ecdh": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "@metamask/ppom-validator>elliptic": true + } + }, + "ethereumjs-util>create-hash": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>md5.js": true, + "ethereumjs-util>create-hash>ripemd160": true, + "addons-linter>sha.js": true + } + }, + "crypto-browserify>create-hmac": { + "packages": { + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>create-hash": true, + "pumpify>inherits": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true + } + }, + "@metamask/snaps-utils>cron-parser": { + "packages": { + "browserify>browser-resolve": true, + "luxon": true } }, "crypto-browserify": { @@ -3692,303 +3302,484 @@ "crypto-browserify>browserify-cipher": true, "crypto-browserify>browserify-sign": true, "crypto-browserify>create-ecdh": true, + "ethereumjs-util>create-hash": true, "crypto-browserify>create-hmac": true, "crypto-browserify>diffie-hellman": true, "crypto-browserify>pbkdf2": true, "crypto-browserify>public-encrypt": true, "crypto-browserify>randombytes": true, - "crypto-browserify>randomfill": true, - "ethereumjs-util>create-hash": true + "crypto-browserify>randomfill": true + } + }, + "@metamask/ppom-validator>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "react-beautiful-dnd>css-box-model": { + "globals": { + "getComputedStyle": true, + "pageXOffset": true, + "pageYOffset": true + }, + "packages": { + "react-router-dom>tiny-invariant": true + } + }, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { + "globals": { + "document.createElement": true, + "document.documentElement": true, + "getComputedStyle": true + }, + "packages": { + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true + } + }, + "currency-formatter": { + "packages": { + "currency-formatter>accounting": true, + "currency-formatter>locale-currency": true, + "react>object-assign": true + } + }, + "debounce-stream": { + "packages": { + "debounce-stream>debounce": true, + "debounce-stream>duplexer": true, + "debounce-stream>through": true + } + }, + "debounce-stream>debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true + } + }, + "nock>debug": { + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, + "packages": { + "nock>debug>ms": true, + "process": true + } + }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "string.prototype.matchall>es-abstract>array-buffer-byte-length": true, + "string.prototype.matchall>call-bind": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": true, + "string.prototype.matchall>get-intrinsic": true, + "browserify>util>is-arguments": true, + "string.prototype.matchall>es-abstract>is-array-buffer": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "string.prototype.matchall>es-abstract>is-regex": true, + "string.prototype.matchall>es-abstract>is-shared-array-buffer": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "@ngraveio/bc-ur>assert>object-is": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true, + "gulp>vinyl-fs>object.assign": true, + "string.prototype.matchall>regexp.prototype.flags": true, + "string.prototype.matchall>side-channel": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": true, + "@metamask/eth-token-tracker>deep-equal>which-collection": true, + "browserify>util>which-typed-array": true + } + }, + "string.prototype.matchall>define-properties>define-data-property": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>gopd": true + } + }, + "string.prototype.matchall>define-properties": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true + } + }, + "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "crypto-browserify>diffie-hellman": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "crypto-browserify>diffie-hellman>miller-rabin": true, + "crypto-browserify>randombytes": true + } + }, + "@material-ui/core>react-transition-group>dom-helpers": { + "packages": { + "@babel/runtime": true + } + }, + "debounce-stream>duplexer": { + "packages": { + "stream-browserify": true + } + }, + "ethers>@ethersproject/signing-key>elliptic": { + "packages": { + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>browserify-cipher": { + "@metamask/ppom-validator>elliptic": { "packages": { - "crypto-browserify>browserify-cipher>browserify-des": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>browserify-cipher>browserify-des": { + "eth-lattice-keyring>gridplus-sdk>elliptic": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>browserify-des>des.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "pumpify>inherits": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true, + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>hmac-drbg": true, + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "crypto-browserify>browserify-cipher>browserify-des>des.js": { + "string.prototype.matchall>call-bind>es-define-property": { "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "string.prototype.matchall>get-intrinsic": true } }, - "crypto-browserify>browserify-cipher>evp_bytestokey": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator": { "packages": { - "ethereumjs-util>create-hash>md5.js": true, - "koa>content-disposition>safe-buffer": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>has-symbols": true, + "browserify>util>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "eslint-plugin-react>array-includes>is-string": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "process": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": true } }, - "crypto-browserify>browserify-sign": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { + "globals": { + "intToBuffer": true + }, "packages": { - "@metamask/ppom-validator>elliptic": true, "bn.js": true, + "buffer": true, + "@metamask/ethjs>js-sha3": true + } + }, + "eth-ens-namehash": { + "globals": { + "name": "write" + }, + "packages": { "browserify>buffer": true, - "crypto-browserify>create-hmac": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, - "ethereumjs-util>create-hash": true, - "pumpify>inherits": true, - "stream-browserify": true + "eth-ens-namehash>idna-uts46-hx": true, + "@metamask/ethjs>js-sha3": true } }, - "crypto-browserify>create-ecdh": { + "eth-lattice-keyring": { + "globals": { + "addEventListener": true, + "browser": true, + "clearInterval": true, + "fetch": true, + "open": true, + "setInterval": true + }, "packages": { - "@metamask/ppom-validator>elliptic": true, + "eth-lattice-keyring>@ethereumjs/tx": true, + "@ethereumjs/tx>@ethereumjs/util": true, "bn.js": true, - "browserify>buffer": true + "browserify>buffer": true, + "crypto-browserify": true, + "webpack>events": true, + "eth-lattice-keyring>gridplus-sdk": true, + "eth-lattice-keyring>rlp": true } }, - "crypto-browserify>create-hmac": { + "eth-method-registry": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "@metamask/ethjs-contract": true, + "@metamask/ethjs-query": true } }, - "crypto-browserify>diffie-hellman": { + "@ethereumjs/tx>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify>diffie-hellman>miller-rabin": true, - "crypto-browserify>randombytes": true + "@ethereumjs/tx>ethereum-cryptography>@noble/curves": true, + "@noble/hashes": true, + "@ethereumjs/tx>ethereum-cryptography>@scure/bip32": true } }, - "crypto-browserify>diffie-hellman>miller-rabin": { + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "bn.js": true + "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "crypto-browserify>pbkdf2": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { "globals": { - "crypto": true, - "process": true, - "queueMicrotask": true, - "setImmediate": true, - "setTimeout": true + "TextDecoder": true, + "crypto": true }, "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>ripemd160": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true } }, - "crypto-browserify>public-encrypt": { + "ethereumjs-util>ethereum-cryptography": { "packages": { - "bn.js": true, "browserify>buffer": true, - "crypto-browserify>public-encrypt>browserify-rsa": true, - "crypto-browserify>public-encrypt>parse-asn1": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, "crypto-browserify>randombytes": true, - "ethereumjs-util>create-hash": true + "ganache>secp256k1": true } }, - "crypto-browserify>public-encrypt>browserify-rsa": { + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": { "packages": { - "bn.js": true, + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, "browserify>buffer": true, - "crypto-browserify>randombytes": true + "crypto-browserify>create-hmac": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true } }, - "crypto-browserify>public-encrypt>parse-asn1": { + "ethereumjs-util": { "packages": { + "browserify>assert": true, + "bn.js": true, "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "crypto-browserify>pbkdf2": true, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util>rlp": true } }, - "crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": { "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "browserify>assert": true, "bn.js": true, "browserify>buffer": true, - "browserify>vm-browserify": true, - "pumpify>inherits": true - } - }, - "crypto-browserify>randombytes": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "koa>content-disposition>safe-buffer": true, - "process": true + "ethereumjs-util>create-hash": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "browserify>insert-module-globals>is-buffer": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": true } }, - "crypto-browserify>randomfill": { - "globals": { - "crypto": true, - "msCrypto": true - }, + "@metamask/keyring-controller>ethereumjs-wallet": { "packages": { + "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "crypto-browserify": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography": true, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util": true, "crypto-browserify>randombytes": true, - "koa>content-disposition>safe-buffer": true, - "process": true + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "@metamask/keyring-controller>ethereumjs-wallet>utf8": true, + "uuid": true } }, - "currency-formatter": { + "ethers": { "packages": { - "currency-formatter>accounting": true, - "currency-formatter>locale-currency": true, - "react>object-assign": true - } - }, - "currency-formatter>accounting": { - "globals": { - "define": true + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "ethers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "currency-formatter>locale-currency": { - "globals": { - "countryCode": true + "@metamask/eth-ledger-bridge-keyring>@ledgerhq/hw-app-eth>@ledgerhq/evm-tools>ethers": { + "packages": { + "@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "@ethersproject/bignumber": true, + "@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "@ethersproject/contracts": true, + "@ethersproject/hash": true, + "@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "@ethersproject/wallet": true, + "@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "debounce-stream": { + "@metamask/ethjs>ethjs-abi": { "packages": { - "debounce-stream>debounce": true, - "debounce-stream>duplexer": true, - "debounce-stream>through": true + "bn.js": true, + "browserify>buffer": true, + "@metamask/ethjs>js-sha3": true, + "@metamask/ethjs>ethjs-abi>number-to-bn": true } }, - "debounce-stream>debounce": { + "webpack>events": { "globals": { - "clearTimeout": true, - "setTimeout": true + "console": true } }, - "debounce-stream>duplexer": { + "crypto-browserify>browserify-cipher>evp_bytestokey": { "packages": { - "stream-browserify": true + "ethereumjs-util>create-hash>md5.js": true, + "koa>content-disposition>safe-buffer": true } }, - "debounce-stream>through": { + "extension-port-stream": { "packages": { - "process": true, - "stream-browserify": true + "browserify>buffer": true, + "extension-port-stream>readable-stream": true } }, - "depcheck>@vue/compiler-sfc>postcss>nanoid": { + "fast-json-patch": { "globals": { - "crypto.getRandomValues": true - } - }, - "depcheck>is-core-module>hasown": { - "packages": { - "browserify>has>function-bind": true + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true } }, - "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "@metamask/snaps-utils>fast-xml-parser": { "globals": { - "crypto.getRandomValues": true + "entityName": true, + "val": true + }, + "packages": { + "@metamask/snaps-utils>fast-xml-parser>strnum": true } }, - "eslint-plugin-react>array-includes>is-string": { + "@metamask/notification-services-controller>firebase": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "@metamask/notification-services-controller>firebase>@firebase/app": true, + "@metamask/notification-services-controller>firebase>@firebase/messaging": true } }, - "eth-ens-namehash": { + "react-focus-lock>focus-lock": { "globals": { - "name": "write" + "HTMLIFrameElement": true, + "Node.DOCUMENT_FRAGMENT_NODE": true, + "Node.DOCUMENT_NODE": true, + "Node.DOCUMENT_POSITION_CONTAINED_BY": true, + "Node.DOCUMENT_POSITION_CONTAINS": true, + "Node.ELEMENT_NODE": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "setTimeout": true }, "packages": { - "@metamask/ethjs>js-sha3": true, - "browserify>buffer": true, - "eth-ens-namehash>idna-uts46-hx": true + "@swc/helpers>tslib": true } }, - "eth-ens-namehash>idna-uts46-hx": { - "globals": { - "define": true - }, + "browserify>util>which-typed-array>for-each": { "packages": { - "browserify>punycode": true + "string.prototype.matchall>es-abstract>is-callable": true } }, - "eth-keyring-controller>@metamask/browser-passworder": { + "axios>form-data": { "globals": { - "crypto": true + "FormData": true } }, - "eth-lattice-keyring": { + "fuse.js": { "globals": { - "addEventListener": true, - "browser": true, - "clearInterval": true, - "fetch": true, - "open": true, - "setInterval": true - }, - "packages": { - "@ethereumjs/tx>@ethereumjs/util": true, - "bn.js": true, - "browserify>buffer": true, - "crypto-browserify": true, - "eth-lattice-keyring>@ethereumjs/tx": true, - "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "webpack>events": true - } - }, - "eth-lattice-keyring>@ethereumjs/tx": { - "packages": { - "@ethereumjs/tx>@ethereumjs/common": true, - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": true - } - }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": { - "packages": { - "browserify": true, - "browserify>buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>case": true + "console": true, + "define": true } }, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz>@chainsafe/persistent-merkle-tree": { + "string.prototype.matchall>get-intrinsic": { "globals": { + "AggregateError": true, + "FinalizationRegistry": true, "WeakRef": true }, "packages": { - "browserify": true + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>es-abstract>has-proto": true, + "string.prototype.matchall>has-symbols": true, + "depcheck>is-core-module>hasown": true } }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography": { - "globals": { - "TextDecoder": true, - "crypto": true - }, + "string.prototype.matchall>es-abstract>gopd": { "packages": { - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true - } - }, - "eth-lattice-keyring>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true + "string.prototype.matchall>get-intrinsic": true } }, "eth-lattice-keyring>gridplus-sdk": { @@ -4006,722 +3797,690 @@ "setTimeout": true }, "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethersproject/abi": true, - "@metamask/ethjs>js-sha3": true, - "@metamask/keyring-api>bech32": true, - "bn.js": true, - "browserify>buffer": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, + "@ethersproject/abi": true, "eth-lattice-keyring>gridplus-sdk>aes-js": true, + "@metamask/keyring-api>bech32": true, "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, "eth-lattice-keyring>gridplus-sdk>bitwise": true, + "bn.js": true, "eth-lattice-keyring>gridplus-sdk>borc": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "browserify>buffer": true, + "@ethereumjs/tx>@ethereumjs/common>crc-32": true, "eth-lattice-keyring>gridplus-sdk>elliptic": true, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, - "eth-lattice-keyring>gridplus-sdk>uuid": true, - "eth-lattice-keyring>rlp": true, - "ethereumjs-util>ethereum-cryptography>bs58check": true, "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ethjs>js-sha3": true, + "lodash": true, + "eth-lattice-keyring>rlp": true, "ganache>secp256k1": true, - "lodash": true + "eth-lattice-keyring>gridplus-sdk>uuid": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { + "string.prototype.matchall>es-abstract>has-property-descriptors": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "string.prototype.matchall>call-bind>es-define-property": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { + "koa>is-generator-function>has-tostringtag": { "packages": { - "@ethereumjs/tx>@ethereumjs/rlp": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "@ethersproject/providers": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-lattice-keyring>@ethereumjs/tx>@chainsafe/ssz": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": true + "string.prototype.matchall>has-symbols": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "ethereumjs-util>create-hash>md5.js>hash-base": { "packages": { - "@ethereumjs/tx>@ethereumjs/common>crc-32": true, - "@ethereumjs/tx>@ethereumjs/util": true, - "browserify>buffer": true, - "webpack>events": true + "pumpify>inherits": true, + "readable-stream": true, + "koa>content-disposition>safe-buffer": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography": { + "ethers>@ethersproject/sha2>hash.js": { + "packages": { + "pumpify>inherits": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true + } + }, + "depcheck>is-core-module>hasown": { + "packages": { + "browserify>has>function-bind": true + } + }, + "@metamask/eth-trezor-keyring>hdkey": { + "packages": { + "browserify>assert": true, + "ethereumjs-util>ethereum-cryptography>bs58check": true, + "crypto-browserify": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "ganache>secp256k1": true + } + }, + "he": { "globals": { - "TextDecoder": true, - "crypto": true + "define": true + } + }, + "history": { + "globals": { + "console": true, + "define": true, + "document.defaultView": true, + "document.querySelector": true + } + }, + "react-router-dom>history": { + "globals": { + "addEventListener": true, + "confirm": true, + "document": true, + "history": true, + "location": true, + "navigator.userAgent": true, + "removeEventListener": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": true + "react-router-dom>history>resolve-pathname": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true, + "react-router-dom>history>value-equal": true } }, - "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>ethereum-cryptography>@noble/hashes": { - "globals": { - "TextEncoder": true, - "crypto": true + "@metamask/ppom-validator>elliptic>hmac-drbg": { + "packages": { + "ethers>@ethersproject/sha2>hash.js": true, + "@metamask/ppom-validator>elliptic>minimalistic-assert": true, + "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true } }, - "eth-lattice-keyring>gridplus-sdk>aes-js": { + "react-redux>hoist-non-react-statics": { + "packages": { + "prop-types>react-is": true + } + }, + "https-browserify": { + "packages": { + "stream-http": true, + "browserify>url": true + } + }, + "@metamask/notification-services-controller>firebase>@firebase/app>idb": { "globals": { - "define": true + "DOMException": true, + "IDBCursor": true, + "IDBDatabase": true, + "IDBIndex": true, + "IDBObjectStore": true, + "IDBRequest": true, + "IDBTransaction": true, + "indexedDB.deleteDatabase": true, + "indexedDB.open": true } }, - "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "eth-ens-namehash>idna-uts46-hx": { "globals": { - "crypto": true, "define": true - } - }, - "eth-lattice-keyring>gridplus-sdk>bitwise": { + }, "packages": { - "browserify>buffer": true + "browserify>punycode": true } }, - "eth-lattice-keyring>gridplus-sdk>borc": { - "globals": { - "console": true - }, + "string.prototype.matchall>internal-slot": { "packages": { - "browserify>buffer": true, - "buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true + "string.prototype.matchall>call-bind>es-errors": true, + "depcheck>is-core-module>hasown": true, + "string.prototype.matchall>side-channel": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "browserify>util>is-arguments": { + "packages": { + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { - "globals": { - "URL": true, - "URLSearchParams": true, - "location": true + "string.prototype.matchall>es-abstract>is-array-buffer": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true } }, - "eth-lattice-keyring>gridplus-sdk>elliptic": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": { "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "string.prototype.matchall>es-abstract>unbox-primitive>has-bigints": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { - "globals": { - "intToBuffer": true - }, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": { "packages": { - "@metamask/ethjs>js-sha3": true, - "bn.js": true, - "buffer": true + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "eth-lattice-keyring>gridplus-sdk>uuid": { + "string.prototype.matchall>es-abstract>is-callable": { "globals": { - "crypto": true + "document": true } }, - "eth-lattice-keyring>rlp": { - "globals": { - "TextEncoder": true + "@metamask/eth-token-tracker>deep-equal>is-date-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true } }, - "eth-method-registry": { + "koa>is-generator-function": { "packages": { - "@metamask/ethjs-contract": true, - "@metamask/ethjs-query": true + "koa>is-generator-function>has-tostringtag": true } }, - "ethereumjs-util": { - "packages": { - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "@material-ui/core>@material-ui/styles>jss>is-in-browser": { + "globals": { + "document": true } }, - "ethereumjs-util>create-hash": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>md5.js": true, - "ethereumjs-util>create-hash>ripemd160": true, - "pumpify>inherits": true + "koa>is-generator-function>has-tostringtag": true } }, - "ethereumjs-util>create-hash>cipher-base": { + "string.prototype.matchall>es-abstract>is-regex": { "packages": { - "browserify>string_decoder": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "stream-browserify": true + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "ethereumjs-util>create-hash>md5.js": { + "string.prototype.matchall>es-abstract>is-shared-array-buffer": { "packages": { - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "string.prototype.matchall>call-bind": true } }, - "ethereumjs-util>create-hash>md5.js>hash-base": { + "eslint-plugin-react>array-includes>is-string": { "packages": { - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true, - "readable-stream": true + "koa>is-generator-function>has-tostringtag": true } }, - "ethereumjs-util>create-hash>ripemd160": { + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { "packages": { - "browserify>buffer": true, - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "pumpify>inherits": true + "string.prototype.matchall>has-symbols": true } }, - "ethereumjs-util>ethereum-cryptography": { + "browserify>util>is-typed-array": { "packages": { - "browserify>buffer": true, - "crypto-browserify>randombytes": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ganache>secp256k1": true + "browserify>util>which-typed-array": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes": { + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": { "packages": { - "browserify>buffer": true, - "crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, - "koa>content-disposition>safe-buffer": true, - "pumpify>inherits": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { + "globals": { + "URL": true, + "URLSearchParams": true, + "location": true + } + }, + "@ensdomains/content-hash>js-base64": { + "globals": { + "Base64": "write", + "TextDecoder": true, + "TextEncoder": true, + "atob": true, + "btoa": true, + "define": true + }, "packages": { "browserify>buffer": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check": { + "@metamask/ethjs>js-sha3": { + "globals": { + "define": true + }, "packages": { - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": true, - "koa>content-disposition>safe-buffer": true + "process": true } }, - "ethereumjs-util>ethereum-cryptography>bs58check>bs58": { - "packages": { - "@ensdomains/content-hash>multihashes>multibase>base-x": true + "@ngraveio/bc-ur>jsbi": { + "globals": { + "define": true } }, - "ethereumjs-util>ethereum-cryptography>keccak": { + "@metamask/message-manager>jsonschema": { "packages": { - "browserify>buffer": true, - "readable-stream": true + "browserify>url": true } }, - "ethereumjs-util>rlp": { + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { "packages": { - "bn.js": true, - "browserify>buffer": true + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true } }, - "ethereumjs-wallet>randombytes": { + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { "globals": { - "crypto.getRandomValues": true + "CSS": true + }, + "packages": { + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethers": { + "@material-ui/core>@material-ui/styles>jss-plugin-global": { "packages": { - "@ethersproject/abi": true, - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/contracts": true, - "@ethersproject/hash": true, - "@ethersproject/hdnode": true, - "@ethersproject/wallet": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/web": true, - "ethers>@ethersproject/wordlists": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethers>@ethersproject/abstract-provider": { + "@material-ui/core>@material-ui/styles>jss-plugin-nested": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "@babel/runtime": true, + "react-router-dom>tiny-warning": true } }, - "ethers>@ethersproject/abstract-signer": { + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { "packages": { - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "@material-ui/core>@material-ui/styles>jss": true, + "react-router-dom>tiny-warning": true } }, - "ethers>@ethersproject/address": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "ethers>@ethersproject/base64": { + "@material-ui/core>@material-ui/styles>jss": { "globals": { - "atob": true, - "btoa": true + "CSS": true, + "document.createElement": true, + "document.querySelector": true }, "packages": { - "@ethersproject/bytes": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, + "react-router-dom>tiny-warning": true } }, - "ethers>@ethersproject/basex": { + "ethereumjs-util>ethereum-cryptography>keccak": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/properties": true + "browserify>buffer": true, + "readable-stream": true } }, - "ethers>@ethersproject/constants": { - "packages": { - "@ethersproject/bignumber": true + "currency-formatter>locale-currency": { + "globals": { + "countryCode": true } }, - "ethers>@ethersproject/json-wallets": { - "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hdnode": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "localforage": { + "globals": { + "Blob": true, + "BlobBuilder": true, + "FileReader": true, + "IDBKeyRange": true, + "MSBlobBuilder": true, + "MozBlobBuilder": true, + "OIndexedDB": true, + "WebKitBlobBuilder": true, + "atob": true, + "btoa": true, + "console.error": true, + "console.info": true, + "console.warn": true, + "define": true, + "fetch": true, + "indexedDB": true, + "localStorage": true, + "mozIndexedDB": true, + "msIndexedDB": true, + "navigator.platform": true, + "navigator.userAgent": true, + "openDatabase": true, + "setTimeout": true, + "webkitIndexedDB": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { + "lodash": { "globals": { - "define": true + "clearTimeout": true, + "define": true, + "setTimeout": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { + "loglevel": { + "globals": { + "console": true, + "define": true, + "document.cookie": true, + "localStorage": true, + "log": "write", + "navigator": true + } + }, + "lottie-web": { "globals": { + "Blob": true, + "Howl": true, + "OffscreenCanvas": true, + "URL.createObjectURL": true, + "Worker": true, + "XMLHttpRequest": true, + "bodymovin": "write", + "clearInterval": true, + "console": true, "define": true, + "document.body": true, + "document.createElement": true, + "document.createElementNS": true, + "document.getElementsByClassName": true, + "document.getElementsByTagName": true, + "document.querySelectorAll": true, + "document.readyState": true, + "location.origin": true, + "location.pathname": true, + "navigator": true, + "requestAnimationFrame": true, + "setInterval": true, "setTimeout": true - }, - "packages": { - "browserify>timers-browserify": true } }, - "ethers>@ethersproject/keccak256": { - "packages": { - "@ethersproject/bytes": true, - "@metamask/ethjs>js-sha3": true + "luxon": { + "globals": { + "Intl": true } }, - "ethers>@ethersproject/logger": { + "@metamask/snaps-utils>marked": { "globals": { - "console": true + "console.error": true, + "console.warn": true, + "define": true } }, - "ethers>@ethersproject/pbkdf2": { + "ethereumjs-util>create-hash>md5.js": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "ethers>@ethersproject/properties": { + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": { "packages": { - "ethers>@ethersproject/logger": true + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/providers": { - "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true - }, + "react-markdown>remark-parse>mdast-util-from-markdown": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>@ethersproject/networks": true, - "ethers>@ethersproject/providers>@ethersproject/web": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, + "react-syntax-highlighter>refractor>parse-entities": true, + "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true } }, - "ethers>@ethersproject/providers>@ethersproject/networks": { + "react-markdown>remark-rehype>mdast-util-to-hast": { + "globals": { + "console.warn": true + }, "packages": { - "ethers>@ethersproject/logger": true + "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, + "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, + "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, + "react-markdown>unist-util-visit": true } }, - "ethers>@ethersproject/providers>@ethersproject/web": { + "@ethereumjs/tx>@ethereumjs/util>micro-ftch": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true + "Headers": true, + "TextDecoder": true, + "URL": true, + "btoa": true, + "fetch": true }, "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "browserify>browserify-zlib": true, + "browserify>buffer": true, + "https-browserify": true, + "process": true, + "stream-http": true, + "browserify>url": true, + "browserify>util": true } }, - "ethers>@ethersproject/random": { + "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "react-syntax-highlighter>refractor>parse-entities": true } }, - "ethers>@ethersproject/rlp": { + "crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "bn.js": true, + "@metamask/ppom-validator>elliptic>brorand": true } }, - "ethers>@ethersproject/sha2": { + "@ensdomains/content-hash>cids>multibase": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true } }, - "ethers>@ethersproject/sha2>hash.js": { + "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "pumpify>inherits": true + "@ensdomains/content-hash>multihashes>multibase>base-x": true, + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/signing-key": { + "@ensdomains/content-hash>multicodec": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/signing-key>elliptic": true + "@ensdomains/content-hash>multicodec>uint8arrays": true, + "sass-embedded>varint": true } }, - "ethers>@ethersproject/signing-key>elliptic": { - "packages": { - "@metamask/ppom-validator>elliptic>brorand": true, - "@metamask/ppom-validator>elliptic>hmac-drbg": true, - "@metamask/ppom-validator>elliptic>minimalistic-assert": true, - "@metamask/ppom-validator>elliptic>minimalistic-crypto-utils": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "console.warn": true, + "crypto.subtle.digest": true } }, - "ethers>@ethersproject/solidity": { + "@ensdomains/content-hash>multihashes": { "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "browserify>buffer": true, + "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "ethers>@ethersproject/strings": { + "@ensdomains/content-hash>cids>multihashes": { "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>cids>multihashes>varint": true } }, - "ethers>@ethersproject/transactions": { - "packages": { - "@ethersproject/bignumber": true, - "@ethersproject/bytes": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/units": { - "packages": { - "@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "@metamask/approval-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/web": { + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true - }, - "packages": { - "@ethersproject/bytes": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "crypto.getRandomValues": true } }, - "ethers>@ethersproject/wordlists": { - "packages": { - "@ethersproject/bytes": true, - "@ethersproject/hash": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "@metamask/notification-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream": { - "packages": { - "browserify>buffer": true, - "extension-port-stream>readable-stream": true + "@metamask/permission-controller>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "extension-port-stream>readable-stream": { + "@metamask/rpc-methods>nanoid": { "globals": { - "AbortController": true, - "AggregateError": true, - "Blob": true - }, - "packages": { - "browserify>buffer": true, - "browserify>string_decoder": true, - "extension-port-stream>readable-stream>abort-controller": true, - "process": true, - "webpack>events": true + "crypto.getRandomValues": true } }, - "extension-port-stream>readable-stream>abort-controller": { + "@metamask/rpc-methods-flask>nanoid": { "globals": { - "AbortController": true + "crypto.getRandomValues": true } }, - "fast-json-patch": { + "@metamask/snaps-controllers>nanoid": { "globals": { - "addEventListener": true, - "clearTimeout": true, - "removeEventListener": true, - "setTimeout": true + "crypto.getRandomValues": true } }, - "fuse.js": { + "@metamask/snaps-controllers-flask>nanoid": { "globals": { - "console": true, - "define": true + "crypto.getRandomValues": true } }, - "ganache>secp256k1": { - "packages": { - "@metamask/ppom-validator>elliptic": true + "depcheck>@vue/compiler-sfc>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "gulp>vinyl-fs>object.assign": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>has-symbols": true + "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, - "he": { + "node-fetch": { "globals": { - "define": true + "Headers": true, + "Request": true, + "Response": true, + "fetch": true } }, - "history": { + "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { "globals": { - "console": true, - "define": true, - "document.defaultView": true, - "document.querySelector": true + "fetch": true } }, - "https-browserify": { + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { + "globals": { + "fetch": true + } + }, + "@metamask/ethjs>ethjs-abi>number-to-bn": { "packages": { - "browserify>url": true, - "stream-http": true + "bn.js": true, + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": true } }, - "koa>content-disposition>safe-buffer": { + "string.prototype.matchall>es-abstract>object-inspect": { + "globals": { + "HTMLElement": true, + "WeakRef": true + }, "packages": { - "browserify>buffer": true + "browserify>browser-resolve": true } }, - "koa>is-generator-function": { + "@ngraveio/bc-ur>assert>object-is": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true } }, - "koa>is-generator-function>has-tostringtag": { + "gulp>vinyl-fs>object.assign": { "packages": { - "string.prototype.matchall>has-symbols": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>has-symbols": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "localforage": { - "globals": { - "Blob": true, - "BlobBuilder": true, - "FileReader": true, - "IDBKeyRange": true, - "MSBlobBuilder": true, - "MozBlobBuilder": true, - "OIndexedDB": true, - "WebKitBlobBuilder": true, - "atob": true, - "btoa": true, - "console.error": true, - "console.info": true, - "console.warn": true, - "define": true, - "fetch": true, - "indexedDB": true, - "localStorage": true, - "mozIndexedDB": true, - "msIndexedDB": true, - "navigator.platform": true, - "navigator.userAgent": true, - "openDatabase": true, - "setTimeout": true, - "webkitIndexedDB": true + "@metamask/object-multiplex>once": { + "packages": { + "@metamask/object-multiplex>once>wrappy": true } }, - "lodash": { - "globals": { - "clearTimeout": true, - "define": true, - "setTimeout": true + "crypto-browserify>public-encrypt>parse-asn1": { + "packages": { + "crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes": true, + "browserify>buffer": true, + "crypto-browserify>browserify-cipher>evp_bytestokey": true, + "crypto-browserify>pbkdf2": true } }, - "loglevel": { + "react-syntax-highlighter>refractor>parse-entities": { "globals": { - "console": true, - "define": true, - "document.cookie": true, - "localStorage": true, - "log": "write", - "navigator": true + "document.createElement": true } }, - "lottie-web": { - "globals": { - "Blob": true, - "Howl": true, - "OffscreenCanvas": true, - "URL.createObjectURL": true, - "Worker": true, - "XMLHttpRequest": true, - "bodymovin": "write", - "clearInterval": true, - "console": true, - "define": true, - "document.body": true, - "document.createElement": true, - "document.createElementNS": true, - "document.getElementsByClassName": true, - "document.getElementsByTagName": true, - "document.querySelectorAll": true, - "document.readyState": true, - "location.origin": true, - "location.pathname": true, - "navigator": true, - "requestAnimationFrame": true, - "setInterval": true, - "setTimeout": true + "path-browserify": { + "packages": { + "process": true } }, - "luxon": { - "globals": { - "Intl": true + "serve-handler>path-to-regexp": { + "packages": { + "serve-handler>path-to-regexp>isarray": true } }, - "nanoid": { + "crypto-browserify>pbkdf2": { "globals": { "crypto": true, - "msCrypto": true, - "navigator": true + "process": true, + "queueMicrotask": true, + "setImmediate": true, + "setTimeout": true + }, + "packages": { + "ethereumjs-util>create-hash": true, + "process": true, + "ethereumjs-util>create-hash>ripemd160": true, + "koa>content-disposition>safe-buffer": true, + "addons-linter>sha.js": true } }, - "nock>debug": { + "@material-ui/core>popper.js": { "globals": { - "console": true, + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, + "console.warn": true, + "define": true, + "devicePixelRatio": true, "document": true, - "localStorage": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, "navigator": true, - "process": true - }, - "packages": { - "nock>debug>ms": true, - "process": true + "requestAnimationFrame": true, + "setTimeout": true } }, - "node-fetch": { + "react-tippy>popper.js": { "globals": { - "Headers": true, - "Request": true, - "Response": true, - "fetch": true - } - }, - "path-browserify": { - "packages": { - "process": true + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, + "console.warn": true, + "define": true, + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.userAgent": true, + "requestAnimationFrame": true, + "setTimeout": true } }, "process": { @@ -4736,26 +4495,51 @@ "promise-to-callback>set-immediate-shim": true } }, - "promise-to-callback>set-immediate-shim": { + "prop-types": { "globals": { - "setTimeout.apply": true + "console": true }, "packages": { - "browserify>timers-browserify": true + "react>object-assign": true, + "prop-types>react-is": true } }, - "prop-types": { + "react-markdown>property-information": { + "packages": { + "watchify>xtend": true + } + }, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs": { "globals": { - "console": true + "process": true, + "setTimeout": true }, "packages": { - "prop-types>react-is": true, - "react>object-assign": true + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/aspromise": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/base64": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/codegen": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/eventemitter": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/fetch": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/float": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/inquire": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/path": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/pool": true, + "@trezor/connect-web>@trezor/connect>@trezor/protobuf>protobufjs>@protobufjs/utf8": true } }, - "prop-types>react-is": { + "crypto-browserify>public-encrypt": { + "packages": { + "bn.js": true, + "crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "crypto-browserify>public-encrypt>parse-asn1": true, + "crypto-browserify>randombytes": true + } + }, + "browserify>punycode": { "globals": { - "console": true + "define": true } }, "qrcode-generator": { @@ -4772,13 +4556,55 @@ "react": true } }, + "@storybook/addon-knobs>qs": { + "packages": { + "string.prototype.matchall>side-channel": true + } + }, + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": { + "globals": { + "queueMicrotask": true + } + }, + "react-beautiful-dnd>raf-schd": { + "globals": { + "cancelAnimationFrame": true, + "requestAnimationFrame": true + } + }, + "crypto-browserify>randombytes": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "process": true, + "koa>content-disposition>safe-buffer": true + } + }, + "ethereumjs-wallet>randombytes": { + "globals": { + "crypto.getRandomValues": true + } + }, + "crypto-browserify>randomfill": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "process": true, + "crypto-browserify>randombytes": true, + "koa>content-disposition>safe-buffer": true + } + }, "react": { "globals": { "console": true }, "packages": { - "prop-types": true, - "react>object-assign": true + "react>object-assign": true, + "prop-types": true } }, "react-beautiful-dnd": { @@ -4800,43 +4626,28 @@ }, "packages": { "@babel/runtime": true, - "react": true, "react-beautiful-dnd>css-box-model": true, "react-beautiful-dnd>memoize-one": true, "react-beautiful-dnd>raf-schd": true, - "react-beautiful-dnd>use-memo-one": true, + "react": true, "react-dom": true, "react-redux": true, - "redux": true + "redux": true, + "react-beautiful-dnd>use-memo-one": true } }, - "react-beautiful-dnd>css-box-model": { + "react-chartjs-2": { "globals": { - "getComputedStyle": true, - "pageXOffset": true, - "pageYOffset": true + "setTimeout": true }, "packages": { - "react-router-dom>tiny-invariant": true - } - }, - "react-beautiful-dnd>raf-schd": { - "globals": { - "cancelAnimationFrame": true, - "requestAnimationFrame": true - } - }, - "react-beautiful-dnd>use-memo-one": { - "packages": { + "chart.js": true, "react": true } }, - "react-chartjs-2": { - "globals": { - "setTimeout": true - }, + "react-focus-lock>react-clientside-effect": { "packages": { - "chart.js": true, + "@babel/runtime": true, "react": true } }, @@ -4881,22 +4692,28 @@ "trustedTypes": true }, "packages": { + "react>object-assign": true, "prop-types": true, "react": true, - "react-dom>scheduler": true, - "react>object-assign": true + "react-dom>scheduler": true } }, - "react-dom>scheduler": { + "react-responsive-carousel>react-easy-swipe": { "globals": { - "MessageChannel": true, - "cancelAnimationFrame": true, - "clearTimeout": true, - "console": true, - "navigator": true, - "performance": true, - "requestAnimationFrame": true, - "setTimeout": true + "addEventListener": true, + "define": true, + "document.addEventListener": true, + "document.removeEventListener": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-popper>react-fast-compare": { + "globals": { + "Element": true, + "console.warn": true } }, "react-focus-lock": { @@ -4910,636 +4727,726 @@ }, "packages": { "@babel/runtime": true, + "react-focus-lock>focus-lock": true, "prop-types": true, "react": true, - "react-focus-lock>focus-lock": true, "react-focus-lock>react-clientside-effect": true, "react-focus-lock>use-callback-ref": true, "react-focus-lock>use-sidecar": true } }, - "react-focus-lock>focus-lock": { + "react-idle-timer": { "globals": { - "HTMLIFrameElement": true, - "Node.DOCUMENT_FRAGMENT_NODE": true, - "Node.DOCUMENT_NODE": true, - "Node.DOCUMENT_POSITION_CONTAINED_BY": true, - "Node.DOCUMENT_POSITION_CONTAINS": true, - "Node.ELEMENT_NODE": true, - "console.error": true, + "clearTimeout": true, + "document": true, + "setTimeout": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, + "react-inspector": { + "globals": { + "Node": true, + "chromeDark": true, + "chromeLight": true + }, + "packages": { + "react": true + } + }, + "prop-types>react-is": { + "globals": { + "console": true + } + }, + "react-markdown>react-is": { + "globals": { + "console": true + } + }, + "react-redux>react-is": { + "globals": { + "console": true + } + }, + "react-markdown": { + "globals": { + "console.warn": true + }, + "packages": { + "react-markdown>comma-separated-tokens": true, + "prop-types": true, + "react-markdown>property-information": true, + "react": true, + "react-markdown>react-is": true, + "react-markdown>remark-parse": true, + "react-markdown>remark-rehype": true, + "react-markdown>space-separated-tokens": true, + "react-markdown>style-to-object": true, + "react-markdown>unified": true, + "react-markdown>unist-util-visit": true, + "react-markdown>vfile": true + } + }, + "react-popper": { + "globals": { + "document": true + }, + "packages": { + "@popperjs/core": true, + "react": true, + "react-popper>react-fast-compare": true, + "react-popper>warning": true + } + }, + "react-redux": { + "globals": { + "console": true, + "document": true + }, + "packages": { + "@babel/runtime": true, + "react-redux>hoist-non-react-statics": true, + "prop-types": true, + "react": true, + "react-dom": true, + "react-redux>react-is": true + } + }, + "react-responsive-carousel": { + "globals": { + "HTMLElement": true, + "addEventListener": true, + "clearTimeout": true, "console.warn": true, "document": true, - "getComputedStyle": true, + "getComputedStyle": true, + "removeEventListener": true, + "setTimeout": true + }, + "packages": { + "classnames": true, + "react": true, + "react-dom": true, + "react-responsive-carousel>react-easy-swipe": true + } + }, + "react-router-dom": { + "packages": { + "react-router-dom>history": true, + "prop-types": true, + "react": true, + "react-router-dom>react-router": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true + } + }, + "react-router-dom-v5-compat": { + "globals": { + "FormData": true, + "URL": true, + "URLSearchParams": true, + "__reactRouterVersion": "write", + "addEventListener": true, + "confirm": true, + "define": true, + "document": true, + "history.scrollRestoration": true, + "location.href": true, + "removeEventListener": true, + "scrollTo": true, + "scrollY": true, + "sessionStorage.getItem": true, + "sessionStorage.setItem": true, "setTimeout": true }, "packages": { - "@swc/helpers>tslib": true + "react-router-dom-v5-compat>@remix-run/router": true, + "history": true, + "react": true, + "react-dom": true, + "react-router-dom": true, + "react-router-dom-v5-compat>react-router": true } }, - "react-focus-lock>react-clientside-effect": { + "react-router-dom>react-router": { "packages": { - "@babel/runtime": true, - "react": true + "react-router-dom>history": true, + "react-redux>hoist-non-react-statics": true, + "serve-handler>path-to-regexp": true, + "prop-types": true, + "react": true, + "prop-types>react-is": true, + "react-router-dom>tiny-invariant": true, + "react-router-dom>tiny-warning": true } }, - "react-focus-lock>use-callback-ref": { + "react-router-dom-v5-compat>react-router": { + "globals": { + "console.error": true, + "define": true + }, "packages": { + "react-router-dom-v5-compat>@remix-run/router": true, "react": true } }, - "react-focus-lock>use-sidecar": { + "react-simple-file-input": { "globals": { - "console.error": true + "File": true, + "FileReader": true, + "console.warn": true }, "packages": { - "@swc/helpers>tslib": true, - "react": true, - "react-focus-lock>use-sidecar>detect-node-es": true + "prop-types": true, + "react": true } }, - "react-idle-timer": { + "react-tippy": { "globals": { + "Element": true, + "MSStream": true, + "MutationObserver": true, + "addEventListener": true, "clearTimeout": true, + "console.error": true, + "console.warn": true, + "define": true, "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator.maxTouchPoints": true, + "navigator.msMaxTouchPoints": true, + "navigator.userAgent": true, + "performance": true, + "requestAnimationFrame": true, "setTimeout": true }, "packages": { - "prop-types": true, - "react": true + "react-tippy>popper.js": true, + "react": true, + "react-dom": true } }, - "react-inspector": { + "react-toggle-button": { "globals": { - "Node": true, - "chromeDark": true, - "chromeLight": true + "clearTimeout": true, + "console.warn": true, + "define": true, + "performance": true, + "setTimeout": true }, "packages": { "react": true } }, - "react-markdown": { + "@material-ui/core>react-transition-group": { "globals": { - "console.warn": true + "Element": true, + "setTimeout": true }, "packages": { + "@material-ui/core>react-transition-group>dom-helpers": true, "prop-types": true, "react": true, - "react-markdown>comma-separated-tokens": true, - "react-markdown>property-information": true, - "react-markdown>react-is": true, - "react-markdown>remark-parse": true, - "react-markdown>remark-rehype": true, - "react-markdown>space-separated-tokens": true, - "react-markdown>style-to-object": true, - "react-markdown>unified": true, - "react-markdown>unist-util-visit": true, - "react-markdown>vfile": true + "react-dom": true } }, - "react-markdown>property-information": { + "readable-stream": { "packages": { - "watchify>xtend": true + "browserify>browser-resolve": true, + "browserify>buffer": true, + "webpack>events": true, + "pumpify>inherits": true, + "process": true, + "browserify>string_decoder": true, + "readable-stream>util-deprecate": true } }, - "react-markdown>react-is": { + "extension-port-stream>readable-stream": { "globals": { - "console": true - } - }, - "react-markdown>remark-parse": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown": { - "packages": { - "react-markdown>remark-parse>mdast-util-from-markdown>mdast-util-to-string": true, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": true, - "react-markdown>remark-parse>mdast-util-from-markdown>unist-util-stringify-position": true, - "react-syntax-highlighter>refractor>parse-entities": true - } - }, - "react-markdown>remark-parse>mdast-util-from-markdown>micromark": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "ERR_INVALID_ARG_TYPE": true, + "queueMicrotask": true + }, "packages": { - "react-syntax-highlighter>refractor>parse-entities": true + "@lavamoat/lavapack>readable-stream>abort-controller": true, + "browserify>buffer": true, + "webpack>events": true, + "process": true, + "browserify>string_decoder": true } }, - "react-markdown>remark-rehype": { + "@metamask/snaps-controllers>readable-web-to-node-stream": { "packages": { - "react-markdown>remark-rehype>mdast-util-to-hast": true + "readable-stream": true } }, - "react-markdown>remark-rehype>mdast-util-to-hast": { + "redux": { "globals": { - "console.warn": true + "console": true }, "packages": { - "@storybook/addon-docs>remark-external-links>mdast-util-definitions": true, - "react-markdown>remark-rehype>mdast-util-to-hast>mdurl": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-builder": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-generated": true, - "react-markdown>remark-rehype>mdast-util-to-hast>unist-util-position": true, - "react-markdown>unist-util-visit": true + "@babel/runtime": true } }, - "react-markdown>style-to-object": { + "string.prototype.matchall>regexp.prototype.flags": { "packages": { - "react-markdown>style-to-object>inline-style-parser": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": true } }, - "react-markdown>unified": { + "react-markdown>remark-parse": { "packages": { - "mocha>yargs-unparser>is-plain-obj": true, - "react-markdown>unified>bail": true, - "react-markdown>unified>extend": true, - "react-markdown>unified>is-buffer": true, - "react-markdown>unified>trough": true, - "react-markdown>vfile": true + "react-markdown>remark-parse>mdast-util-from-markdown": true } }, - "react-markdown>unist-util-visit": { + "react-markdown>remark-rehype": { "packages": { - "react-markdown>unist-util-visit>unist-util-visit-parents": true + "react-markdown>remark-rehype>mdast-util-to-hast": true } }, - "react-markdown>unist-util-visit>unist-util-visit-parents": { + "react-markdown>vfile>replace-ext": { "packages": { - "react-markdown>unist-util-visit>unist-util-is": true + "path-browserify": true } }, - "react-markdown>vfile": { - "packages": { - "path-browserify": true, - "process": true, - "react-markdown>vfile>is-buffer": true, - "react-markdown>vfile>replace-ext": true, - "react-markdown>vfile>vfile-message": true + "reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true } }, - "react-markdown>vfile>replace-ext": { + "@metamask/snaps-utils>rfdc": { "packages": { - "path-browserify": true + "browserify>buffer": true } }, - "react-markdown>vfile>vfile-message": { + "ethereumjs-util>create-hash>ripemd160": { "packages": { - "react-markdown>vfile>unist-util-stringify-position": true + "browserify>buffer": true, + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true } }, - "react-popper": { - "globals": { - "document": true - }, + "@keystonehq/metamask-airgapped-keyring>rlp": { "packages": { - "@popperjs/core": true, - "react": true, - "react-popper>react-fast-compare": true, - "react-popper>warning": true + "bn.js": true, + "browserify>buffer": true } }, - "react-popper>react-fast-compare": { + "eth-lattice-keyring>rlp": { "globals": { - "Element": true, - "console.warn": true + "TextEncoder": true } }, - "react-popper>warning": { - "globals": { - "console": true + "ethereumjs-util>rlp": { + "packages": { + "bn.js": true, + "browserify>buffer": true } }, - "react-redux": { - "globals": { - "console": true, - "document": true - }, + "@metamask/keyring-controller>ethereumjs-wallet>ethereumjs-util>rlp": { "packages": { - "@babel/runtime": true, - "prop-types": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true, - "react-redux>react-is": true + "bn.js": true, + "browserify>buffer": true } }, - "react-redux>hoist-non-react-statics": { + "wait-on>rxjs": { + "globals": { + "cancelAnimationFrame": true, + "clearInterval": true, + "clearTimeout": true, + "performance": true, + "requestAnimationFrame": true, + "setInterval.apply": true, + "setTimeout.apply": true + } + }, + "koa>content-disposition>safe-buffer": { "packages": { - "prop-types>react-is": true + "browserify>buffer": true } }, - "react-redux>react-is": { + "react-dom>scheduler": { "globals": { - "console": true + "MessageChannel": true, + "cancelAnimationFrame": true, + "clearTimeout": true, + "console": true, + "navigator": true, + "performance": true, + "requestAnimationFrame": true, + "setTimeout": true } }, - "react-responsive-carousel": { + "ethers>@ethersproject/json-wallets>scrypt-js": { "globals": { - "addEventListener": true, - "removeEventListener": true + "define": true, + "setTimeout": true + }, + "packages": { + "browserify>timers-browserify": true } }, - "react-router-dom": { + "ganache>secp256k1": { "packages": { - "prop-types": true, - "react": true, - "react-router-dom>history": true, - "react-router-dom>react-router": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "@metamask/ppom-validator>elliptic": true } }, - "react-router-dom-v5-compat": { + "semver": { "globals": { - "FormData": true, - "URL": true, - "URLSearchParams": true, - "__reactRouterVersion": "write", - "addEventListener": true, - "confirm": true, - "define": true, - "document": true, - "history.scrollRestoration": true, - "location.href": true, - "removeEventListener": true, - "scrollTo": true, - "scrollY": true, - "sessionStorage.getItem": true, - "sessionStorage.setItem": true, - "setTimeout": true + "console.error": true }, "packages": { - "history": true, - "react": true, - "react-dom": true, - "react-router-dom": true, - "react-router-dom-v5-compat>@remix-run/router": true, - "react-router-dom-v5-compat>react-router": true + "process": true } }, - "react-router-dom-v5-compat>@remix-run/router": { - "globals": { - "AbortController": true, - "DOMException": true, - "FormData": true, - "Headers": true, - "Request": true, - "Response": true, - "URL": true, - "URLSearchParams": true, - "console": true, - "document.defaultView": true + "string.prototype.matchall>call-bind>set-function-length": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>gopd": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom-v5-compat>react-router": { - "globals": { - "console.error": true, - "define": true - }, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": { "packages": { - "react": true, - "react-router-dom-v5-compat>@remix-run/router": true + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true } }, - "react-router-dom>history": { + "promise-to-callback>set-immediate-shim": { "globals": { - "addEventListener": true, - "confirm": true, - "document": true, - "history": true, - "location": true, - "navigator.userAgent": true, - "removeEventListener": true + "setTimeout.apply": true }, "packages": { - "react-router-dom>history>resolve-pathname": true, - "react-router-dom>history>value-equal": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true + "browserify>timers-browserify": true } }, - "react-router-dom>react-router": { + "addons-linter>sha.js": { "packages": { - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-redux>hoist-non-react-statics": true, - "react-router-dom>history": true, - "react-router-dom>tiny-invariant": true, - "react-router-dom>tiny-warning": true, - "serve-handler>path-to-regexp": true + "pumpify>inherits": true, + "koa>content-disposition>safe-buffer": true } }, - "react-router-dom>tiny-warning": { - "globals": { - "console": true + "string.prototype.matchall>side-channel": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>object-inspect": true } }, - "react-simple-file-input": { + "@metamask/profile-sync-controller>siwe": { "globals": { - "File": true, - "FileReader": true, + "console.error": true, "console.warn": true }, "packages": { - "prop-types": true, - "react": true + "@metamask/profile-sync-controller>siwe>@spruceid/siwe-parser": true, + "@metamask/profile-sync-controller>siwe>@stablelib/random": true, + "ethers": true, + "@metamask/controller-utils>@spruceid/siwe-parser>valid-url": true } }, - "react-syntax-highlighter>refractor>parse-entities": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>stop-iteration-iterator": { "globals": { - "document.createElement": true + "StopIteration": true + }, + "packages": { + "string.prototype.matchall>internal-slot": true } }, - "react-tippy": { + "stream-browserify": { + "packages": { + "webpack>events": true, + "pumpify>inherits": true, + "readable-stream": true + } + }, + "stream-http": { "globals": { - "Element": true, - "MSStream": true, - "MutationObserver": true, - "addEventListener": true, + "AbortController": true, + "Blob": true, + "MSStreamReader": true, + "ReadableStream": true, + "WritableStream": true, + "XDomainRequest": true, + "XMLHttpRequest": true, "clearTimeout": true, - "console.error": true, - "console.warn": true, - "define": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.maxTouchPoints": true, - "navigator.msMaxTouchPoints": true, - "navigator.userAgent": true, - "performance": true, - "requestAnimationFrame": true, + "fetch": true, + "location.protocol.search": true, "setTimeout": true }, "packages": { - "react": true, - "react-dom": true, - "react-tippy>popper.js": true + "browserify>buffer": true, + "stream-http>builtin-status-codes": true, + "pumpify>inherits": true, + "process": true, + "readable-stream": true, + "browserify>url": true, + "watchify>xtend": true } }, - "react-tippy>popper.js": { - "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, - "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator.userAgent": true, - "requestAnimationFrame": true, - "setTimeout": true + "@metamask/snaps-controllers>tar-stream>streamx": { + "packages": { + "webpack>events": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx>queue-tick": true } }, - "react-toggle-button": { - "globals": { - "clearTimeout": true, - "console.warn": true, - "define": true, - "performance": true, - "setTimeout": true - }, + "browserify>string_decoder": { "packages": { - "react": true + "koa>content-disposition>safe-buffer": true } }, - "readable-stream": { + "@metamask/ethjs>@metamask/ethjs-util>strip-hex-prefix": { + "packages": { + "@metamask/ethjs>@metamask/ethjs-util>is-hex-prefixed": true + } + }, + "react-markdown>style-to-object": { "packages": { + "react-markdown>style-to-object>inline-style-parser": true + } + }, + "@metamask/snaps-controllers>tar-stream": { + "packages": { + "@metamask/snaps-controllers>tar-stream>b4a": true, "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>string_decoder": true, + "@metamask/snaps-controllers>tar-stream>fast-fifo": true, + "@metamask/snaps-controllers>tar-stream>streamx": true + } + }, + "debounce-stream>through": { + "packages": { "process": true, - "pumpify>inherits": true, - "readable-stream>util-deprecate": true, - "webpack>events": true + "stream-browserify": true } }, - "readable-stream>util-deprecate": { + "browserify>timers-browserify": { "globals": { - "console.trace": true, - "console.warn": true, - "localStorage": true + "clearInterval": true, + "clearTimeout": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "process": true } }, - "redux": { + "react-router-dom>tiny-warning": { "globals": { "console": true - }, - "packages": { - "@babel/runtime": true } }, - "semver": { + "copy-to-clipboard>toggle-selection": { "globals": { - "console.error": true - }, - "packages": { - "process": true + "document.activeElement": true, + "document.getSelection": true } }, - "serve-handler>path-to-regexp": { + "@swc/helpers>tslib": { + "globals": { + "SuppressedError": true, + "define": true + } + }, + "@metamask/eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, "packages": { - "serve-handler>path-to-regexp>isarray": true + "browserify>browser-resolve": true } }, - "stream-browserify": { - "packages": { - "pumpify>inherits": true, - "readable-stream": true, - "webpack>events": true + "@trezor/connect-web>@trezor/connect-common>@trezor/env-utils>ua-parser-js": { + "globals": { + "define": true } }, - "stream-http": { + "@ensdomains/content-hash>cids>uint8arrays": { "globals": { - "AbortController": true, - "Blob": true, - "MSStreamReader": true, - "ReadableStream": true, - "WritableStream": true, - "XDomainRequest": true, - "XMLHttpRequest": true, - "clearTimeout": true, - "fetch": true, - "location.protocol.search": true, - "setTimeout": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "browserify>buffer": true, - "browserify>url": true, - "process": true, - "pumpify>inherits": true, - "readable-stream": true, - "stream-http>builtin-status-codes": true, - "watchify>xtend": true + "@ensdomains/content-hash>cids>multibase": true } }, - "string.prototype.matchall>call-bind": { + "@ensdomains/content-hash>multicodec>uint8arrays": { + "globals": { + "Buffer": true, + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>has>function-bind": true, - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>call-bind>set-function-length": true, - "string.prototype.matchall>get-intrinsic": true + "@ensdomains/content-hash>multicodec>uint8arrays>multiformats": true } }, - "string.prototype.matchall>call-bind>es-define-property": { + "react-markdown>unified": { "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unified>bail": true, + "react-markdown>unified>extend": true, + "react-markdown>unified>is-buffer": true, + "mocha>yargs-unparser>is-plain-obj": true, + "react-markdown>unified>trough": true, + "react-markdown>vfile": true } }, - "string.prototype.matchall>call-bind>set-function-length": { + "react-markdown>unist-util-visit>unist-util-visit-parents": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>gopd": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>unist-util-visit>unist-util-is": true } }, - "string.prototype.matchall>define-properties": { + "react-markdown>unist-util-visit": { "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "react-markdown>unist-util-visit>unist-util-visit-parents": true } }, - "string.prototype.matchall>define-properties>define-data-property": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>gopd": true + "uri-js": { + "globals": { + "define": true } }, - "string.prototype.matchall>es-abstract>array-buffer-byte-length": { + "browserify>url": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>is-array-buffer": true + "browserify>punycode": true, + "@storybook/addon-knobs>qs": true } }, - "string.prototype.matchall>es-abstract>available-typed-arrays": { + "react-focus-lock>use-callback-ref": { "packages": { - "string.prototype.matchall>es-abstract>typed-array-length>possible-typed-array-names": true + "react": true } }, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "react-beautiful-dnd>use-memo-one": { "packages": { - "string.prototype.matchall>has-symbols": true + "react": true } }, - "string.prototype.matchall>es-abstract>gopd": { + "react-focus-lock>use-sidecar": { + "globals": { + "console.error": true + }, "packages": { - "string.prototype.matchall>get-intrinsic": true + "react-focus-lock>use-sidecar>detect-node-es": true, + "react": true, + "@swc/helpers>tslib": true } }, - "string.prototype.matchall>es-abstract>has-property-descriptors": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true + "readable-stream>util-deprecate": { + "globals": { + "console.trace": true, + "console.warn": true, + "localStorage": true } }, - "string.prototype.matchall>es-abstract>is-array-buffer": { + "browserify>assert>util": { + "globals": { + "console.error": true, + "console.log": true, + "console.trace": true, + "process": true + }, "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true + "browserify>assert>util>inherits": true, + "process": true } }, - "string.prototype.matchall>es-abstract>is-callable": { + "browserify>util": { "globals": { - "document": true - } - }, - "string.prototype.matchall>es-abstract>is-regex": { + "console.error": true, + "console.log": true, + "console.trace": true + }, "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "pumpify>inherits": true, + "browserify>util>is-arguments": true, + "koa>is-generator-function": true, + "browserify>util>is-typed-array": true, + "process": true, + "browserify>util>which-typed-array": true } }, - "string.prototype.matchall>es-abstract>is-shared-array-buffer": { - "packages": { - "string.prototype.matchall>call-bind": true + "uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "string.prototype.matchall>es-abstract>object-inspect": { + "@metamask/eth-snap-keyring>uuid": { "globals": { - "HTMLElement": true, - "WeakRef": true - }, - "packages": { - "browserify>browser-resolve": true + "crypto": true } }, - "string.prototype.matchall>get-intrinsic": { + "@metamask/keyring-snap-client>uuid": { "globals": { - "AggregateError": true, - "FinalizationRegistry": true, - "WeakRef": true - }, - "packages": { - "browserify>has>function-bind": true, - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>has-proto": true, - "string.prototype.matchall>has-symbols": true + "crypto": true } }, - "string.prototype.matchall>internal-slot": { - "packages": { - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>side-channel": true + "eth-lattice-keyring>gridplus-sdk>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": true + "web3-stream-provider>uuid": { + "globals": { + "crypto": true } }, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": { + "@metamask/snaps-utils>validate-npm-package-name": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "@metamask/snaps-utils>validate-npm-package-name>builtins": true } }, - "string.prototype.matchall>side-channel": { + "react-markdown>vfile>vfile-message": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>object-inspect": true, - "string.prototype.matchall>get-intrinsic": true + "react-markdown>vfile>unist-util-stringify-position": true } }, - "terser>source-map-support>buffer-from": { + "react-markdown>vfile": { "packages": { - "browserify>buffer": true + "react-markdown>vfile>is-buffer": true, + "path-browserify": true, + "process": true, + "react-markdown>vfile>replace-ext": true, + "react-markdown>vfile>vfile-message": true } }, - "uri-js": { + "browserify>vm-browserify": { "globals": { - "define": true + "document.body.appendChild": true, + "document.body.removeChild": true, + "document.createElement": true } }, - "uuid": { + "react-popper>warning": { "globals": { - "crypto": true, - "msCrypto": true + "console": true } }, - "wait-on>rxjs": { + "@ensdomains/content-hash>multihashes>web-encoding": { "globals": { - "cancelAnimationFrame": true, - "clearInterval": true, - "clearTimeout": true, - "performance": true, - "requestAnimationFrame": true, - "setInterval.apply": true, - "setTimeout.apply": true + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "browserify>util": true } }, "web3": { @@ -5552,14 +5459,14 @@ "setTimeout": true }, "packages": { - "browserify>util": true, "readable-stream": true, + "browserify>util": true, "web3-stream-provider>uuid": true } }, - "web3-stream-provider>uuid": { + "@metamask/controllers>web3": { "globals": { - "crypto": true + "XMLHttpRequest": true } }, "webextension-polyfill": { @@ -5571,9 +5478,35 @@ "define": true } }, - "webpack>events": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-bigint": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-boolean-object": true, + "@metamask/eth-token-tracker>deep-equal>which-boxed-primitive>is-number-object": true, + "eslint-plugin-react>array-includes>is-string": true, + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true + } + }, + "@metamask/eth-token-tracker>deep-equal>which-collection": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-map": true, + "@metamask/eth-token-tracker>deep-equal>es-get-iterator>is-set": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakmap": true, + "@metamask/eth-token-tracker>deep-equal>which-collection>is-weakset": true + } + }, + "browserify>util>which-typed-array": { + "packages": { + "string.prototype.matchall>es-abstract>available-typed-arrays": true, + "string.prototype.matchall>call-bind": true, + "browserify>util>which-typed-array>for-each": true, + "string.prototype.matchall>es-abstract>gopd": true, + "koa>is-generator-function>has-tostringtag": true + } + }, + "@metamask/ethjs>@metamask/ethjs-provider-http>xhr2": { "globals": { - "console": true + "XMLHttpRequest": true } } } diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index 5338922720ef..50fdd1a0f063 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -1,57 +1,25 @@ { "resources": { - "@babel/code-frame": { + "@babel/core>@ampproject/remapping": { "globals": { - "console.warn": true, - "process": true + "define": true }, "packages": { - "@babel/code-frame>@babel/highlight": true, - "postcss>picocolors": true + "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true, + "terser-webpack-plugin>@jridgewell/trace-mapping": true } }, - "@babel/code-frame>@babel/highlight": { + "@babel/code-frame": { "globals": { + "console.warn": true, "process": true }, "packages": { - "@babel/code-frame>@babel/highlight>chalk": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true, + "@babel/code-frame>@babel/helper-validator-identifier": true, "loose-envify>js-tokens": true, "postcss>picocolors": true } }, - "@babel/code-frame>@babel/highlight>chalk": { - "globals": { - "process.env.TERM": true, - "process.platform": true - }, - "packages": { - "@babel/code-frame>@babel/highlight>chalk>ansi-styles": true, - "@babel/code-frame>@babel/highlight>chalk>escape-string-regexp": true, - "@babel/code-frame>@babel/highlight>chalk>supports-color": true - } - }, - "@babel/code-frame>@babel/highlight>chalk>ansi-styles": { - "packages": { - "@metamask/jazzicon>color>color-convert": true - } - }, - "@babel/code-frame>@babel/highlight>chalk>supports-color": { - "builtin": { - "os.release": true - }, - "globals": { - "process.env": true, - "process.platform": true, - "process.stderr": true, - "process.stdout": true, - "process.versions.node.split": true - }, - "packages": { - "gulp-livereload>chalk>supports-color>has-flag": true - } - }, "@babel/core": { "builtin": { "assert": true, @@ -75,18 +43,13 @@ }, "packages": { "$root$": true, - "@babel/code-frame": true, "@babel/core>@ampproject/remapping": true, + "@babel/code-frame": true, "@babel/core>@babel/generator": true, "@babel/core>@babel/helper-compilation-targets": true, "@babel/core>@babel/helper-module-transforms": true, "@babel/core>@babel/helpers": true, "@babel/core>@babel/parser": true, - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true, - "@babel/core>convert-source-map": true, - "@babel/core>gensync": true, - "@babel/core>semver": true, "@babel/plugin-proposal-class-properties": true, "@babel/plugin-proposal-nullish-coalescing-operator": true, "@babel/plugin-proposal-object-rest-spread": true, @@ -96,18 +59,44 @@ "@babel/preset-env": true, "@babel/preset-react": true, "@babel/preset-typescript": true, + "@babel/core>@babel/template": true, "depcheck>@babel/traverse": true, + "@babel/core>@babel/types": true, + "@babel/core>convert-source-map": true, + "nock>debug": true, + "@babel/core>gensync": true, "depcheck>json5": true, - "nock>debug": true + "@babel/core>semver": true } }, - "@babel/core>@ampproject/remapping": { + "@babel/eslint-parser": { + "builtin": { + "module": true, + "path": true, + "worker_threads": true + }, "globals": { - "define": true + "__dirname": true, + "process.cwd": true, + "process.versions": true }, "packages": { - "terser-webpack-plugin>@jridgewell/trace-mapping": true, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true + "@babel/core": true, + "@babel/parser": true, + "@babel/core>@babel/parser": true, + "depcheck>@babel/parser": true, + "lavamoat>lavamoat-tofu>@babel/parser": true, + "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals": true, + "eslint": true, + "@babel/eslint-parser>eslint-scope": true, + "@babel/eslint-parser>eslint-visitor-keys": true, + "@babel/eslint-parser>semver": true + } + }, + "@babel/eslint-plugin": { + "packages": { + "eslint": true, + "@babel/eslint-plugin>eslint-rule-composer": true } }, "@babel/core>@babel/generator": { @@ -116,15 +105,20 @@ "console.warn": true }, "packages": { - "@babel/core>@babel/generator>jsesc": true, "@babel/core>@babel/types": true, + "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true, "terser-webpack-plugin>@jridgewell/trace-mapping": true, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true + "@babel/core>@babel/generator>jsesc": true } }, - "@babel/core>@babel/generator>jsesc": { - "globals": { - "Buffer": true + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": { + "packages": { + "@babel/core>@babel/types": true + } + }, + "@babel/preset-env>@babel/plugin-transform-exponentiation-operator>@babel/helper-builder-binary-assignment-operator-visitor": { + "packages": { + "@babel/core>@babel/types": true } }, "@babel/core>@babel/helper-compilation-targets": { @@ -135,22 +129,66 @@ "process.versions.node": true }, "packages": { - "@babel/core>@babel/helper-compilation-targets>lru-cache": true, - "@babel/core>@babel/helper-compilation-targets>semver": true, "@babel/preset-env>@babel/compat-data": true, "@babel/preset-env>@babel/helper-validator-option": true, - "browserslist": true + "browserslist": true, + "@babel/core>@babel/helper-compilation-targets>lru-cache": true, + "@babel/core>@babel/helper-compilation-targets>semver": true } }, - "@babel/core>@babel/helper-compilation-targets>lru-cache": { + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": { + "globals": { + "console.warn": true + }, "packages": { - "@babel/core>@babel/helper-compilation-targets>lru-cache>yallist": true + "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-member-expression-to-functions": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-optimise-call-expression": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers": true, + "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true, + "depcheck>@babel/traverse": true, + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin>semver": true } }, - "@babel/core>@babel/helper-compilation-targets>semver": { + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": { + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>semver": true + } + }, + "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": { + "builtin": { + "module": true, + "path": true + }, "globals": { - "console": true, - "process": true + "console.log": true, + "console.warn": true, + "process.exitCode": "write", + "process.versions.node": true + }, + "packages": { + "@babel/core": true, + "@babel/core>@babel/helper-compilation-targets": true, + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider>lodash.debounce": true, + "depcheck>resolve": true + } + }, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-member-expression-to-functions": { + "packages": { + "@babel/core>@babel/types": true + } + }, + "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": { + "builtin": { + "assert": true + }, + "packages": { + "@babel/core>@babel/types": true } }, "@babel/core>@babel/helper-module-transforms": { @@ -163,242 +201,112 @@ "@babel/core": true, "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": true, "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": true, - "depcheck>@babel/traverse": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true + "@babel/code-frame>@babel/helper-validator-identifier": true, + "depcheck>@babel/traverse": true } }, - "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": { - "builtin": { - "assert": true - }, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-optimise-call-expression": { "packages": { "@babel/core>@babel/types": true } }, + "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator": { + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, + "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator>@babel/helper-wrap-function": true, + "depcheck>@babel/traverse": true + } + }, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers": { + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-member-expression-to-functions": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-optimise-call-expression": true, + "depcheck>@babel/traverse": true + } + }, "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": { "packages": { "@babel/core>@babel/types": true } }, - "@babel/core>@babel/helpers": { + "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": { + "packages": { + "@babel/core>@babel/types": true + } + }, + "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator>@babel/helper-wrap-function": { "packages": { "@babel/core>@babel/template": true, + "depcheck>@babel/traverse": true, "@babel/core>@babel/types": true } }, - "@babel/core>@babel/template": { + "@babel/core>@babel/helpers": { "packages": { - "@babel/code-frame": true, - "@babel/core>@babel/parser": true, + "@babel/core>@babel/template": true, "@babel/core>@babel/types": true } }, - "@babel/core>@babel/types": { - "globals": { - "console.warn": true, - "process.env": true - }, + "@babel/preset-env>@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "packages": { - "@babel/core>@babel/types>@babel/helper-string-parser": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true + "@babel/preset-env>@babel/helper-plugin-utils": true, + "depcheck>@babel/traverse": true } }, - "@babel/core>convert-source-map": { - "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "value": true + "@babel/preset-env>@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/core>semver": { - "globals": { - "console": true, - "process": true + "@babel/preset-env>@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "packages": { + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/eslint-parser": { - "builtin": { - "module": true, - "path": true, - "worker_threads": true - }, - "globals": { - "__dirname": true, - "process.cwd": true, - "process.versions": true - }, + "@babel/preset-env>@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "packages": { "@babel/core": true, - "@babel/core>@babel/parser": true, - "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals": true, - "@babel/eslint-parser>eslint-scope": true, - "@babel/eslint-parser>eslint-visitor-keys": true, - "@babel/eslint-parser>semver": true, - "@babel/parser": true, - "depcheck>@babel/parser": true, - "eslint": true, - "lavamoat>lavamoat-tofu>@babel/parser": true + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true, + "@babel/preset-env>@babel/plugin-transform-optional-chaining": true } }, - "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals": { + "@babel/preset-env>@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "packages": { - "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals>eslint-scope": true + "@babel/core": true, + "@babel/preset-env>@babel/helper-plugin-utils": true, + "depcheck>@babel/traverse": true } }, - "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals>eslint-scope": { - "builtin": { - "assert": true - }, + "@babel/preset-env>@babel/plugin-syntax-import-assertions": { "packages": { - "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals>eslint-scope>estraverse": true, - "eslint>eslint-scope>esrecurse": true + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/eslint-parser>semver": { - "globals": { - "console": true, - "process": true + "@babel/preset-env>@babel/plugin-syntax-import-attributes": { + "packages": { + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/eslint-plugin": { + "@babel/preset-typescript>@babel/plugin-syntax-jsx": { "packages": { - "@babel/eslint-plugin>eslint-rule-composer": true, - "eslint": true + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/plugin-transform-logical-assignment-operators": { + "@babel/preset-typescript>@babel/plugin-transform-typescript>@babel/plugin-syntax-typescript": { "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-syntax-logical-assignment-operators": true + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/preset-env": { - "globals": { - "console.log": true, - "console.warn": true, - "process.cwd": true, - "process.env.BABEL_ENV": true - }, - "packages": { - "@babel/core>@babel/helper-compilation-targets": true, - "@babel/plugin-transform-logical-assignment-operators": true, - "@babel/preset-env>@babel/compat-data": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/helper-validator-option": true, - "@babel/preset-env>@babel/plugin-bugfix-firefox-class-in-computed-class-key": true, - "@babel/preset-env>@babel/plugin-bugfix-safari-class-field-initializer-scope": true, - "@babel/preset-env>@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": true, - "@babel/preset-env>@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": true, - "@babel/preset-env>@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": true, - "@babel/preset-env>@babel/plugin-syntax-import-assertions": true, - "@babel/preset-env>@babel/plugin-syntax-import-attributes": true, - "@babel/preset-env>@babel/plugin-syntax-unicode-sets-regex": true, - "@babel/preset-env>@babel/plugin-transform-arrow-functions": true, - "@babel/preset-env>@babel/plugin-transform-async-generator-functions": true, - "@babel/preset-env>@babel/plugin-transform-async-to-generator": true, - "@babel/preset-env>@babel/plugin-transform-block-scoped-functions": true, - "@babel/preset-env>@babel/plugin-transform-block-scoping": true, - "@babel/preset-env>@babel/plugin-transform-class-properties": true, - "@babel/preset-env>@babel/plugin-transform-class-static-block": true, - "@babel/preset-env>@babel/plugin-transform-classes": true, - "@babel/preset-env>@babel/plugin-transform-computed-properties": true, - "@babel/preset-env>@babel/plugin-transform-destructuring": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex": true, - "@babel/preset-env>@babel/plugin-transform-duplicate-keys": true, - "@babel/preset-env>@babel/plugin-transform-duplicate-named-capturing-groups-regex": true, - "@babel/preset-env>@babel/plugin-transform-dynamic-import": true, - "@babel/preset-env>@babel/plugin-transform-exponentiation-operator": true, - "@babel/preset-env>@babel/plugin-transform-export-namespace-from": true, - "@babel/preset-env>@babel/plugin-transform-for-of": true, - "@babel/preset-env>@babel/plugin-transform-function-name": true, - "@babel/preset-env>@babel/plugin-transform-json-strings": true, - "@babel/preset-env>@babel/plugin-transform-literals": true, - "@babel/preset-env>@babel/plugin-transform-member-expression-literals": true, - "@babel/preset-env>@babel/plugin-transform-modules-amd": true, - "@babel/preset-env>@babel/plugin-transform-modules-commonjs": true, - "@babel/preset-env>@babel/plugin-transform-modules-systemjs": true, - "@babel/preset-env>@babel/plugin-transform-modules-umd": true, - "@babel/preset-env>@babel/plugin-transform-named-capturing-groups-regex": true, - "@babel/preset-env>@babel/plugin-transform-new-target": true, - "@babel/preset-env>@babel/plugin-transform-nullish-coalescing-operator": true, - "@babel/preset-env>@babel/plugin-transform-numeric-separator": true, - "@babel/preset-env>@babel/plugin-transform-object-rest-spread": true, - "@babel/preset-env>@babel/plugin-transform-object-super": true, - "@babel/preset-env>@babel/plugin-transform-optional-catch-binding": true, - "@babel/preset-env>@babel/plugin-transform-optional-chaining": true, - "@babel/preset-env>@babel/plugin-transform-parameters": true, - "@babel/preset-env>@babel/plugin-transform-private-methods": true, - "@babel/preset-env>@babel/plugin-transform-private-property-in-object": true, - "@babel/preset-env>@babel/plugin-transform-property-literals": true, - "@babel/preset-env>@babel/plugin-transform-regenerator": true, - "@babel/preset-env>@babel/plugin-transform-reserved-words": true, - "@babel/preset-env>@babel/plugin-transform-shorthand-properties": true, - "@babel/preset-env>@babel/plugin-transform-spread": true, - "@babel/preset-env>@babel/plugin-transform-sticky-regex": true, - "@babel/preset-env>@babel/plugin-transform-template-literals": true, - "@babel/preset-env>@babel/plugin-transform-typeof-symbol": true, - "@babel/preset-env>@babel/plugin-transform-unicode-escapes": true, - "@babel/preset-env>@babel/plugin-transform-unicode-property-regex": true, - "@babel/preset-env>@babel/plugin-transform-unicode-regex": true, - "@babel/preset-env>@babel/plugin-transform-unicode-sets-regex": true, - "@babel/preset-env>@babel/preset-modules": true, - "@babel/preset-env>babel-plugin-polyfill-corejs2": true, - "@babel/preset-env>babel-plugin-polyfill-corejs3": true, - "@babel/preset-env>babel-plugin-polyfill-regenerator": true, - "@babel/preset-env>core-js-compat": true, - "@babel/preset-env>semver": true - } - }, - "@babel/preset-env>@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "depcheck>@babel/traverse": true - } - }, - "@babel/preset-env>@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true - } - }, - "@babel/preset-env>@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true - } - }, - "@babel/preset-env>@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true, - "@babel/preset-env>@babel/plugin-transform-optional-chaining": true - } - }, - "@babel/preset-env>@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "depcheck>@babel/traverse": true - } - }, - "@babel/preset-env>@babel/plugin-syntax-import-assertions": { - "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true - } - }, - "@babel/preset-env>@babel/plugin-syntax-import-attributes": { + "@babel/preset-env>@babel/plugin-syntax-unicode-sets-regex": { "packages": { + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/preset-env>@babel/plugin-syntax-unicode-sets-regex": { - "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true - } - }, "@babel/preset-env>@babel/plugin-transform-arrow-functions": { "packages": { "@babel/preset-env>@babel/helper-plugin-utils": true @@ -420,21 +328,6 @@ "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator": true } }, - "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator>@babel/helper-wrap-function": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, - "depcheck>@babel/traverse": true - } - }, - "@babel/preset-env>@babel/plugin-transform-async-to-generator>@babel/helper-remap-async-to-generator>@babel/helper-wrap-function": { - "packages": { - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true, - "depcheck>@babel/traverse": true - } - }, "@babel/preset-env>@babel/plugin-transform-block-scoped-functions": { "packages": { "@babel/core": true, @@ -449,55 +342,32 @@ }, "@babel/preset-env>@babel/plugin-transform-class-properties": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-class-static-block": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-classes": { "packages": { "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, "@babel/core>@babel/helper-compilation-targets": true, "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers": true, - "@babel/preset-env>@babel/plugin-transform-classes>globals": true, - "depcheck>@babel/traverse": true - } - }, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": { - "packages": { - "@babel/core>@babel/types": true - } - }, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-member-expression-to-functions": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-optimise-call-expression": true, - "depcheck>@babel/traverse": true - } - }, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-member-expression-to-functions": { - "packages": { - "@babel/core>@babel/types": true - } - }, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-optimise-call-expression": { - "packages": { - "@babel/core>@babel/types": true + "depcheck>@babel/traverse": true, + "@babel/preset-env>@babel/plugin-transform-classes>globals": true } }, "@babel/preset-env>@babel/plugin-transform-computed-properties": { "packages": { "@babel/core": true, - "@babel/core>@babel/template": true, - "@babel/preset-env>@babel/helper-plugin-utils": true + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/core>@babel/template": true } }, "@babel/preset-env>@babel/plugin-transform-destructuring": { @@ -508,55 +378,8 @@ }, "@babel/preset-env>@babel/plugin-transform-dotall-regex": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>semver": true - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core": { - "globals": { - "characterClassItem.kind": true - }, - "packages": { - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regenerate": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsgen": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsparser": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-value-ecmascript": true - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regenerate": { - "globals": { - "define": true - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsgen": { - "globals": { - "define": true - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsparser": { - "globals": { - "regjsparser": "write" - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript": { - "packages": { - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript>unicode-canonical-property-names-ecmascript": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript>unicode-property-aliases-ecmascript": true - } - }, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>semver": { - "globals": { - "console": true, - "process": true + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-duplicate-keys": { @@ -567,8 +390,8 @@ }, "@babel/preset-env>@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-dynamic-import": { @@ -579,13 +402,8 @@ "@babel/preset-env>@babel/plugin-transform-exponentiation-operator": { "packages": { "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-exponentiation-operator>@babel/helper-builder-binary-assignment-operator-visitor": true - } - }, - "@babel/preset-env>@babel/plugin-transform-exponentiation-operator>@babel/helper-builder-binary-assignment-operator-visitor": { - "packages": { - "@babel/core>@babel/types": true + "@babel/preset-env>@babel/plugin-transform-exponentiation-operator>@babel/helper-builder-binary-assignment-operator-visitor": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-export-namespace-from": { @@ -601,11 +419,6 @@ "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true } }, - "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": { - "packages": { - "@babel/core>@babel/types": true - } - }, "@babel/preset-env>@babel/plugin-transform-function-name": { "packages": { "@babel/core>@babel/helper-compilation-targets": true, @@ -623,6 +436,13 @@ "@babel/preset-env>@babel/helper-plugin-utils": true } }, + "@babel/plugin-transform-logical-assignment-operators": { + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/preset-env>@babel/plugin-syntax-logical-assignment-operators": true + } + }, "@babel/preset-env>@babel/plugin-transform-member-expression-literals": { "packages": { "@babel/core": true, @@ -640,8 +460,8 @@ "packages": { "@babel/core": true, "@babel/core>@babel/helper-module-transforms": true, - "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": true, - "@babel/preset-env>@babel/helper-plugin-utils": true + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": true } }, "@babel/preset-env>@babel/plugin-transform-modules-systemjs": { @@ -652,8 +472,8 @@ "@babel/core": true, "@babel/core>@babel/helper-module-transforms": true, "@babel/preset-env>@babel/helper-plugin-utils": true, - "depcheck>@babel/traverse": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true + "@babel/code-frame>@babel/helper-validator-identifier": true, + "depcheck>@babel/traverse": true } }, "@babel/preset-env>@babel/plugin-transform-modules-umd": { @@ -669,8 +489,8 @@ }, "@babel/preset-env>@babel/plugin-transform-named-capturing-groups-regex": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-new-target": { @@ -725,41 +545,52 @@ }, "@babel/preset-env>@babel/plugin-transform-private-methods": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": { - "globals": { - "console.warn": true - }, + "@babel/preset-env>@babel/plugin-transform-private-property-in-object": { "packages": { - "@babel/core": true, "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-member-expression-to-functions": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-replace-supers>@babel/helper-optimise-call-expression": true, - "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin>semver": true, - "depcheck>@babel/traverse": true + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin>semver": { - "globals": { - "console": true, - "process": true + "@babel/preset-env>@babel/plugin-transform-property-literals": { + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/preset-env>@babel/plugin-transform-private-property-in-object": { + "@babel/preset-react>@babel/plugin-transform-react-display-name": { + "builtin": { + "path.basename": true, + "path.dirname": true, + "path.extname": true + }, "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/core": true, + "@babel/preset-env>@babel/helper-plugin-utils": true + } + }, + "@babel/preset-react>@babel/plugin-transform-react-jsx-development": { + "packages": { + "@babel/preset-react>@babel/plugin-transform-react-jsx": true + } + }, + "@babel/preset-react>@babel/plugin-transform-react-jsx": { + "packages": { + "@babel/core": true, "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true + "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": true, + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/preset-typescript>@babel/plugin-syntax-jsx": true } }, - "@babel/preset-env>@babel/plugin-transform-property-literals": { + "@babel/preset-react>@babel/plugin-transform-react-pure-annotations": { "packages": { "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, "@babel/preset-env>@babel/helper-plugin-utils": true } }, @@ -769,15 +600,6 @@ "@babel/preset-env>@babel/plugin-transform-regenerator>regenerator-transform": true } }, - "@babel/preset-env>@babel/plugin-transform-regenerator>regenerator-transform": { - "builtin": { - "assert": true, - "util.inherits": true - }, - "packages": { - "@babel/runtime": true - } - }, "@babel/preset-env>@babel/plugin-transform-reserved-words": { "packages": { "@babel/core": true, @@ -815,6 +637,22 @@ "@babel/preset-env>@babel/helper-plugin-utils": true } }, + "@babel/preset-typescript>@babel/plugin-transform-typescript": { + "builtin": { + "assert": true + }, + "globals": { + "console.warn": true + }, + "packages": { + "@babel/core": true, + "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true, + "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true, + "@babel/preset-typescript>@babel/plugin-transform-typescript>@babel/plugin-syntax-typescript": true + } + }, "@babel/preset-env>@babel/plugin-transform-unicode-escapes": { "packages": { "@babel/core": true, @@ -823,77 +661,97 @@ }, "@babel/preset-env>@babel/plugin-transform-unicode-property-regex": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-unicode-regex": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, "@babel/preset-env>@babel/plugin-transform-unicode-sets-regex": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true - } - }, - "@babel/preset-env>babel-plugin-polyfill-corejs2": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/compat-data": true, - "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": true, - "@babel/preset-env>babel-plugin-polyfill-corejs2>semver": true + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin": true, + "@babel/preset-env>@babel/helper-plugin-utils": true } }, - "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": { - "builtin": { - "module": true, - "path": true - }, + "@babel/preset-env": { "globals": { "console.log": true, "console.warn": true, - "process.exitCode": "write", - "process.versions.node": true + "process.cwd": true, + "process.env.BABEL_ENV": true }, "packages": { - "@babel/core": true, + "@babel/preset-env>@babel/compat-data": true, "@babel/core>@babel/helper-compilation-targets": true, "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider>lodash.debounce": true, - "depcheck>resolve": true - } - }, - "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider>lodash.debounce": { - "globals": { - "clearTimeout": true, - "setTimeout": true - } - }, - "@babel/preset-env>babel-plugin-polyfill-corejs2>semver": { - "globals": { - "console": true, - "process": true - } - }, - "@babel/preset-env>babel-plugin-polyfill-corejs3": { - "packages": { - "@babel/core": true, - "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": true, - "@babel/preset-env>core-js-compat": true - } - }, - "@babel/preset-env>babel-plugin-polyfill-regenerator": { - "packages": { - "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": true - } - }, - "@babel/preset-env>semver": { - "globals": { - "console": true, - "process": true + "@babel/preset-env>@babel/helper-validator-option": true, + "@babel/preset-env>@babel/plugin-bugfix-firefox-class-in-computed-class-key": true, + "@babel/preset-env>@babel/plugin-bugfix-safari-class-field-initializer-scope": true, + "@babel/preset-env>@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": true, + "@babel/preset-env>@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": true, + "@babel/preset-env>@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": true, + "@babel/preset-env>@babel/plugin-syntax-import-assertions": true, + "@babel/preset-env>@babel/plugin-syntax-import-attributes": true, + "@babel/preset-env>@babel/plugin-syntax-unicode-sets-regex": true, + "@babel/preset-env>@babel/plugin-transform-arrow-functions": true, + "@babel/preset-env>@babel/plugin-transform-async-generator-functions": true, + "@babel/preset-env>@babel/plugin-transform-async-to-generator": true, + "@babel/preset-env>@babel/plugin-transform-block-scoped-functions": true, + "@babel/preset-env>@babel/plugin-transform-block-scoping": true, + "@babel/preset-env>@babel/plugin-transform-class-properties": true, + "@babel/preset-env>@babel/plugin-transform-class-static-block": true, + "@babel/preset-env>@babel/plugin-transform-classes": true, + "@babel/preset-env>@babel/plugin-transform-computed-properties": true, + "@babel/preset-env>@babel/plugin-transform-destructuring": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex": true, + "@babel/preset-env>@babel/plugin-transform-duplicate-keys": true, + "@babel/preset-env>@babel/plugin-transform-duplicate-named-capturing-groups-regex": true, + "@babel/preset-env>@babel/plugin-transform-dynamic-import": true, + "@babel/preset-env>@babel/plugin-transform-exponentiation-operator": true, + "@babel/preset-env>@babel/plugin-transform-export-namespace-from": true, + "@babel/preset-env>@babel/plugin-transform-for-of": true, + "@babel/preset-env>@babel/plugin-transform-function-name": true, + "@babel/preset-env>@babel/plugin-transform-json-strings": true, + "@babel/preset-env>@babel/plugin-transform-literals": true, + "@babel/plugin-transform-logical-assignment-operators": true, + "@babel/preset-env>@babel/plugin-transform-member-expression-literals": true, + "@babel/preset-env>@babel/plugin-transform-modules-amd": true, + "@babel/preset-env>@babel/plugin-transform-modules-commonjs": true, + "@babel/preset-env>@babel/plugin-transform-modules-systemjs": true, + "@babel/preset-env>@babel/plugin-transform-modules-umd": true, + "@babel/preset-env>@babel/plugin-transform-named-capturing-groups-regex": true, + "@babel/preset-env>@babel/plugin-transform-new-target": true, + "@babel/preset-env>@babel/plugin-transform-nullish-coalescing-operator": true, + "@babel/preset-env>@babel/plugin-transform-numeric-separator": true, + "@babel/preset-env>@babel/plugin-transform-object-rest-spread": true, + "@babel/preset-env>@babel/plugin-transform-object-super": true, + "@babel/preset-env>@babel/plugin-transform-optional-catch-binding": true, + "@babel/preset-env>@babel/plugin-transform-optional-chaining": true, + "@babel/preset-env>@babel/plugin-transform-parameters": true, + "@babel/preset-env>@babel/plugin-transform-private-methods": true, + "@babel/preset-env>@babel/plugin-transform-private-property-in-object": true, + "@babel/preset-env>@babel/plugin-transform-property-literals": true, + "@babel/preset-env>@babel/plugin-transform-regenerator": true, + "@babel/preset-env>@babel/plugin-transform-reserved-words": true, + "@babel/preset-env>@babel/plugin-transform-shorthand-properties": true, + "@babel/preset-env>@babel/plugin-transform-spread": true, + "@babel/preset-env>@babel/plugin-transform-sticky-regex": true, + "@babel/preset-env>@babel/plugin-transform-template-literals": true, + "@babel/preset-env>@babel/plugin-transform-typeof-symbol": true, + "@babel/preset-env>@babel/plugin-transform-unicode-escapes": true, + "@babel/preset-env>@babel/plugin-transform-unicode-property-regex": true, + "@babel/preset-env>@babel/plugin-transform-unicode-regex": true, + "@babel/preset-env>@babel/plugin-transform-unicode-sets-regex": true, + "@babel/preset-env>@babel/preset-modules": true, + "@babel/preset-env>babel-plugin-polyfill-corejs2": true, + "@babel/preset-env>babel-plugin-polyfill-corejs3": true, + "@babel/preset-env>babel-plugin-polyfill-regenerator": true, + "@babel/preset-env>core-js-compat": true, + "@babel/preset-env>semver": true } }, "@babel/preset-react": { @@ -901,214 +759,252 @@ "@babel/preset-env>@babel/helper-plugin-utils": true, "@babel/preset-env>@babel/helper-validator-option": true, "@babel/preset-react>@babel/plugin-transform-react-display-name": true, - "@babel/preset-react>@babel/plugin-transform-react-jsx": true, "@babel/preset-react>@babel/plugin-transform-react-jsx-development": true, + "@babel/preset-react>@babel/plugin-transform-react-jsx": true, "@babel/preset-react>@babel/plugin-transform-react-pure-annotations": true } }, - "@babel/preset-react>@babel/plugin-transform-react-display-name": { - "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true - }, - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true - } - }, - "@babel/preset-react>@babel/plugin-transform-react-jsx": { - "packages": { - "@babel/core": true, - "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, - "@babel/preset-typescript>@babel/plugin-syntax-jsx": true - } - }, - "@babel/preset-react>@babel/plugin-transform-react-jsx-development": { - "packages": { - "@babel/preset-react>@babel/plugin-transform-react-jsx": true - } - }, - "@babel/preset-react>@babel/plugin-transform-react-pure-annotations": { - "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true - } - }, "@babel/preset-typescript": { "packages": { "@babel/preset-env>@babel/helper-plugin-utils": true, "@babel/preset-env>@babel/helper-validator-option": true, - "@babel/preset-env>@babel/plugin-transform-modules-commonjs": true, "@babel/preset-typescript>@babel/plugin-syntax-jsx": true, + "@babel/preset-env>@babel/plugin-transform-modules-commonjs": true, "@babel/preset-typescript>@babel/plugin-transform-typescript": true } }, - "@babel/preset-typescript>@babel/plugin-syntax-jsx": { + "@babel/core>@babel/template": { "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true + "@babel/code-frame": true, + "@babel/core>@babel/parser": true, + "@babel/core>@babel/types": true } }, - "@babel/preset-typescript>@babel/plugin-transform-typescript": { - "builtin": { - "assert": true - }, + "depcheck>@babel/traverse": { "globals": { - "console.warn": true + "console.log": true }, "packages": { - "@babel/core": true, - "@babel/preset-env>@babel/helper-plugin-utils": true, - "@babel/preset-env>@babel/plugin-transform-classes>@babel/helper-annotate-as-pure": true, - "@babel/preset-env>@babel/plugin-transform-for-of>@babel/helper-skip-transparent-expression-wrappers": true, - "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin": true, - "@babel/preset-typescript>@babel/plugin-transform-typescript>@babel/plugin-syntax-typescript": true - } - }, - "@babel/preset-typescript>@babel/plugin-transform-typescript>@babel/plugin-syntax-typescript": { - "packages": { - "@babel/preset-env>@babel/helper-plugin-utils": true + "@babel/code-frame": true, + "@babel/core>@babel/generator": true, + "@babel/core>@babel/parser": true, + "@babel/core>@babel/template": true, + "@babel/core>@babel/types": true, + "babel/preset-env>b@babel/types": true, + "nock>debug": true, + "depcheck>@babel/traverse>globals": true } }, - "@babel/register>clone-deep>is-plain-object": { + "@babel/core>@babel/types": { + "globals": { + "console.warn": true, + "process.env": true + }, "packages": { - "gulp>gulp-cli>isobject": true + "@babel/core>@babel/types>@babel/helper-string-parser": true, + "@babel/code-frame>@babel/helper-validator-identifier": true } }, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog": { + "sass-embedded>@bufbuild/protobuf": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "__values": true, + "process": true + } + }, + "ts-node>@cspotcode/source-map-support": { "builtin": { - "events.EventEmitter": true, - "util": true + "fs": true, + "path.isAbsolute": true, + "path.join": true, + "path.normalize": true, + "path.resolve": true, + "url.fileURLToPath": true, + "url.pathToFileURL": true, + "util.inspect": true }, "globals": { - "process.nextTick": true, - "process.stderr": true + "Buffer.from": true, + "URL": true, + "XMLHttpRequest": true, + "console.error": true, + "process": true }, "packages": { - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>are-we-there-yet": true, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge": true, - "@storybook/react>@storybook/node-logger>npmlog>console-control-strings": true, - "nyc>yargs>set-blocking": true + "ts-node>@cspotcode/source-map-support>@jridgewell/trace-mapping": true } }, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>are-we-there-yet": { - "builtin": { - "events.EventEmitter": true, - "util.inherits": true - }, + "eslint-plugin-jsdoc>@es-joy/jsdoccomment": { "packages": { - "koa>delegates": true, - "readable-stream": true + "eslint-plugin-jsdoc>comment-parser": true, + "eslint>esquery": true, + "eslint-plugin-jsdoc>@es-joy/jsdoccomment>jsdoc-type-pratt-parser": true } }, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge": { + "eslint>@eslint-community/eslint-utils": { + "packages": { + "eslint>eslint-visitor-keys": true + } + }, + "eslint>@eslint/eslintrc": { "builtin": { - "util.format": true + "assert": true, + "fs": true, + "module": true, + "os": true, + "path": true, + "url": true, + "util": true }, "globals": { - "clearInterval": true, - "process": true, - "setImmediate": true, - "setInterval": true + "__filename": true, + "process.cwd": true, + "process.emitWarning": true, + "process.platform": true }, "packages": { - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>aproba": true, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width": true, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": true, - "@storybook/react>@storybook/node-logger>npmlog>console-control-strings": true, - "@storybook/react>@storybook/node-logger>npmlog>gauge>has-unicode": true, - "@storybook/react>@storybook/node-logger>npmlog>gauge>wide-align": true, - "nyc>signal-exit": true, - "react>object-assign": true - } - }, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width": { - "packages": { - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": true, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": true, - "gulp>gulp-cli>yargs>string-width>code-point-at": true + "$root$": true, + "@babel/eslint-parser": true, + "@babel/eslint-plugin": true, + "@metamask/eslint-config": true, + "@metamask/eslint-config-nodejs": true, + "@metamask/eslint-config-typescript": true, + "@typescript-eslint/eslint-plugin": true, + "eslint>ajv": true, + "nock>debug": true, + "eslint": true, + "eslint-config-prettier": true, + "eslint-plugin-import": true, + "eslint-plugin-jsdoc": true, + "eslint-plugin-node": true, + "eslint-plugin-prettier": true, + "eslint-plugin-react": true, + "eslint-plugin-react-hooks": true, + "eslint>globals": true, + "eslint>ignore": true, + "eslint>minimatch": true, + "mocha>strip-json-comments": true } }, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": { + "gulp-sourcemaps>@gulp-sourcemaps/identity-map": { "packages": { - "gulp>gulp-cli>yargs>string-width>is-fullwidth-code-point>number-is-nan": true + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>acorn": true, + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>normalize-path": true, + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss": true, + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>source-map": true, + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>through2": true } }, - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": { + "gulp-sourcemaps>@gulp-sourcemaps/map-sources": { "packages": { - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi>ansi-regex": true + "gulp-watch>anymatch>normalize-path": true, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2": true } }, - "@lavamoat/lavapack": { + "eslint>@humanwhocodes/config-array": { "builtin": { - "assert": true, - "buffer.Buffer.from": true, - "fs.promises.readFile": true, - "fs.promises.writeFile": true, - "fs.readFileSync": true, + "path.dirname": true, "path.join": true, "path.relative": true }, + "packages": { + "eslint>@humanwhocodes/config-array>@humanwhocodes/object-schema": true, + "nock>debug": true, + "eslint>minimatch": true + } + }, + "terser>@jridgewell/source-map>@jridgewell/gen-mapping": { "globals": { - "__dirname": true, - "__filename.slice": true, - "console.error": true, - "console.warn": true, - "process.cwd": true, - "setTimeout": true + "define": true }, "packages": { - "@lavamoat/lavapack>combine-source-map": true, - "@lavamoat/lavapack>convert-source-map": true, - "@lavamoat/lavapack>json-stable-stringify": true, - "@lavamoat/lavapack>umd": true, - "browserify>JSONStream": true, - "eslint>espree": true, - "lavamoat-viz>lavamoat-core": true, - "readable-stream": true, - "through2": true + "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/set-array": true, + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": true, + "terser-webpack-plugin>@jridgewell/trace-mapping": true } }, - "@lavamoat/lavapack>combine-source-map": { - "builtin": { - "path.dirname": true, - "path.join": true - }, + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/resolve-uri": { "globals": { - "process.platform": true - }, + "define": true + } + }, + "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/set-array": { + "globals": { + "define": true + } + }, + "terser>@jridgewell/source-map": { "packages": { - "@lavamoat/lavapack>combine-source-map>inline-source-map": true, - "@lavamoat/lavapack>combine-source-map>lodash.memoize": true, - "@lavamoat/lavapack>combine-source-map>source-map": true, - "nyc>convert-source-map": true + "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true, + "terser-webpack-plugin>@jridgewell/trace-mapping": true } }, - "@lavamoat/lavapack>combine-source-map>inline-source-map": { + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": { "globals": { - "Buffer.from": true + "Buffer": true, + "TextDecoder": true, + "define": true + } + }, + "ts-node>@cspotcode/source-map-support>@jridgewell/trace-mapping": { + "globals": { + "define": true }, "packages": { - "@lavamoat/lavapack>combine-source-map>inline-source-map>source-map": true + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/resolve-uri": true, + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": true } }, - "@lavamoat/lavapack>convert-source-map": { + "terser-webpack-plugin>@jridgewell/trace-mapping": { "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "value": true + "define": true + }, + "packages": { + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/resolve-uri": true, + "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": true } }, - "@lavamoat/lavapack>json-stable-stringify": { + "lavamoat>@lavamoat/aa": { + "builtin": { + "node:fs.lstatSync": true, + "node:fs.readFileSync": true, + "node:fs.realpathSync": true, + "node:path.dirname": true, + "node:path.join": true, + "node:path.relative": true + }, "packages": { - "@lavamoat/lavapack>json-stable-stringify>isarray": true, - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "lavamoat>json-stable-stringify>jsonify": true, - "string.prototype.matchall>call-bind": true + "depcheck>resolve": true + } + }, + "@lavamoat/lavapack": { + "builtin": { + "node:assert": true, + "node:buffer.Buffer.from": true, + "node:fs.promises.readFile": true, + "node:fs.promises.writeFile": true, + "node:fs.readFileSync": true, + "node:path.join": true, + "node:path.relative": true + }, + "globals": { + "__dirname": true, + "__filename.slice": true, + "console.error": true, + "console.warn": true, + "process.cwd": true, + "setTimeout": true + }, + "packages": { + "browserify>JSONStream": true, + "@lavamoat/lavapack>combine-source-map": true, + "eslint>espree": true, + "@lavamoat/lavapack>json-stable-stringify": true, + "lavamoat>lavamoat-core": true, + "@lavamoat/lavapack>readable-stream": true, + "through2": true, + "@lavamoat/lavapack>umd": true } }, "@metamask/build-utils": { @@ -1124,37 +1020,16 @@ }, "packages": { "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, "@noble/hashes": true, + "@metamask/utils>@scure/base": true, "nock>debug": true, + "@metamask/utils>pony-cause": true, "semver": true } }, - "@metamask/eth-token-tracker>deep-equal>is-date-object": { - "packages": { - "koa>is-generator-function>has-tostringtag": true - } - }, - "@metamask/jazzicon>color>clone": { - "globals": { - "Buffer": true - } - }, - "@metamask/jazzicon>color>color-convert": { - "packages": { - "@metamask/jazzicon>color>color-convert>color-name": true - } - }, - "@metamask/object-multiplex>once": { + "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals": { "packages": { - "@metamask/object-multiplex>once>wrappy": true - } - }, - "@metamask/utils>@scure/base": { - "globals": { - "TextDecoder": true, - "TextEncoder": true + "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals>eslint-scope": true } }, "@noble/hashes": { @@ -1163,93 +1038,120 @@ "crypto": true } }, - "@sentry/cli>which>isexe": { + "eslint>@nodelib/fs.walk>@nodelib/fs.scandir": { "builtin": { - "fs": true + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readdir": true, + "fs.readdirSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.sep": true }, "globals": { - "TESTING_WINDOWS": true, - "process.env.PATHEXT": true, - "process.getgid": true, - "process.getuid": true, - "process.platform": true - } - }, - "@storybook/addon-knobs>qs": { + "process.versions.node": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "fast-glob>@nodelib/fs.stat": true, + "eslint>@nodelib/fs.walk>@nodelib/fs.scandir>run-parallel": true } }, - "@storybook/core>@storybook/core-server>x-default-browser>default-browser-id>untildify>os-homedir": { + "fast-glob>@nodelib/fs.stat": { "builtin": { - "os.homedir": true - }, - "globals": { - "process.env": true, - "process.getuid": true, - "process.platform": true + "fs.lstat": true, + "fs.lstatSync": true, + "fs.stat": true, + "fs.statSync": true } }, - "@storybook/react>@storybook/node-logger>npmlog>gauge>has-unicode": { + "eslint>@nodelib/fs.walk": { "builtin": { - "os.type": true + "events.EventEmitter": true, + "path.sep": true, + "stream.Readable": true }, "globals": { - "process.env.LANG": true, - "process.env.LC_ALL": true, - "process.env.LC_CTYPE": true + "setImmediate": true + }, + "packages": { + "eslint>@nodelib/fs.walk>@nodelib/fs.scandir": true, + "eslint>@nodelib/fs.walk>fastq": true } }, - "@storybook/react>@storybook/node-logger>npmlog>gauge>wide-align": { - "packages": { - "yargs>string-width": true + "@metamask/utils>@scure/base": { + "globals": { + "TextDecoder": true, + "TextEncoder": true } }, - "@storybook/react>acorn-walk": { + "stylelint>@stylelint/postcss-css-in-js": { "globals": { - "define": true + "__dirname": true + }, + "packages": { + "@babel/core": true, + "stylelint>postcss-syntax": true, + "stylelint>postcss": true } }, - "@storybook/test-runner>jest-circus>p-limit": { + "stylelint>@stylelint/postcss-markdown": { "packages": { - "@storybook/test-runner>jest-circus>p-limit>yocto-queue": true + "stylelint>postcss-html": true, + "stylelint>postcss-syntax": true, + "stylelint>@stylelint/postcss-markdown>remark": true, + "stylelint>@stylelint/postcss-markdown>unist-util-find-all-after": true } }, "@typescript-eslint/eslint-plugin": { "packages": { + "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils": true, "@typescript-eslint/eslint-plugin>@typescript-eslint/utils": true, - "@typescript-eslint/eslint-plugin>tsutils": true, - "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, - "eslint": true, "eslint-plugin-jest>@typescript-eslint/utils": true, "eslint>debug": true, - "eslint>regexpp": true, + "eslint": true, "globby>ignore": true, + "eslint>regexpp": true, "semver": true, + "@typescript-eslint/eslint-plugin>tsutils": true, "typescript": true } }, + "eslint-plugin-jest>@typescript-eslint/experimental-utils": { + "builtin": { + "path": true + }, + "packages": { + "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, + "eslint-plugin-jest>@typescript-eslint/experimental-utils>@typescript-eslint/types": true, + "@typescript-eslint/parser>@typescript-eslint/types": true, + "eslint": true, + "eslint>eslint-scope": true, + "webpack>eslint-scope": true, + "eslint-plugin-jest>@typescript-eslint/experimental-utils>eslint-utils": true, + "eslint>eslint-utils": true + } + }, + "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager": { + "builtin": { + "path": true + }, + "packages": { + "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/types": true, + "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager>@typescript-eslint/visitor-keys": true + } + }, "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils": { "packages": { - "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug": true, "@typescript-eslint/eslint-plugin>@typescript-eslint/utils": true, - "@typescript-eslint/eslint-plugin>tsutils": true, "eslint-plugin-jest>@typescript-eslint/utils": true, + "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug": true, "eslint>debug": true, "nock>debug": true, + "@typescript-eslint/eslint-plugin>tsutils": true, "typescript": true } }, - "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug": { - "globals": { - "console.debug": true, - "console.log": true - }, - "packages": { - "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug>ms": true - } - }, "@typescript-eslint/eslint-plugin>@typescript-eslint/utils": { "builtin": { "path": true @@ -1259,95 +1161,50 @@ "@typescript-eslint/parser>@typescript-eslint/types": true, "@typescript-eslint/utils": true, "eslint": true, - "eslint-plugin-mocha>eslint-utils": true, + "webpack>eslint-scope": true, "eslint>eslint-utils": true, - "webpack>eslint-scope": true - } - }, - "autoprefixer": { - "globals": { - "console": true, - "process.cwd": true, - "process.env.AUTOPREFIXER_GRID": true - }, - "packages": { - "autoprefixer>caniuse-lite": true, - "autoprefixer>fraction.js": true, - "autoprefixer>normalize-range": true, - "browserslist": true, - "postcss": true, - "postcss>picocolors": true, - "stylelint>postcss-value-parser": true + "eslint-plugin-mocha>eslint-utils": true } }, - "babelify": { + "eslint-plugin-jest>@typescript-eslint/utils": { "builtin": { - "path.extname": true, - "path.resolve": true, - "stream.PassThrough": true, - "stream.Transform": true, - "util": true + "assert": true, + "path": true }, "globals": { - "Buffer.concat": true + "afterAll": true, + "process.cwd": true }, "packages": { - "@babel/core": true - } - }, - "bify-module-groups": { - "packages": { - "bify-module-groups>through2": true, - "pify": true, - "pumpify>pump": true + "eslint>@eslint-community/eslint-utils": true, + "eslint>@eslint-community": true, + "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, + "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager": true, + "eslint-plugin-jest>@typescript-eslint/experimental-utils>@typescript-eslint/types": true, + "@typescript-eslint/parser>@typescript-eslint/types": true, + "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/types": true, + "@typescript-eslint/parser>@typescript-eslint": true, + "eslint": true, + "eslint-plugin-jest>@typescript-eslint/utils>eslint-scope": true, + "eslint>eslint-scope": true, + "webpack>eslint-scope": true, + "eslint-plugin-jest>@typescript-eslint/utils>webpack>eslint-scope": true, + "eslint>eslint-utils": true, + "eslint-plugin-mocha>eslint-utils": true, + "semver": true } }, - "bify-module-groups>through2": { + "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager>@typescript-eslint/visitor-keys": { "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true + "path": true }, "packages": { - "readable-stream": true + "eslint>eslint-visitor-keys": true } }, - "browserify": { - "builtin": { - "events.EventEmitter": true, - "fs.realpath": true, - "path.dirname": true, - "path.join": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true - }, + "eslint>@ungap/structured-clone": { "globals": { - "__dirname": true, - "process.cwd": true, - "process.nextTick": true, - "process.platform": true - }, - "packages": { - "browserify>browser-pack": true, - "browserify>browser-resolve": true, - "browserify>cached-path-relative": true, - "browserify>concat-stream": true, - "browserify>deps-sort": true, - "browserify>has": true, - "browserify>insert-module-globals": true, - "browserify>module-deps": true, - "browserify>read-only-stream": true, - "browserify>shasum-object": true, - "browserify>syntax-error": true, - "browserify>through2": true, - "depcheck>resolve": true, - "labeled-stream-splicer": true, - "lavamoat>htmlescape": true, - "pumpify>inherits": true, - "watchify>defined": true, - "watchify>xtend": true + "structuredClone": true } }, "browserify>JSONStream": { @@ -1359,585 +1216,441 @@ "debounce-stream>through": true } }, - "browserify>JSONStream>jsonparse": { - "globals": { - "Buffer": true + "@lavamoat/lavapack>readable-stream>abort-controller": { + "packages": { + "@lavamoat/lavapack>readable-stream>abort-controller>event-target-shim": true } }, - "browserify>browser-pack": { - "builtin": { - "fs.readFileSync": true, - "path.join": true, - "path.relative": true - }, - "globals": { - "__dirname": true, - "process.cwd": true - }, + "eslint>espree>acorn-jsx": { "packages": { - "@lavamoat/lavapack>combine-source-map": true, - "@lavamoat/lavapack>umd": true, - "browserify>JSONStream": true, - "browserify>browser-pack>through2": true, - "koa>content-disposition>safe-buffer": true, - "watchify>defined": true + "jsdom>acorn": true } }, - "browserify>browser-pack>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, + "browserify>syntax-error>acorn-node": { "packages": { - "browserify>browser-pack>through2>readable-stream": true, + "@storybook/react>acorn-walk": true, + "browserify>syntax-error>acorn-node>acorn": true, "watchify>xtend": true } }, - "browserify>browser-pack>through2>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, + "@storybook/react>acorn-walk": { "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "browserify>browser-pack>through2>readable-stream>isarray": true, - "browserify>browser-pack>through2>readable-stream>safe-buffer": true, - "browserify>browser-pack>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "define": true } }, - "browserify>browser-pack>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "ts-node>acorn-walk": { + "globals": { + "define": true } }, - "browserify>browser-pack>through2>readable-stream>string_decoder": { - "packages": { - "browserify>browser-pack>through2>readable-stream>string_decoder>safe-buffer": true + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>acorn": { + "globals": { + "define": true } }, - "browserify>browser-pack>through2>readable-stream>string_decoder>safe-buffer": { - "builtin": { - "buffer": true + "browserify>syntax-error>acorn-node>acorn": { + "globals": { + "define": true } }, - "browserify>browser-resolve": { - "builtin": { - "fs.readFile": true, - "fs.readFileSync": true, - "path": true - }, + "gulp-sourcemaps>acorn": { "globals": { - "__dirname": true, - "process.platform": true - }, - "packages": { - "depcheck>resolve": true + "define": true } }, - "browserify>cached-path-relative": { - "builtin": { - "path": true - }, + "jsdom>acorn": { "globals": { - "process.cwd": true + "console": true, + "define": true } }, - "browserify>concat-stream": { - "globals": { - "Buffer.concat": true, - "Buffer.isBuffer": true - }, + "del>p-map>aggregate-error": { "packages": { - "browserify>concat-stream>readable-stream": true, - "browserify>concat-stream>typedarray": true, - "pumpify>inherits": true, - "terser>source-map-support>buffer-from": true + "del>p-map>aggregate-error>clean-stack": true, + "prettier-eslint>indent-string": true } }, - "browserify>concat-stream>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, + "eslint>ajv": { "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "console": true }, "packages": { - "browserify>concat-stream>readable-stream>isarray": true, - "browserify>concat-stream>readable-stream>safe-buffer": true, - "browserify>concat-stream>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "eslint>fast-deep-equal": true, + "@metamask/snaps-utils>fast-json-stable-stringify": true, + "eslint>ajv>json-schema-traverse": true, + "uri-js": true } }, - "browserify>concat-stream>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "gulp-watch>ansi-colors": { + "packages": { + "fancy-log>ansi-gray>ansi-wrap": true } }, - "browserify>concat-stream>readable-stream>string_decoder": { + "fancy-log>ansi-gray": { "packages": { - "browserify>concat-stream>readable-stream>safe-buffer": true + "fancy-log>ansi-gray>ansi-wrap": true } }, - "browserify>deps-sort": { + "chalk>ansi-styles": { "packages": { - "browserify>deps-sort>through2": true, - "browserify>shasum-object": true + "chalk>ansi-styles>color-convert": true } }, - "browserify>deps-sort>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, + "gulp-livereload>chalk>ansi-styles": { "packages": { - "browserify>deps-sort>through2>readable-stream": true, - "watchify>xtend": true + "gulp-livereload>chalk>ansi-styles>color-convert": true } }, - "browserify>deps-sort>through2>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, + "stylelint>table>slice-ansi>ansi-styles": { "packages": { - "browserify>deps-sort>through2>readable-stream>isarray": true, - "browserify>deps-sort>through2>readable-stream>safe-buffer": true, - "browserify>deps-sort>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "stylelint>table>slice-ansi>ansi-styles>color-convert": true } }, - "browserify>deps-sort>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "chokidar>anymatch": { + "packages": { + "chokidar>anymatch>normalize-path": true, + "chokidar>anymatch>picomatch": true } }, - "browserify>deps-sort>through2>readable-stream>string_decoder": { + "gulp>glob-watcher>anymatch": { + "builtin": { + "path.sep": true + }, "packages": { - "browserify>deps-sort>through2>readable-stream>safe-buffer": true + "gulp>glob-watcher>anymatch>micromatch": true, + "gulp-watch>anymatch>normalize-path": true } }, - "browserify>duplexer2": { + "gulp-watch>anymatch": { + "builtin": { + "path.sep": true + }, "packages": { - "browserify>duplexer2>readable-stream": true + "gulp-watch>anymatch>micromatch": true, + "gulp-watch>anymatch>normalize-path": true } }, - "browserify>duplexer2>readable-stream": { + "gulp>vinyl-fs>vinyl-sourcemap>append-buffer": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "os.EOL": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer": true }, "packages": { - "browserify>duplexer2>readable-stream>isarray": true, - "browserify>duplexer2>readable-stream>safe-buffer": true, - "browserify>duplexer2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "gulp>vinyl-fs>vinyl-sourcemap>append-buffer>buffer-equal": true } }, - "browserify>duplexer2>readable-stream>safe-buffer": { + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>are-we-there-yet": { "builtin": { - "buffer": true + "events.EventEmitter": true, + "util.inherits": true + }, + "packages": { + "koa>delegates": true, + "readable-stream": true } }, - "browserify>duplexer2>readable-stream>string_decoder": { - "packages": { - "browserify>duplexer2>readable-stream>safe-buffer": true + "ts-node>arg": { + "globals": { + "process.argv.slice": true } }, - "browserify>has": { + "gulp-watch>anymatch>micromatch>arr-diff": { "packages": { - "browserify>has>function-bind": true + "gulp>undertaker>arr-flatten": true } }, - "browserify>insert-module-globals": { - "builtin": { - "path.dirname": true, - "path.isAbsolute": true, - "path.relative": true, - "path.sep": true - }, - "globals": { - "Buffer.concat": true, - "Buffer.isBuffer": true - }, + "gulp>undertaker>bach>arr-filter": { "packages": { - "@lavamoat/lavapack>combine-source-map": true, - "browserify>insert-module-globals>through2": true, - "browserify>insert-module-globals>undeclared-identifiers": true, - "browserify>syntax-error>acorn-node": true, - "gulp-watch>path-is-absolute": true, - "watchify>xtend": true + "gulp>undertaker>arr-map>make-iterator": true } }, - "browserify>insert-module-globals>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, + "gulp>undertaker>arr-map": { "packages": { - "browserify>insert-module-globals>through2>readable-stream": true, - "watchify>xtend": true + "gulp>undertaker>arr-map>make-iterator": true } }, - "browserify>insert-module-globals>through2>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, + "eslint-plugin-react>array-includes": { "packages": { - "browserify>insert-module-globals>through2>readable-stream>isarray": true, - "browserify>insert-module-globals>through2>readable-stream>safe-buffer": true, - "browserify>insert-module-globals>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>es-abstract": true, + "string.prototype.matchall>get-intrinsic": true, + "eslint-plugin-react>array-includes>is-string": true } }, - "browserify>insert-module-globals>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "gulp>undertaker>bach>array-initial": { + "packages": { + "gulp>undertaker>object.defaults>array-slice": true, + "gulp>undertaker>bach>array-last>is-number": true } }, - "browserify>insert-module-globals>through2>readable-stream>string_decoder": { + "gulp>undertaker>bach>array-last": { "packages": { - "browserify>insert-module-globals>through2>readable-stream>safe-buffer": true + "gulp>undertaker>bach>array-last>is-number": true } }, - "browserify>insert-module-globals>undeclared-identifiers": { + "eslint-plugin-import>array.prototype.flat": { "packages": { - "browserify>insert-module-globals>undeclared-identifiers>get-assigned-identifiers": true, - "browserify>syntax-error>acorn-node": true, - "watchify>xtend": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>es-abstract": true, + "eslint-plugin-react>array.prototype.flatmap>es-shim-unscopables": true } }, - "browserify>insert-module-globals>undeclared-identifiers>get-assigned-identifiers": { - "builtin": { - "assert.equal": true + "eslint-plugin-react>array.prototype.flatmap": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>es-abstract": true, + "eslint-plugin-react>array.prototype.flatmap>es-shim-unscopables": true } }, - "browserify>module-deps": { - "builtin": { - "fs.createReadStream": true, - "fs.readFile": true, - "path.delimiter": true, - "path.dirname": true, - "path.join": true, - "path.resolve": true - }, + "gulp>glob-watcher>async-done": { "globals": { - "process.cwd": true, - "process.env.NODE_PATH": true, - "process.nextTick": true, - "process.platform": true, - "setTimeout": true, - "tr": true + "process.nextTick": true }, "packages": { - "browserify>browser-resolve": true, - "browserify>cached-path-relative": true, - "browserify>concat-stream": true, - "browserify>duplexer2": true, - "browserify>module-deps>detective": true, - "browserify>module-deps>readable-stream": true, - "browserify>module-deps>stream-combiner2": true, - "browserify>module-deps>through2": true, - "browserify>parents": true, - "depcheck>resolve": true, - "loose-envify": true, - "pumpify>inherits": true, - "watchify>defined": true, - "watchify>xtend": true + "duplexify>end-of-stream": true, + "@metamask/object-multiplex>once": true, + "readable-stream-2>process-nextick-args": true, + "gulp>glob-watcher>async-done>stream-exhaust": true } }, - "browserify>module-deps>detective": { + "gulp>undertaker>bach>async-settle": { "packages": { - "browserify>syntax-error>acorn-node": true, - "watchify>defined": true + "gulp>glob-watcher>async-done": true } }, - "browserify>module-deps>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "gulp-sourcemaps>css>source-map-resolve>atob": { + "globals": { + "Buffer.from": true + } + }, + "autoprefixer": { + "globals": { + "console": true, + "process.cwd": true, + "process.env.AUTOPREFIXER_GRID": true }, + "packages": { + "browserslist": true, + "autoprefixer>caniuse-lite": true, + "autoprefixer>fraction.js": true, + "autoprefixer>normalize-range": true, + "postcss>picocolors": true, + "postcss": true, + "stylelint>postcss-value-parser": true + } + }, + "stylelint>autoprefixer": { "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "console": true, + "process.cwd": true, + "process.env.AUTOPREFIXER_GRID": true }, "packages": { - "browserify>module-deps>readable-stream>isarray": true, - "browserify>module-deps>readable-stream>safe-buffer": true, - "browserify>module-deps>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "browserslist": true, + "autoprefixer>caniuse-lite": true, + "autoprefixer>normalize-range": true, + "stylelint>autoprefixer>num2fraction": true, + "stylelint>postcss>picocolors": true, + "stylelint>postcss-value-parser": true, + "stylelint>postcss": true } }, - "browserify>module-deps>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "@babel/preset-env>babel-plugin-polyfill-corejs2": { + "packages": { + "@babel/preset-env>@babel/compat-data": true, + "@babel/core": true, + "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": true, + "@babel/preset-env>babel-plugin-polyfill-corejs2>semver": true } }, - "browserify>module-deps>readable-stream>string_decoder": { + "@babel/preset-env>babel-plugin-polyfill-corejs3": { "packages": { - "browserify>module-deps>readable-stream>safe-buffer": true + "@babel/core": true, + "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": true, + "@babel/preset-env>core-js-compat": true } }, - "browserify>module-deps>stream-combiner2": { + "@babel/preset-env>babel-plugin-polyfill-regenerator": { "packages": { - "browserify>duplexer2": true, - "browserify>module-deps>stream-combiner2>readable-stream": true + "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider": true } }, - "browserify>module-deps>stream-combiner2>readable-stream": { + "babelify": { "builtin": { - "events.EventEmitter": true, - "stream": true, + "path.extname": true, + "path.resolve": true, + "stream.PassThrough": true, + "stream.Transform": true, "util": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer.concat": true }, "packages": { - "browserify>module-deps>stream-combiner2>readable-stream>isarray": true, - "browserify>module-deps>stream-combiner2>readable-stream>safe-buffer": true, - "browserify>module-deps>stream-combiner2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "@babel/core": true } }, - "browserify>module-deps>stream-combiner2>readable-stream>safe-buffer": { + "gulp>undertaker>bach": { "builtin": { - "buffer": true - } - }, - "browserify>module-deps>stream-combiner2>readable-stream>string_decoder": { + "assert.ok": true + }, "packages": { - "browserify>module-deps>stream-combiner2>readable-stream>safe-buffer": true + "gulp>undertaker>bach>arr-filter": true, + "gulp>undertaker>arr-flatten": true, + "gulp>undertaker>arr-map": true, + "gulp>undertaker>bach>array-each": true, + "gulp>undertaker>bach>array-initial": true, + "gulp>undertaker>bach>array-last": true, + "gulp>glob-watcher>async-done": true, + "gulp>undertaker>bach>async-settle": true, + "gulp>vinyl-fs>vinyl-sourcemap>now-and-later": true } }, - "browserify>module-deps>through2": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base": { "builtin": { "util.inherits": true }, - "globals": { - "process.nextTick": true - }, "packages": { - "browserify>module-deps>readable-stream": true, - "watchify>xtend": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>component-emitter": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>define-property": true, + "gulp>gulp-cli>isobject": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>pascalcase": true } }, - "browserify>parents": { - "globals": { - "process.cwd": true, - "process.platform": true + "bify-module-groups": { + "packages": { + "pify": true, + "pumpify>pump": true, + "bify-module-groups>through2": true + } + }, + "vinyl-buffer>bl": { + "builtin": { + "util.inherits": true }, "packages": { - "browserify>parents>path-platform": true + "vinyl-buffer>bl>readable-stream": true, + "koa>content-disposition>safe-buffer": true } }, - "browserify>parents>path-platform": { + "gulp-livereload>tiny-lr>body": { "builtin": { - "path": true, - "util.isObject": true, - "util.isString": true + "querystring.parse": true }, - "globals": { - "process.cwd": true, - "process.env": true, - "process.platform": true + "packages": { + "gulp-livereload>tiny-lr>body>continuable-cache": true, + "gulp-livereload>tiny-lr>body>error": true, + "gulp-livereload>tiny-lr>body>raw-body": true, + "gulp-livereload>tiny-lr>body>safe-json-parse": true } }, - "browserify>read-only-stream": { + "eslint>minimatch>brace-expansion": { "packages": { - "browserify>read-only-stream>readable-stream": true + "stylelint>balanced-match": true, + "eslint>minimatch>brace-expansion>concat-map": true } }, - "browserify>read-only-stream>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, + "chokidar>braces": { "packages": { - "browserify>read-only-stream>readable-stream>isarray": true, - "browserify>read-only-stream>readable-stream>safe-buffer": true, - "browserify>read-only-stream>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "chokidar>braces>fill-range": true } }, - "browserify>read-only-stream>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "gulp>glob-watcher>anymatch>micromatch>braces": { + "packages": { + "gulp>undertaker>arr-flatten": true, + "gulp>gulp-cli>matchdep>micromatch>array-unique": true, + "gulp>glob-watcher>anymatch>micromatch>braces>extend-shallow": true, + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range": true, + "gulp>gulp-cli>isobject": true, + "gulp-watch>anymatch>micromatch>braces>repeat-element": true, + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, + "gulp>gulp-cli>matchdep>micromatch>braces>split-string": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex": true } }, - "browserify>read-only-stream>readable-stream>string_decoder": { + "gulp-watch>anymatch>micromatch>braces": { "packages": { - "browserify>read-only-stream>readable-stream>safe-buffer": true + "gulp-watch>anymatch>micromatch>braces>expand-range": true, + "gulp-watch>anymatch>micromatch>braces>preserve": true, + "gulp-watch>anymatch>micromatch>braces>repeat-element": true } }, - "browserify>readable-stream": { + "browserify>browser-pack": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "fs.readFileSync": true, + "path.join": true, + "path.relative": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "__dirname": true, + "process.cwd": true }, "packages": { - "browserify>readable-stream>isarray": true, - "browserify>readable-stream>safe-buffer": true, - "browserify>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "browserify>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "browserify>readable-stream>string_decoder": { - "packages": { - "browserify>readable-stream>safe-buffer": true + "browserify>JSONStream": true, + "@lavamoat/lavapack>combine-source-map": true, + "watchify>defined": true, + "koa>content-disposition>safe-buffer": true, + "browserify>browser-pack>through2": true, + "@lavamoat/lavapack>umd": true } }, - "browserify>shasum-object": { + "browserify>browser-resolve": { "builtin": { - "crypto.createHash": true + "fs.readFile": true, + "fs.readFileSync": true, + "path": true }, "globals": { - "Buffer.isBuffer": true + "__dirname": true, + "process.platform": true }, "packages": { - "@metamask/rpc-errors>fast-safe-stringify": true - } - }, - "browserify>string_decoder": { - "packages": { - "koa>content-disposition>safe-buffer": true - } - }, - "browserify>syntax-error": { - "packages": { - "browserify>syntax-error>acorn-node": true - } - }, - "browserify>syntax-error>acorn-node": { - "packages": { - "@storybook/react>acorn-walk": true, - "browserify>syntax-error>acorn-node>acorn": true, - "watchify>xtend": true - } - }, - "browserify>syntax-error>acorn-node>acorn": { - "globals": { - "define": true + "depcheck>resolve": true } }, - "browserify>through2": { + "browserify": { "builtin": { - "util.inherits": true + "events.EventEmitter": true, + "fs.realpath": true, + "path.dirname": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true }, "globals": { - "process.nextTick": true + "__dirname": true, + "process.cwd": true, + "process.nextTick": true, + "process.platform": true }, "packages": { - "browserify>readable-stream": true, + "browserify>browser-pack": true, + "browserify>browser-resolve": true, + "browserify>cached-path-relative": true, + "browserify>concat-stream": true, + "watchify>defined": true, + "browserify>deps-sort": true, + "browserify>has": true, + "lavamoat>htmlescape": true, + "pumpify>inherits": true, + "browserify>insert-module-globals": true, + "labeled-stream-splicer": true, + "browserify>module-deps": true, + "browserify>read-only-stream": true, + "depcheck>resolve": true, + "browserify>shasum-object": true, + "browserify>syntax-error": true, + "browserify>through2": true, "watchify>xtend": true } }, @@ -1963,38 +1676,84 @@ "browserslist>node-releases": true } }, - "chalk": { - "packages": { - "chalk>ansi-styles": true, - "chalk>supports-color": true + "sass-embedded>buffer-builder": { + "globals": { + "Buffer": true } }, - "chalk>ansi-styles": { - "packages": { - "chalk>ansi-styles>color-convert": true + "gulp-zip>yazl>buffer-crc32": { + "builtin": { + "buffer.Buffer": true } }, - "chalk>ansi-styles>color-convert": { + "gulp>vinyl-fs>vinyl-sourcemap>append-buffer>buffer-equal": { + "builtin": { + "buffer.Buffer.isBuffer": true + } + }, + "terser>source-map-support>buffer-from": { + "globals": { + "Buffer": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base": { "packages": { - "jest-canvas-mock>moo-color>color-name": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>component-emitter": true, + "gulp>gulp-cli>array-sort>get-value": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value": true, + "gulp>gulp-cli>isobject": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>union-value": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value": true } }, - "chalk>supports-color": { + "browserify>cached-path-relative": { "builtin": { - "os.release": true, - "tty.isatty": true + "path": true }, "globals": { - "process.env": true, + "process.cwd": true + } + }, + "string.prototype.matchall>call-bind": { + "packages": { + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>call-bind>set-function-length": true + } + }, + "chalk": { + "packages": { + "chalk>ansi-styles": true, + "chalk>supports-color": true + } + }, + "gulp-livereload>chalk": { + "globals": { + "process.env.TERM": true, "process.platform": true }, "packages": { - "chalk>supports-color>has-flag": true + "gulp-livereload>chalk>ansi-styles": true, + "gulp-livereload>chalk>escape-string-regexp": true, + "gulp-livereload>chalk>supports-color": true } }, - "chalk>supports-color>has-flag": { + "postcss-discard-font-face>postcss>chalk": { "globals": { - "process.argv": true + "process.env.TERM": true, + "process.platform": true + }, + "packages": { + "postcss-discard-font-face>postcss>chalk>ansi-styles": true, + "postcss-discard-font-face>postcss>chalk>escape-string-regexp": true, + "prettier-eslint>loglevel-colored-level-prefix>chalk>has-ansi": true, + "postcss-discard-font-face>postcss>chalk>strip-ansi": true, + "postcss-discard-font-face>postcss>chalk>supports-color": true } }, "chokidar": { @@ -2036,423 +1795,376 @@ "chokidar>anymatch": true, "chokidar>braces": true, "chokidar>fsevents": true, + "eslint>glob-parent": true, "chokidar>is-binary-path": true, - "chokidar>normalize-path": true, - "chokidar>readdirp": true, "del>is-glob": true, - "eslint>glob-parent": true + "chokidar>normalize-path": true, + "chokidar>readdirp": true } }, - "chokidar>anymatch": { + "gulp>glob-watcher>chokidar": { "packages": { - "chokidar>anymatch>normalize-path": true, - "chokidar>anymatch>picomatch": true + "gulp>glob-watcher>chokidar>fsevents": true } }, - "chokidar>anymatch>picomatch": { + "gulp-watch>chokidar": { "builtin": { + "events.EventEmitter": true, + "fs": true, "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, "path.sep": true }, "globals": { + "clearTimeout": true, + "console.error": true, + "process.env.CHOKIDAR_INTERVAL": true, + "process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR": true, + "process.env.CHOKIDAR_USEPOLLING": true, + "process.nextTick": true, "process.platform": true, - "process.version.slice": true - } - }, - "chokidar>braces": { + "setTimeout": true + }, "packages": { - "chokidar>braces>fill-range": true + "gulp-watch>chokidar>anymatch": true, + "gulp-watch>chokidar>async-each": true, + "gulp-watch>chokidar>braces": true, + "gulp-watch>chokidar>fsevents": true, + "gulp-watch>glob-parent": true, + "pumpify>inherits": true, + "gulp-watch>chokidar>is-binary-path": true, + "eslint>is-glob": true, + "chokidar>normalize-path": true, + "gulp-watch>path-is-absolute": true, + "gulp-watch>chokidar>readdirp": true, + "gulp-watch>chokidar>upath": true } }, - "chokidar>braces>fill-range": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils": { "builtin": { - "util.inspect": true + "util": true }, "packages": { - "chokidar>braces>fill-range>to-regex-range": true + "gulp-zip>plugin-error>arr-union": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true, + "gulp>gulp-cli>isobject": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend": true } }, - "chokidar>braces>fill-range>to-regex-range": { - "packages": { - "chokidar>braces>fill-range>to-regex-range>is-number": true + "del>p-map>aggregate-error>clean-stack": { + "builtin": { + "os.homedir": true } }, - "chokidar>fsevents": { + "yargs>cliui": { "globals": { - "console.assert": true, - "process.platform": true + "process": true }, - "native": true + "packages": { + "yargs>string-width": true, + "eslint>strip-ansi": true, + "yargs>cliui>wrap-ansi": true + } }, - "chokidar>is-binary-path": { + "vinyl>clone-buffer": { "builtin": { - "path.extname": true - }, + "buffer.Buffer": true + } + }, + "lavamoat>lavamoat-core>merge-deep>clone-deep": { "packages": { - "chokidar>is-binary-path>binary-extensions": true + "lavamoat>lavamoat-core>merge-deep>clone-deep>for-own": true, + "@babel/register>clone-deep>is-plain-object": true, + "lavamoat>lavamoat-core>merge-deep>kind-of": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep>lazy-cache": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone": true } }, - "chokidar>readdirp": { - "builtin": { - "fs": true, - "path.join": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true, - "stream.Readable": true, - "util.promisify": true - }, - "globals": { - "process.platform": true, - "process.versions.node.split": true - }, + "stylelint>execall>clone-regexp": { "packages": { - "chokidar>anymatch>picomatch": true + "stylelint>execall>clone-regexp>is-regexp": true } }, - "cross-spawn": { + "vinyl>clone-stats": { "builtin": { - "child_process.spawn": true, - "child_process.spawnSync": true, - "fs.closeSync": true, - "fs.openSync": true, - "fs.readSync": true, - "path.delimiter": true, - "path.normalize": true, - "path.resolve": true - }, + "fs.Stats": true + } + }, + "gulp-watch>vinyl-file>vinyl>clone-stats": { + "builtin": { + "fs.Stats": true + } + }, + "@metamask/jazzicon>color>clone": { "globals": { - "Buffer.alloc": true, - "process.chdir": true, - "process.cwd": true, - "process.env": true, - "process.platform": true - }, - "packages": { - "cross-spawn>path-key": true, - "cross-spawn>shebang-command": true, - "cross-spawn>which": true + "Buffer": true } }, - "cross-spawn>path-key": { + "vinyl>clone": { "globals": { - "process.env": true, - "process.platform": true + "Buffer": true + } + }, + "vinyl>cloneable-readable": { + "packages": { + "pumpify>inherits": true, + "vinyl>cloneable-readable>process-nextick-args": true, + "vinyl>cloneable-readable>through2": true } }, - "cross-spawn>shebang-command": { + "gulp>undertaker>collection-map": { + "packages": { + "gulp>undertaker>arr-map": true, + "gulp>undertaker>object.reduce>for-own": true, + "gulp>undertaker>arr-map>make-iterator": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>map-visit": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>object-visit": true + } + }, + "chalk>ansi-styles>color-convert": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "gulp-livereload>chalk>ansi-styles>color-convert": { + "packages": { + "gulp-livereload>chalk>ansi-styles>color-convert>color-name": true + } + }, + "stylelint>table>slice-ansi>ansi-styles>color-convert": { "packages": { - "cross-spawn>shebang-command>shebang-regex": true + "stylelint>table>slice-ansi>ansi-styles>color-convert>color-name": true + } + }, + "fancy-log>color-support": { + "globals": { + "process": true } }, - "cross-spawn>which": { + "@lavamoat/lavapack>combine-source-map": { "builtin": { + "path.dirname": true, "path.join": true }, "globals": { - "process.cwd": true, - "process.env.OSTYPE": true, - "process.env.PATH": true, - "process.env.PATHEXT": true, "process.platform": true }, "packages": { - "@sentry/cli>which>isexe": true + "nyc>convert-source-map": true, + "@lavamoat/lavapack>combine-source-map>inline-source-map": true, + "@lavamoat/lavapack>combine-source-map>lodash.memoize": true, + "@lavamoat/lavapack>combine-source-map>source-map": true } }, - "debounce-stream>duplexer": { - "builtin": { - "stream": true + "browserify>concat-stream": { + "globals": { + "Buffer.concat": true, + "Buffer.isBuffer": true + }, + "packages": { + "terser>source-map-support>buffer-from": true, + "pumpify>inherits": true, + "browserify>concat-stream>readable-stream": true, + "browserify>concat-stream>typedarray": true } }, - "debounce-stream>through": { - "builtin": { - "stream": true + "lavamoat-browserify>concat-stream": { + "globals": { + "Buffer.concat": true, + "Buffer.isBuffer": true }, + "packages": { + "terser>source-map-support>buffer-from": true, + "pumpify>inherits": true, + "lavamoat-browserify>concat-stream>readable-stream": true, + "browserify>concat-stream>typedarray": true + } + }, + "@babel/core>convert-source-map": { "globals": { - "process.nextTick": true + "Buffer": true, + "atob": true, + "btoa": true, + "value": true } }, - "del": { + "nyc>convert-source-map": { "builtin": { - "path.resolve": true, - "util.promisify": true + "fs.readFileSync": true, + "path.join": true }, "globals": { - "process.cwd": true, - "process.platform": true - }, - "packages": { - "del>graceful-fs": true, - "del>is-glob": true, - "del>is-path-cwd": true, - "del>is-path-inside": true, - "del>p-map": true, - "del>rimraf": true, - "del>slash": true, - "globby": true + "Buffer.from": true } }, - "del>graceful-fs": { + "readable-stream-2>core-util-is": { + "globals": { + "Buffer.isBuffer": true + } + }, + "stylelint>cosmiconfig": { "builtin": { - "assert.equal": true, - "constants.O_SYMLINK": true, - "constants.O_WRONLY": true, - "constants.hasOwnProperty": true, "fs": true, - "stream.Stream.call": true, - "util": true + "os": true, + "path": true }, "globals": { - "clearTimeout": true, - "console.error": true, - "process": true, - "setTimeout": true - } - }, - "del>is-glob": { + "process.cwd": true + }, "packages": { - "del>is-glob>is-extglob": true + "eslint>@eslint/eslintrc>import-fresh": true, + "depcheck>cosmiconfig>parse-json": true, + "globby>dir-glob>path-type": true, + "stylelint>cosmiconfig>yaml": true } }, - "del>is-path-cwd": { + "ts-node>create-require": { "builtin": { - "path.resolve": true + "fs.lstatSync": true, + "module.Module": true, + "module.createRequire": true, + "module.createRequireFromPath": true, + "path.dirname": true, + "path.join": true }, "globals": { - "process.cwd": true, - "process.platform": true + "process.cwd": true } }, - "del>is-path-inside": { + "gulp-sourcemaps>css": { "builtin": { - "path.relative": true, - "path.resolve": true, + "fs.readFileSync": true, + "path.dirname": true, "path.sep": true + }, + "packages": { + "pumpify>inherits": true, + "gulp-sourcemaps>css>source-map-resolve": true, + "gulp-sourcemaps>css>source-map": true } }, - "del>p-map": { + "resolve-url-loader>es6-iterator>d": { "packages": { - "del>p-map>aggregate-error": true + "resolve-url-loader>es6-iterator>es5-ext": true, + "resolve-url-loader>es6-iterator>d>type": true } }, - "del>p-map>aggregate-error": { + "gulp-sourcemaps>debug-fabulous": { "packages": { - "del>p-map>aggregate-error>clean-stack": true, - "prettier-eslint>indent-string": true + "gulp-sourcemaps>debug-fabulous>debug": true, + "gulp-sourcemaps>debug-fabulous>memoizee": true, + "react>object-assign": true } }, - "del>p-map>aggregate-error>clean-stack": { - "builtin": { - "os.homedir": true + "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug": { + "globals": { + "console.debug": true, + "console.log": true + }, + "packages": { + "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug>ms": true } }, - "del>rimraf": { + "gulp-sourcemaps>debug-fabulous>debug": { "builtin": { - "assert": true, - "fs": true, - "path.join": true + "tty.isatty": true, + "util": true }, "globals": { - "process.platform": true, - "setTimeout": true + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true }, "packages": { - "nyc>glob": true + "mocha>ms": true, + "mocha>supports-color": true } }, - "depcheck>@babel/traverse": { + "eslint-import-resolver-node>debug": { + "builtin": { + "tty.isatty": true, + "util": true + }, "globals": { - "console.log": true + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true }, "packages": { - "@babel/code-frame": true, - "@babel/core>@babel/generator": true, - "@babel/core>@babel/parser": true, - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true, - "babel/preset-env>b@babel/types": true, - "depcheck>@babel/traverse>globals": true, - "nock>debug": true - } - }, - "depcheck>cosmiconfig>parse-json": { - "packages": { - "@babel/code-frame": true, - "depcheck>cosmiconfig>parse-json>error-ex": true, - "depcheck>cosmiconfig>parse-json>lines-and-columns": true, - "webpack>json-parse-even-better-errors": true + "mocha>ms": true, + "mocha>supports-color": true } }, - "depcheck>cosmiconfig>parse-json>error-ex": { + "eslint-plugin-import>eslint-module-utils>debug": { "builtin": { - "util.inherits": true + "tty.isatty": true, + "util": true }, - "packages": { - "depcheck>cosmiconfig>parse-json>error-ex>is-arrayish": true - } - }, - "depcheck>is-core-module": { "globals": { - "process.versions": true + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true }, "packages": { - "depcheck>is-core-module>hasown": true - } - }, - "depcheck>is-core-module>hasown": { - "packages": { - "browserify>has>function-bind": true + "mocha>ms": true, + "mocha>supports-color": true } }, - "depcheck>json5": { - "globals": { - "console.warn": true - } - }, - "depcheck>resolve": { + "eslint-plugin-import>debug": { "builtin": { - "fs.readFile": true, - "fs.readFileSync": true, - "fs.realpath": true, - "fs.realpathSync": true, - "fs.stat": true, - "fs.statSync": true, - "os.homedir": true, - "path.dirname": true, - "path.join": true, - "path.parse": true, - "path.relative": true, - "path.resolve": true - }, - "globals": { - "process.env.HOME": true, - "process.env.HOMEDRIVE": true, - "process.env.HOMEPATH": true, - "process.env.LNAME": true, - "process.env.LOGNAME": true, - "process.env.USER": true, - "process.env.USERNAME": true, - "process.env.USERPROFILE": true, - "process.getuid": true, - "process.nextTick": true, - "process.platform": true, - "process.versions.pnp": true - }, - "packages": { - "depcheck>is-core-module": true, - "depcheck>resolve>path-parse": true - } - }, - "depcheck>resolve>path-parse": { - "globals": { - "process.platform": true - } - }, - "duplexify": { - "globals": { - "Buffer": true, - "process.nextTick": true + "fs.SyncWriteStream": true, + "net.Socket": true, + "tty.WriteStream": true, + "tty.isatty": true, + "util": true }, - "packages": { - "duplexify>end-of-stream": true, - "duplexify>stream-shift": true, - "pumpify>inherits": true, - "readable-stream": true - } - }, - "duplexify>end-of-stream": { "globals": { - "process.nextTick": true + "chrome": true, + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true }, "packages": { - "@metamask/object-multiplex>once": true + "eslint-plugin-import>debug>ms": true } }, - "eslint": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>debug": { "builtin": { - "assert": true, - "fs.existsSync": true, - "fs.lstatSync": true, - "fs.promises": true, - "fs.readFileSync": true, - "fs.readdirSync": true, - "fs.statSync": true, - "fs.unlinkSync": true, - "fs.writeFile": true, - "fs.writeFileSync": true, - "path.dirname": true, - "path.extname": true, - "path.isAbsolute": true, - "path.join": true, - "path.normalize": true, - "path.posix.join": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true, - "url.pathToFileURL": true, - "util.format": true, - "util.inspect": true, - "util.promisify": true + "fs.SyncWriteStream": true, + "net.Socket": true, + "tty.WriteStream": true, + "tty.isatty": true, + "util": true }, "globals": { - "__dirname": true, - "console.log": true, - "describe": true, - "it": true, + "chrome": true, + "console": true, + "document": true, + "localStorage": true, + "navigator": true, "process": true }, "packages": { - "del>is-glob": true, - "del>is-path-inside": true, - "eslint>@eslint-community/eslint-utils": true, - "eslint>@eslint-community/regexpp": true, - "eslint>@eslint/eslintrc": true, - "eslint>@eslint/js": true, - "eslint>@humanwhocodes/config-array": true, - "eslint>@nodelib/fs.walk": true, - "eslint>@ungap/structured-clone": true, - "eslint>ajv": true, - "eslint>doctrine": true, - "eslint>eslint-scope": true, - "eslint>eslint-visitor-keys": true, - "eslint>espree": true, - "eslint>esquery": true, - "eslint>esutils": true, - "eslint>fast-deep-equal": true, - "eslint>file-entry-cache": true, - "eslint>glob-parent": true, - "eslint>globals": true, - "eslint>graphemer": true, - "eslint>ignore": true, - "eslint>imurmurhash": true, - "eslint>json-stable-stringify-without-jsonify": true, - "eslint>levn": true, - "eslint>lodash.merge": true, - "eslint>minimatch": true, - "eslint>natural-compare": true, - "mocha>escape-string-regexp": true, - "mocha>find-up": true, - "nock>debug": true - } - }, - "eslint-config-prettier": { - "globals": { - "process.env.ESLINT_CONFIG_PRETTIER_NO_DEPRECATED": true - } - }, - "eslint-import-resolver-node": { - "builtin": { - "path.dirname": true, - "path.join": true, - "path.resolve": true - }, - "packages": { - "depcheck>resolve": true, - "eslint-import-resolver-node>debug": true + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>debug>ms": true } }, - "eslint-import-resolver-node>debug": { + "gulp-livereload>debug": { "builtin": { "tty.isatty": true, "util": true @@ -2466,60 +2178,29 @@ }, "packages": { "mocha>ms": true, - "mocha>supports-color": true - } - }, - "eslint-import-resolver-typescript": { - "builtin": { - "path": true - }, - "globals": { - "console.warn": true, - "process.cwd": true - }, - "packages": { - "del>is-glob": true, - "depcheck>resolve": true, - "eslint-plugin-import>tsconfig-paths": true, - "nock>debug": true, - "nyc>glob": true + "gulp-livereload>chalk>supports-color": true } }, - "eslint-plugin-import": { + "nock>debug": { "builtin": { - "fs": true, - "path": true, - "vm": true + "tty.isatty": true, + "util.deprecate": true, + "util.formatWithOptions": true, + "util.inspect": true }, "globals": { - "process.cwd": true, - "process.env": true + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true }, "packages": { - "browserify>has": true, - "del>is-glob": true, - "depcheck>is-core-module": true, - "eslint": true, - "eslint-plugin-import>array.prototype.flat": true, - "eslint-plugin-import>debug": true, - "eslint-plugin-import>doctrine": true, - "eslint-plugin-import>eslint-module-utils": true, - "eslint-plugin-import>tsconfig-paths": true, - "eslint-plugin-react>array-includes": true, - "eslint-plugin-react>object.values": true, - "eslint>minimatch": true, - "typescript": true - } - }, - "eslint-plugin-import>array.prototype.flat": { - "packages": { - "eslint-plugin-react>array.prototype.flatmap>es-shim-unscopables": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>es-abstract": true + "nock>debug>ms": true, + "mocha>supports-color": true } }, - "eslint-plugin-import>debug": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>debug": { "builtin": { "fs.SyncWriteStream": true, "net.Socket": true, @@ -2536,44 +2217,10 @@ "process": true }, "packages": { - "eslint-plugin-import>debug>ms": true - } - }, - "eslint-plugin-import>doctrine": { - "builtin": { - "assert": true - }, - "packages": { - "eslint>esutils": true - } - }, - "eslint-plugin-import>eslint-module-utils": { - "builtin": { - "crypto.createHash": true, - "fs.existsSync": true, - "fs.readFileSync": true, - "fs.readdirSync": true, - "module": true, - "path.dirname": true, - "path.extname": true, - "path.join": true, - "path.parse": true, - "path.resolve": true - }, - "globals": { - "__dirname.toUpperCase": true, - "console.warn": true, - "process.cwd": true, - "process.hrtime": true - }, - "packages": { - "@babel/eslint-parser": true, - "eslint-import-resolver-node": true, - "eslint-plugin-import>eslint-module-utils>debug": true, - "eslint-plugin-import>eslint-module-utils>find-up": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>debug>ms": true } }, - "eslint-plugin-import>eslint-module-utils>debug": { + "gulp-livereload>tiny-lr>debug": { "builtin": { "tty.isatty": true, "util": true @@ -2590,301 +2237,279 @@ "mocha>supports-color": true } }, - "eslint-plugin-import>eslint-module-utils>find-up": { - "builtin": { - "path.dirname": true, - "path.join": true, - "path.parse": true, - "path.resolve": true - }, - "packages": { - "eslint-plugin-import>eslint-module-utils>find-up>locate-path": true + "gulp>undertaker>last-run>default-resolution": { + "globals": { + "process.version.match": true } }, - "eslint-plugin-import>eslint-module-utils>find-up>locate-path": { - "builtin": { - "path.resolve": true - }, - "globals": { - "process.cwd": true - }, + "string.prototype.matchall>define-properties>define-data-property": { "packages": { - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate": true, - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>path-exists": true + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>gopd": true } }, - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate": { + "string.prototype.matchall>define-properties": { "packages": { - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate>p-limit": true + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate>p-limit": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>define-property": { "packages": { - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate>p-limit>p-try": true + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true } }, - "eslint-plugin-import>eslint-module-utils>find-up>locate-path>path-exists": { - "builtin": { - "fs.access": true, - "fs.accessSync": true + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property": { + "packages": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor": true } }, - "eslint-plugin-import>tsconfig-paths": { + "gulp>glob-watcher>anymatch>micromatch>extglob>define-property": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>define-property": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true, + "gulp>gulp-cli>isobject": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>nanomatch>define-property": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true, + "gulp>gulp-cli>isobject": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>define-property": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>to-regex>define-property": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true, + "gulp>gulp-cli>isobject": true + } + }, + "del": { "builtin": { - "fs.existsSync": true, - "fs.lstatSync": true, - "fs.readFile": true, - "fs.readFileSync": true, - "fs.stat": true, - "fs.statSync": true, - "module._resolveFilename": true, - "module.builtinModules": true, - "path.dirname": true, - "path.isAbsolute": true, - "path.join": true, - "path.resolve": true + "path.resolve": true, + "util.promisify": true }, "globals": { - "console.warn": true, - "process.argv.slice": true, "process.cwd": true, - "process.env": true + "process.platform": true }, "packages": { - "eslint-plugin-import>tsconfig-paths>json5": true, - "eslint-plugin-import>tsconfig-paths>strip-bom": true, - "wait-on>minimist": true + "globby": true, + "del>graceful-fs": true, + "del>is-glob": true, + "del>is-path-cwd": true, + "del>is-path-inside": true, + "del>p-map": true, + "del>rimraf": true, + "del>slash": true } }, - "eslint-plugin-import>tsconfig-paths>json5": { - "globals": { - "console.warn": true + "browserify>deps-sort": { + "packages": { + "browserify>shasum-object": true, + "browserify>deps-sort>through2": true } }, - "eslint-plugin-jest": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": { "builtin": { + "child_process.spawnSync": true, "fs.readdirSync": true, - "path.join": true, - "path.parse": true + "os.platform": true }, "globals": { - "__dirname": true - }, - "packages": { - "@typescript-eslint/eslint-plugin": true, - "eslint-plugin-jest>@typescript-eslint/utils": true + "process.env": true } }, - "eslint-plugin-jest>@typescript-eslint/experimental-utils": { - "builtin": { - "path": true - }, + "browserify>module-deps>detective": { "packages": { - "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, - "@typescript-eslint/parser>@typescript-eslint/types": true, - "eslint": true, - "eslint-plugin-jest>@typescript-eslint/experimental-utils>@typescript-eslint/types": true, - "eslint-plugin-jest>@typescript-eslint/experimental-utils>eslint-utils": true, - "eslint>eslint-scope": true, - "eslint>eslint-utils": true, - "webpack>eslint-scope": true + "browserify>syntax-error>acorn-node": true, + "watchify>defined": true } }, - "eslint-plugin-jest>@typescript-eslint/experimental-utils>eslint-utils": { - "packages": { - "eslint-plugin-jest>@typescript-eslint/experimental-utils>eslint-utils>eslint-visitor-keys": true + "ts-node>diff": { + "globals": { + "setTimeout": true } }, - "eslint-plugin-jest>@typescript-eslint/utils": { + "globby>dir-glob": { "builtin": { - "assert": true, - "path": true + "path.extname": true, + "path.isAbsolute": true, + "path.join": true, + "path.posix.join": true + }, + "globals": { + "process.cwd": true }, "packages": { - "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, - "@typescript-eslint/parser>@typescript-eslint/types": true, - "eslint": true, - "eslint-plugin-jest>@typescript-eslint/experimental-utils>@typescript-eslint/types": true, - "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager": true, - "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/types": true, - "eslint-plugin-jest>@typescript-eslint/utils>webpack>eslint-scope": true, - "eslint-plugin-mocha>eslint-utils": true, - "eslint>@eslint-community/eslint-utils": true, - "eslint>eslint-scope": true, - "eslint>eslint-utils": true, - "semver": true, - "webpack>eslint-scope": true + "globby>dir-glob>path-type": true } }, - "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager": { + "eslint>doctrine": { "builtin": { - "path": true + "assert": true }, "packages": { - "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager>@typescript-eslint/visitor-keys": true, - "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/types": true + "eslint>esutils": true } }, - "eslint-plugin-jest>@typescript-eslint/utils>@typescript-eslint/scope-manager>@typescript-eslint/visitor-keys": { + "eslint-plugin-import>doctrine": { "builtin": { - "path": true + "assert": true }, "packages": { - "eslint>eslint-visitor-keys": true + "eslint>esutils": true } }, - "eslint-plugin-jest>@typescript-eslint/utils>eslint-utils": { + "eslint-plugin-react>doctrine": { + "builtin": { + "assert": true + }, "packages": { - "eslint-plugin-jest>@typescript-eslint/utils>eslint-utils>eslint-visitor-keys": true, - "eslint>@eslint-community/eslint-utils": true, - "semver": true + "eslint>esutils": true } }, - "eslint-plugin-jsdoc": { + "stylelint>postcss-html>htmlparser2>domutils>dom-serializer": { "packages": { - "eslint": true, - "eslint-plugin-jsdoc>@es-joy/jsdoccomment": true, - "eslint-plugin-jsdoc>are-docs-informative": true, - "eslint-plugin-jsdoc>comment-parser": true, - "eslint-plugin-jsdoc>spdx-expression-parse": true, - "eslint>esquery": true, - "mocha>escape-string-regexp": true, - "nock>debug": true, - "semver": true + "stylelint>postcss-html>htmlparser2>domelementtype": true, + "stylelint>postcss-html>htmlparser2>entities": true } }, - "eslint-plugin-jsdoc>@es-joy/jsdoccomment": { + "stylelint>postcss-html>htmlparser2>domhandler": { "packages": { - "eslint-plugin-jsdoc>@es-joy/jsdoccomment>jsdoc-type-pratt-parser": true, - "eslint-plugin-jsdoc>comment-parser": true, - "eslint>esquery": true - } - }, - "eslint-plugin-jsdoc>@es-joy/jsdoccomment>jsdoc-type-pratt-parser": { - "globals": { - "define": true + "stylelint>postcss-html>htmlparser2>domelementtype": true } }, - "eslint-plugin-jsdoc>spdx-expression-parse": { + "stylelint>postcss-html>htmlparser2>domutils": { "packages": { - "eslint-plugin-jsdoc>spdx-expression-parse>spdx-exceptions": true, - "eslint-plugin-jsdoc>spdx-expression-parse>spdx-license-ids": true + "stylelint>postcss-html>htmlparser2>domutils>dom-serializer": true, + "stylelint>postcss-html>htmlparser2>domelementtype": true } }, - "eslint-plugin-mocha>eslint-utils": { + "browserify>duplexer2": { "packages": { - "eslint-plugin-mocha>eslint-utils>eslint-visitor-keys": true + "browserify>duplexer2>readable-stream": true } }, - "eslint-plugin-node": { + "debounce-stream>duplexer": { "builtin": { - "fs.readFileSync": true, - "fs.readdirSync": true, - "fs.statSync": true, - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.isAbsolute": true, - "path.join": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true - }, + "stream": true + } + }, + "duplexify": { "globals": { - "process.cwd": true + "Buffer": true, + "process.nextTick": true }, "packages": { - "depcheck>resolve": true, - "eslint-plugin-node>eslint-plugin-es": true, - "eslint-plugin-node>eslint-utils": true, - "eslint-plugin-node>semver": true, - "eslint>ignore": true, - "eslint>minimatch": true + "duplexify>end-of-stream": true, + "pumpify>inherits": true, + "readable-stream": true, + "duplexify>stream-shift": true } }, - "eslint-plugin-node>eslint-plugin-es": { + "gulp>vinyl-fs>glob-stream>pumpify>duplexify": { + "globals": { + "Buffer": true, + "process.nextTick": true + }, "packages": { - "eslint-plugin-node>eslint-plugin-es>regexpp": true, - "eslint-plugin-node>eslint-utils": true + "duplexify>end-of-stream": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>glob-stream>readable-stream": true, + "duplexify>stream-shift": true } }, - "eslint-plugin-node>eslint-utils": { + "gulp>vinyl-fs>pumpify>duplexify": { + "globals": { + "Buffer": true, + "process.nextTick": true + }, "packages": { - "eslint-plugin-node>eslint-utils>eslint-visitor-keys": true + "duplexify>end-of-stream": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>readable-stream": true, + "duplexify>stream-shift": true } }, - "eslint-plugin-node>semver": { + "duplexify>end-of-stream": { "globals": { - "console": true, - "process": true - } - }, - "eslint-plugin-prettier": { + "process.nextTick": true + }, "packages": { - "eslint-plugin-prettier>prettier-linter-helpers": true, - "prettier": true + "@metamask/object-multiplex>once": true } }, - "eslint-plugin-prettier>prettier-linter-helpers": { + "depcheck>cosmiconfig>parse-json>error-ex": { + "builtin": { + "util.inherits": true + }, "packages": { - "eslint-plugin-prettier>prettier-linter-helpers>fast-diff": true + "depcheck>cosmiconfig>parse-json>error-ex>is-arrayish": true } }, - "eslint-plugin-react": { + "gulp-livereload>tiny-lr>body>error": { "builtin": { - "fs.statSync": true, - "path.dirname": true, - "path.extname": true - }, - "globals": { - "console.error": true, - "console.log": true, - "process.argv.join": true, - "process.cwd": true + "assert": true }, "packages": { - "eslint": true, - "eslint-plugin-react>array-includes": true, - "eslint-plugin-react>array.prototype.flatmap": true, - "eslint-plugin-react>doctrine": true, - "eslint-plugin-react>estraverse": true, - "eslint-plugin-react>jsx-ast-utils": true, - "eslint-plugin-react>object.entries": true, - "eslint-plugin-react>object.fromentries": true, - "eslint-plugin-react>object.hasown": true, - "eslint-plugin-react>object.values": true, - "eslint-plugin-react>resolve": true, - "eslint-plugin-react>semver": true, - "eslint>minimatch": true, - "prop-types": true, - "string.prototype.matchall": true + "gulp-livereload>tiny-lr>body>error>string-template": true, + "watchify>xtend": true } }, - "eslint-plugin-react-hooks": { - "globals": { - "process.env.NODE_ENV": true + "string.prototype.matchall>es-abstract": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>call-bind>es-define-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>es-object-atoms": true, + "string.prototype.matchall>es-abstract>es-set-tostringtag": true, + "string.prototype.matchall>es-abstract>es-to-primitive": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>gopd": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true, + "string.prototype.matchall>es-abstract>has-proto": true, + "string.prototype.matchall>has-symbols": true, + "depcheck>is-core-module>hasown": true, + "string.prototype.matchall>internal-slot": true, + "string.prototype.matchall>es-abstract>is-callable": true, + "string.prototype.matchall>es-abstract>is-regex": true, + "eslint-plugin-react>array-includes>is-string": true, + "string.prototype.matchall>es-abstract>object-inspect": true, + "string.prototype.matchall>es-abstract>safe-regex-test": true, + "string.prototype.matchall>es-abstract>string.prototype.trim": true } }, - "eslint-plugin-react>array-includes": { + "string.prototype.matchall>call-bind>es-define-property": { "packages": { - "eslint-plugin-react>array-includes>is-string": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>es-abstract": true, "string.prototype.matchall>get-intrinsic": true } }, - "eslint-plugin-react>array-includes>is-string": { + "string.prototype.matchall>es-abstract>es-object-atoms": { "packages": { - "koa>is-generator-function>has-tostringtag": true + "string.prototype.matchall>call-bind>es-errors": true } }, - "eslint-plugin-react>array.prototype.flatmap": { + "string.prototype.matchall>es-abstract>es-set-tostringtag": { "packages": { - "eslint-plugin-react>array.prototype.flatmap>es-shim-unscopables": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>es-abstract": true + "string.prototype.matchall>get-intrinsic": true, + "koa>is-generator-function>has-tostringtag": true, + "depcheck>is-core-module>hasown": true } }, "eslint-plugin-react>array.prototype.flatmap>es-shim-unscopables": { @@ -2892,255 +2517,361 @@ "browserify>has": true } }, - "eslint-plugin-react>doctrine": { - "builtin": { - "assert": true - }, + "string.prototype.matchall>es-abstract>es-to-primitive": { "packages": { - "eslint>esutils": true + "string.prototype.matchall>es-abstract>is-callable": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true } }, - "eslint-plugin-react>jsx-ast-utils": { - "globals": { - "console.error": true - }, + "resolve-url-loader>es6-iterator>es5-ext": { "packages": { - "gulp>vinyl-fs>object.assign": true + "resolve-url-loader>es6-iterator>es6-symbol": true } }, - "eslint-plugin-react>object.entries": { + "resolve-url-loader>es6-iterator": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>es-abstract": true + "resolve-url-loader>es6-iterator>d": true, + "resolve-url-loader>es6-iterator>es5-ext": true, + "resolve-url-loader>es6-iterator>es6-symbol": true } }, - "eslint-plugin-react>object.fromentries": { + "resolve-url-loader>es6-iterator>es6-symbol": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>es-abstract": true + "resolve-url-loader>es6-iterator>d": true, + "resolve-url-loader>es6-iterator>es6-symbol>ext": true } }, - "eslint-plugin-react>object.hasown": { + "gulp>undertaker>es6-weak-map": { "packages": { - "string.prototype.matchall>es-abstract": true + "resolve-url-loader>es6-iterator>d": true, + "resolve-url-loader>es6-iterator>es5-ext": true, + "resolve-url-loader>es6-iterator": true, + "resolve-url-loader>es6-iterator>es6-symbol": true } }, - "eslint-plugin-react>resolve": { + "yargs>escalade": { "builtin": { - "fs.readFile": true, + "fs.readdirSync": true, + "fs.statSync": true, + "path.dirname": true, + "path.resolve": true + } + }, + "eslint": { + "builtin": { + "assert": true, + "fs.existsSync": true, + "fs.lstatSync": true, + "fs.promises": true, "fs.readFileSync": true, - "fs.realpath": true, - "fs.realpathSync": true, - "fs.stat": true, + "fs.readdirSync": true, "fs.statSync": true, - "os.homedir": true, + "fs.unlinkSync": true, + "fs.writeFile": true, + "fs.writeFileSync": true, "path.dirname": true, + "path.extname": true, + "path.isAbsolute": true, "path.join": true, - "path.parse": true, + "path.normalize": true, + "path.posix.join": true, "path.relative": true, - "path.resolve": true + "path.resolve": true, + "path.sep": true, + "url.pathToFileURL": true, + "util.format": true, + "util.inspect": true, + "util.promisify": true }, "globals": { - "process.env.HOME": true, - "process.env.HOMEDRIVE": true, - "process.env.HOMEPATH": true, - "process.env.LNAME": true, - "process.env.LOGNAME": true, - "process.env.USER": true, - "process.env.USERNAME": true, - "process.env.USERPROFILE": true, - "process.getuid": true, - "process.nextTick": true, - "process.platform": true, - "process.versions.pnp": true + "__dirname": true, + "console.log": true, + "describe": true, + "it": true, + "process": true }, "packages": { - "depcheck>is-core-module": true, - "depcheck>resolve>path-parse": true + "eslint>@eslint-community/eslint-utils": true, + "eslint>@eslint-community/regexpp": true, + "eslint>@eslint/eslintrc": true, + "eslint>@eslint/js": true, + "eslint>@humanwhocodes/config-array": true, + "eslint>@nodelib/fs.walk": true, + "eslint>@ungap/structured-clone": true, + "eslint>ajv": true, + "nock>debug": true, + "eslint>doctrine": true, + "mocha>escape-string-regexp": true, + "eslint>eslint-scope": true, + "eslint>eslint-visitor-keys": true, + "eslint>espree": true, + "eslint>esquery": true, + "eslint>esutils": true, + "eslint>fast-deep-equal": true, + "eslint>file-entry-cache": true, + "mocha>find-up": true, + "eslint>glob-parent": true, + "eslint>globals": true, + "eslint>graphemer": true, + "eslint>ignore": true, + "eslint>imurmurhash": true, + "del>is-glob": true, + "del>is-path-inside": true, + "eslint>json-stable-stringify-without-jsonify": true, + "eslint>levn": true, + "eslint>lodash.merge": true, + "eslint>minimatch": true, + "eslint>natural-compare": true } }, - "eslint-plugin-react>semver": { + "eslint-config-prettier": { "globals": { - "console": true, - "process": true + "process.env.ESLINT_CONFIG_PRETTIER_NO_DEPRECATED": true } }, - "eslint>@eslint-community/eslint-utils": { + "eslint-import-resolver-node": { + "builtin": { + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, "packages": { - "eslint>eslint-visitor-keys": true + "eslint-import-resolver-node>debug": true, + "depcheck>resolve": true } }, - "eslint>@eslint/eslintrc": { + "eslint-import-resolver-typescript": { "builtin": { - "assert": true, - "fs": true, + "path": true + }, + "globals": { + "console.warn": true, + "process.cwd": true + }, + "packages": { + "nock>debug": true, + "nyc>glob": true, + "del>is-glob": true, + "depcheck>resolve": true, + "eslint-plugin-import>tsconfig-paths": true + } + }, + "eslint-plugin-import>eslint-module-utils": { + "builtin": { + "crypto.createHash": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.readdirSync": true, "module": true, - "os": true, - "path": true, - "url": true, - "util": true + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true }, "globals": { - "__filename": true, + "__dirname.toUpperCase": true, + "console.warn": true, "process.cwd": true, - "process.emitWarning": true, - "process.platform": true + "process.hrtime": true }, "packages": { - "$root$": true, "@babel/eslint-parser": true, - "@babel/eslint-plugin": true, - "@metamask/eslint-config": true, - "@metamask/eslint-config-nodejs": true, - "@metamask/eslint-config-typescript": true, - "@typescript-eslint/eslint-plugin": true, - "eslint": true, - "eslint-config-prettier": true, - "eslint-plugin-import": true, - "eslint-plugin-jsdoc": true, - "eslint-plugin-node": true, - "eslint-plugin-prettier": true, - "eslint-plugin-react": true, - "eslint-plugin-react-hooks": true, - "eslint>ajv": true, - "eslint>globals": true, - "eslint>ignore": true, - "eslint>minimatch": true, - "mocha>strip-json-comments": true, - "nock>debug": true + "eslint-plugin-import>eslint-module-utils>debug": true, + "eslint-import-resolver-node": true, + "eslint-plugin-import>eslint-module-utils>find-up": true } }, - "eslint>@eslint/eslintrc>import-fresh": { + "eslint-plugin-node>eslint-plugin-es": { + "packages": { + "eslint-plugin-node>eslint-utils": true, + "eslint-plugin-node>eslint-plugin-es>regexpp": true + } + }, + "eslint-plugin-import": { "builtin": { - "path.dirname": true + "fs": true, + "path": true, + "vm": true }, "globals": { - "__dirname": true, - "__filename": true + "process.cwd": true, + "process.env": true }, "packages": { - "eslint>@eslint/eslintrc>import-fresh>parent-module": true, - "eslint>@eslint/eslintrc>import-fresh>resolve-from": true + "eslint-plugin-react>array-includes": true, + "eslint-plugin-import>array.prototype.flat": true, + "eslint-plugin-import>debug": true, + "eslint-plugin-import>doctrine": true, + "eslint": true, + "eslint-plugin-import>eslint-module-utils": true, + "browserify>has": true, + "depcheck>is-core-module": true, + "del>is-glob": true, + "eslint>minimatch": true, + "eslint-plugin-react>object.values": true, + "eslint-plugin-import>tsconfig-paths": true, + "typescript": true } }, - "eslint>@eslint/eslintrc>import-fresh>parent-module": { + "eslint-plugin-jest": { + "builtin": { + "fs.readdirSync": true, + "path.join": true, + "path.parse": true + }, + "globals": { + "__dirname": true + }, "packages": { - "@metamask/test-bundler>ow>callsites": true + "@typescript-eslint/eslint-plugin": true, + "eslint-plugin-jest>@typescript-eslint/utils": true } }, - "eslint>@eslint/eslintrc>import-fresh>resolve-from": { - "builtin": { - "fs.realpathSync": true, - "module._nodeModulePaths": true, - "module._resolveFilename": true, - "path.join": true, - "path.resolve": true + "eslint-plugin-jsdoc": { + "packages": { + "eslint-plugin-jsdoc>@es-joy/jsdoccomment": true, + "eslint-plugin-jsdoc>are-docs-informative": true, + "eslint-plugin-jsdoc>comment-parser": true, + "nock>debug": true, + "mocha>escape-string-regexp": true, + "eslint": true, + "eslint>esquery": true, + "semver": true, + "eslint-plugin-jsdoc>spdx-expression-parse": true } }, - "eslint>@humanwhocodes/config-array": { + "eslint-plugin-node": { "builtin": { + "fs.readFileSync": true, + "fs.readdirSync": true, + "fs.statSync": true, + "path.basename": true, "path.dirname": true, + "path.extname": true, + "path.isAbsolute": true, "path.join": true, - "path.relative": true + "path.relative": true, + "path.resolve": true, + "path.sep": true + }, + "globals": { + "process.cwd": true }, "packages": { - "eslint>@humanwhocodes/config-array>@humanwhocodes/object-schema": true, + "eslint-plugin-node>eslint-plugin-es": true, + "eslint-plugin-node>eslint-utils": true, + "eslint>ignore": true, "eslint>minimatch": true, - "nock>debug": true + "depcheck>resolve": true, + "eslint-plugin-node>semver": true } }, - "eslint>@nodelib/fs.walk": { - "builtin": { - "events.EventEmitter": true, - "path.sep": true, - "stream.Readable": true - }, - "globals": { - "setImmediate": true - }, + "eslint-plugin-prettier": { "packages": { - "eslint>@nodelib/fs.walk>@nodelib/fs.scandir": true, - "eslint>@nodelib/fs.walk>fastq": true + "prettier": true, + "eslint-plugin-prettier>prettier-linter-helpers": true } }, - "eslint>@nodelib/fs.walk>@nodelib/fs.scandir": { + "eslint-plugin-react": { "builtin": { - "fs.lstat": true, - "fs.lstatSync": true, - "fs.readdir": true, - "fs.readdirSync": true, - "fs.stat": true, "fs.statSync": true, - "path.sep": true + "path.dirname": true, + "path.extname": true }, "globals": { - "process.versions.node": true + "console.error": true, + "console.log": true, + "process.argv.join": true, + "process.cwd": true }, "packages": { - "eslint>@nodelib/fs.walk>@nodelib/fs.scandir>run-parallel": true, - "fast-glob>@nodelib/fs.stat": true + "eslint-plugin-react>array-includes": true, + "eslint-plugin-react>array.prototype.flatmap": true, + "eslint-plugin-react>doctrine": true, + "eslint": true, + "eslint-plugin-react>estraverse": true, + "eslint-plugin-react>jsx-ast-utils": true, + "eslint>minimatch": true, + "eslint-plugin-react>object.entries": true, + "eslint-plugin-react>object.fromentries": true, + "eslint-plugin-react>object.hasown": true, + "eslint-plugin-react>object.values": true, + "prop-types": true, + "eslint-plugin-react>resolve": true, + "eslint-plugin-react>semver": true, + "string.prototype.matchall": true } }, - "eslint>@nodelib/fs.walk>@nodelib/fs.scandir>run-parallel": { + "eslint-plugin-react-hooks": { "globals": { - "process.nextTick": true + "process.env.NODE_ENV": true } }, - "eslint>@nodelib/fs.walk>fastq": { + "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals>eslint-scope": { + "builtin": { + "assert": true + }, "packages": { - "eslint>@nodelib/fs.walk>fastq>reusify": true - } - }, - "eslint>@ungap/structured-clone": { - "globals": { - "structuredClone": true + "eslint>eslint-scope>esrecurse": true, + "@babel/eslint-parser>@nicolo-ribaudo/eslint-scope-5-internals>eslint-scope>estraverse": true } }, - "eslint>ajv": { - "globals": { - "console": true + "eslint-plugin-jest>@typescript-eslint/utils>eslint-scope": { + "builtin": { + "assert": true }, "packages": { - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "eslint>ajv>json-schema-traverse": true, - "eslint>fast-deep-equal": true, - "uri-js": true + "eslint>eslint-scope>esrecurse": true, + "eslint-plugin-jest>@typescript-eslint/utils>eslint-scope>estraverse": true } }, - "eslint>doctrine": { + "eslint>eslint-scope": { "builtin": { "assert": true }, "packages": { - "eslint>esutils": true + "eslint>eslint-scope>esrecurse": true, + "eslint-plugin-react>estraverse": true } }, - "eslint>eslint-scope": { + "webpack>eslint-scope": { "builtin": { "assert": true }, "packages": { - "eslint-plugin-react>estraverse": true, - "eslint>eslint-scope>esrecurse": true + "eslint>eslint-scope>esrecurse": true, + "webpack>eslint-scope>estraverse": true } }, - "eslint>eslint-scope>esrecurse": { + "eslint-plugin-jest>@typescript-eslint/experimental-utils>eslint-utils": { "packages": { - "eslint-plugin-react>estraverse": true + "eslint-plugin-jest>@typescript-eslint/experimental-utils>eslint-utils>eslint-visitor-keys": true } }, - "eslint>espree": { + "eslint-plugin-jest>@typescript-eslint/utils>eslint-utils": { "packages": { - "eslint>eslint-visitor-keys": true, - "eslint>espree>acorn-jsx": true, - "jsdom>acorn": true + "eslint>@eslint-community/eslint-utils": true, + "eslint-plugin-jest>@typescript-eslint/utils>eslint-utils>eslint-visitor-keys": true, + "semver": true } }, - "eslint>espree>acorn-jsx": { + "eslint-plugin-mocha>eslint-utils": { "packages": { - "jsdom>acorn": true + "eslint-plugin-mocha>eslint-utils>eslint-visitor-keys": true + } + }, + "eslint-plugin-node>eslint-utils": { + "packages": { + "eslint-plugin-node>eslint-utils>eslint-visitor-keys": true + } + }, + "eslint>espree": { + "packages": { + "eslint>espree>acorn-jsx": true, + "jsdom>acorn": true, + "eslint>eslint-visitor-keys": true } }, "eslint>esquery": { @@ -3148,90 +2879,140 @@ "define": true } }, - "eslint>file-entry-cache": { - "builtin": { - "crypto.createHash": true, - "fs.readFileSync": true, - "fs.statSync": true, - "path.basename": true, - "path.dirname": true - }, + "eslint>eslint-scope>esrecurse": { "packages": { - "eslint>file-entry-cache>flat-cache": true + "eslint-plugin-react>estraverse": true } }, - "eslint>file-entry-cache>flat-cache": { + "eta": { "builtin": { - "fs.existsSync": true, - "fs.mkdirSync": true, - "fs.readFileSync": true, - "fs.writeFileSync": true, - "path.basename": true, - "path.dirname": true, - "path.resolve": true + "node:fs": true, + "node:path": true }, "globals": { - "__dirname": true - }, + "define": true + } + }, + "gulp-sourcemaps>debug-fabulous>memoizee>event-emitter": { "packages": { - "del>rimraf": true, - "eslint>file-entry-cache>flat-cache>flatted": true + "resolve-url-loader>es6-iterator>d": true, + "resolve-url-loader>es6-iterator>es5-ext": true } }, - "eslint>glob-parent": { + "gulp-livereload>event-stream": { "builtin": { - "os.platform": true, - "path.posix.dirname": true + "buffer.Buffer.isBuffer": true, + "stream.Stream": true + }, + "globals": { + "Buffer.concat": true, + "Buffer.isBuffer": true, + "console.error": true, + "process.nextTick": true, + "setImmediate": true }, "packages": { - "del>is-glob": true + "debounce-stream>duplexer": true, + "gulp-livereload>event-stream>from": true, + "gulp-livereload>event-stream>map-stream": true, + "gulp-livereload>event-stream>pause-stream": true, + "gulp-livereload>event-stream>split": true, + "gulp-livereload>event-stream>stream-combiner": true, + "debounce-stream>through": true } }, - "eslint>ignore": { + "@lavamoat/lavapack>readable-stream>abort-controller>event-target-shim": { "globals": { - "process": true + "Event": true, + "EventTarget": true, + "console": true } }, - "eslint>levn": { + "stylelint>execall": { "packages": { - "eslint>levn>prelude-ls": true, - "eslint>levn>type-check": true + "stylelint>execall>clone-regexp": true } }, - "eslint>levn>type-check": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets": { + "globals": { + "__filename": true + }, "packages": { - "eslint>levn>prelude-ls": true + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>debug": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>extend-shallow": true, + "gulp>gulp-cli>matchdep>micromatch>extglob>expand-brackets>posix-character-classes": true, + "gulp>gulp-cli>matchdep>micromatch>regex-not": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex": true } }, - "eslint>minimatch": { - "builtin": { - "path": true - }, + "gulp-watch>anymatch>micromatch>expand-brackets": { + "packages": { + "gulp-watch>anymatch>micromatch>expand-brackets>is-posix-bracket": true + } + }, + "gulp-watch>anymatch>micromatch>braces>expand-range": { + "packages": { + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range": true + } + }, + "resolve-url-loader>es6-iterator>es6-symbol>ext": { "globals": { - "console": true - }, + "__global__": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>braces>extend-shallow": { "packages": { - "eslint>minimatch>brace-expansion": true + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true } }, - "eslint>minimatch>brace-expansion": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>extend-shallow": { "packages": { - "eslint>minimatch>brace-expansion>concat-map": true, - "stylelint>balanced-match": true + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true } }, - "eslint>strip-ansi": { + "gulp>glob-watcher>anymatch>micromatch>extglob>extend-shallow": { "packages": { - "eslint>strip-ansi>ansi-regex": true + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true } }, - "eta": { - "builtin": { - "node:fs": true, - "node:path": true - }, - "globals": { - "define": true + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>extend-shallow": { + "packages": { + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + } + }, + "gulp-zip>plugin-error>extend-shallow": { + "packages": { + "gulp-zip>plugin-error>extend-shallow>assign-symbols": true, + "gulp-zip>plugin-error>extend-shallow>is-extendable": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value>extend-shallow": { + "packages": { + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>extend-shallow": { + "packages": { + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>extglob": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>array-unique": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>define-property": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>extend-shallow": true, + "gulp>gulp-cli>matchdep>micromatch>fragment-cache": true, + "gulp>gulp-cli>matchdep>micromatch>regex-not": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex": true + } + }, + "gulp-watch>anymatch>micromatch>extglob": { + "packages": { + "gulp-watch>anymatch>micromatch>is-extglob": true } }, "fancy-log": { @@ -3252,14 +3033,17 @@ "fancy-log>time-stamp": true } }, - "fancy-log>ansi-gray": { - "packages": { - "fancy-log>ansi-gray>ansi-wrap": true - } - }, - "fancy-log>color-support": { + "gulp-watch>fancy-log": { "globals": { - "process": true + "console": true, + "process.argv.indexOf": true, + "process.stderr.write": true, + "process.stdout.write": true + }, + "packages": { + "fancy-log>ansi-gray": true, + "fancy-log>color-support": true, + "fancy-log>time-stamp": true } }, "fast-glob": { @@ -3281,781 +3065,618 @@ "process.cwd": true }, "packages": { + "fast-glob>@nodelib/fs.stat": true, "eslint>@nodelib/fs.walk": true, "eslint>glob-parent": true, - "fast-glob>@nodelib/fs.stat": true, - "fast-glob>micromatch": true, - "globby>merge2": true - } - }, - "fast-glob>@nodelib/fs.stat": { - "builtin": { - "fs.lstat": true, - "fs.lstatSync": true, - "fs.stat": true, - "fs.statSync": true + "globby>merge2": true, + "fast-glob>micromatch": true } }, - "fast-glob>micromatch": { - "builtin": { - "util.inspect": true - }, + "eslint>@nodelib/fs.walk>fastq": { "packages": { - "chokidar>anymatch>picomatch": true, - "chokidar>braces": true + "eslint>@nodelib/fs.walk>fastq>reusify": true } }, - "fs-extra": { + "gulp-livereload>tiny-lr>faye-websocket": { "builtin": { - "assert": true, - "fs": true, - "os.tmpdir": true, - "path.dirname": true, - "path.isAbsolute": true, - "path.join": true, - "path.normalize": true, - "path.parse": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true + "net.connect": true, + "stream.Stream": true, + "tls.connect": true, + "url.parse": true, + "util.inherits": true }, "globals": { "Buffer": true, - "console.warn": true, - "process.arch": true, - "process.cwd": true, - "process.platform": true, - "process.umask": true, - "process.versions.node.split": true, - "setTimeout": true + "clearInterval": true, + "process.nextTick": true, + "setInterval": true }, "packages": { - "del>graceful-fs": true, - "fs-extra>jsonfile": true, - "fs-extra>universalify": true + "webpack-dev-server>sockjs>websocket-driver": true } }, - "fs-extra>jsonfile": { + "eslint>file-entry-cache": { "builtin": { - "fs": true - }, - "globals": { - "Buffer.isBuffer": true + "crypto.createHash": true, + "fs.readFileSync": true, + "fs.statSync": true, + "path.basename": true, + "path.dirname": true }, "packages": { - "del>graceful-fs": true - } - }, - "gh-pages>globby>pinkie-promise": { - "packages": { - "gh-pages>globby>pinkie-promise>pinkie": true - } - }, - "gh-pages>globby>pinkie-promise>pinkie": { - "globals": { - "process": true, - "setImmediate": true, - "setTimeout": true + "eslint>file-entry-cache>flat-cache": true } }, - "globby": { + "stylelint>file-entry-cache": { "builtin": { - "fs.Stats": true, - "fs.readFile": true, + "crypto.createHash": true, "fs.readFileSync": true, "fs.statSync": true, - "path.dirname": true, - "path.isAbsolute": true, - "path.join": true, - "path.posix.join": true, - "path.relative": true, - "stream.Transform": true, - "util.promisify": true - }, - "globals": { - "process.cwd": true + "path.basename": true, + "path.dirname": true }, "packages": { - "del>slash": true, - "eslint>ignore": true, - "fast-glob": true, - "globby>array-union": true, - "globby>dir-glob": true, - "globby>merge2": true + "stylelint>file-entry-cache>flat-cache": true } }, - "globby>dir-glob": { + "chokidar>braces>fill-range": { "builtin": { - "path.extname": true, - "path.isAbsolute": true, - "path.join": true, - "path.posix.join": true - }, - "globals": { - "process.cwd": true + "util.inspect": true }, "packages": { - "globby>dir-glob>path-type": true + "chokidar>braces>fill-range>to-regex-range": true } }, - "globby>dir-glob>path-type": { + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range": { "builtin": { - "fs": true, - "util.promisify": true + "util.inspect": true + }, + "packages": { + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>extend-shallow": true, + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true, + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>to-regex-range": true } }, - "globby>merge2": { - "builtin": { - "stream.PassThrough": true - }, - "globals": { - "process.nextTick": true + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range": { + "packages": { + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number": true, + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>isobject": true, + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic": true, + "gulp-watch>anymatch>micromatch>braces>repeat-element": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true } }, - "gulp": { + "eslint-plugin-import>eslint-module-utils>find-up": { "builtin": { - "util.inherits": true + "path.dirname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true }, "packages": { - "gulp>glob-watcher": true, - "gulp>undertaker": true, - "gulp>vinyl-fs": true + "eslint-plugin-import>eslint-module-utils>find-up>locate-path": true } }, - "gulp-livereload": { + "mocha>find-up": { "builtin": { - "path.relative": true + "path.dirname": true, + "path.parse": true, + "path.resolve": true }, "packages": { - "fancy-log": true, - "gulp-livereload>chalk": true, - "gulp-livereload>debug": true, - "gulp-livereload>event-stream": true, - "gulp-livereload>lodash.assign": true, - "gulp-livereload>tiny-lr": true + "mocha>find-up>locate-path": true, + "nyc>find-up>path-exists": true } }, - "gulp-livereload>chalk": { + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": { + "builtin": { + "util.inherits": true + }, "globals": { - "process.env.TERM": true, - "process.platform": true + "Buffer.concat": true, + "setImmediate": true }, "packages": { - "gulp-livereload>chalk>ansi-styles": true, - "gulp-livereload>chalk>escape-string-regexp": true, - "gulp-livereload>chalk>supports-color": true - } - }, - "gulp-livereload>chalk>ansi-styles": { - "packages": { - "@metamask/jazzicon>color>color-convert": true + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream": true } }, - "gulp-livereload>chalk>supports-color": { + "eslint>file-entry-cache>flat-cache": { "builtin": { - "os.release": true + "fs.existsSync": true, + "fs.mkdirSync": true, + "fs.readFileSync": true, + "fs.writeFileSync": true, + "path.basename": true, + "path.dirname": true, + "path.resolve": true }, "globals": { - "process.env": true, - "process.platform": true, - "process.stderr": true, - "process.stdout": true, - "process.versions.node.split": true + "__dirname": true }, "packages": { - "gulp-livereload>chalk>supports-color>has-flag": true + "eslint>file-entry-cache>flat-cache>flatted": true, + "del>rimraf": true } }, - "gulp-livereload>chalk>supports-color>has-flag": { - "globals": { - "process.argv": true - } - }, - "gulp-livereload>debug": { + "stylelint>file-entry-cache>flat-cache": { "builtin": { - "tty.isatty": true, - "util": true + "fs.existsSync": true, + "fs.readFileSync": true, + "path.basename": true, + "path.dirname": true, + "path.resolve": true }, "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "__dirname": true }, "packages": { - "gulp-livereload>chalk>supports-color": true, - "mocha>ms": true + "stylelint>file-entry-cache>flat-cache>flatted": true, + "stylelint>file-entry-cache>flat-cache>rimraf": true, + "stylelint>file-entry-cache>flat-cache>write": true } }, - "gulp-livereload>event-stream": { - "builtin": { - "buffer.Buffer.isBuffer": true, - "stream.Stream": true - }, + "gulp>vinyl-fs>lead>flush-write-stream": { "globals": { - "Buffer.concat": true, - "Buffer.isBuffer": true, - "console.error": true, - "process.nextTick": true, - "setImmediate": true + "Buffer": true }, "packages": { - "debounce-stream>duplexer": true, - "debounce-stream>through": true, - "gulp-livereload>event-stream>from": true, - "gulp-livereload>event-stream>map-stream": true, - "gulp-livereload>event-stream>pause-stream": true, - "gulp-livereload>event-stream>split": true, - "gulp-livereload>event-stream>stream-combiner": true + "pumpify>inherits": true, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream": true } }, - "gulp-livereload>event-stream>from": { - "builtin": { - "stream": true - }, - "globals": { - "process.nextTick": true + "lavamoat>lavamoat-core>merge-deep>clone-deep>for-own": { + "packages": { + "gulp>undertaker>object.reduce>for-own>for-in": true } }, - "gulp-livereload>event-stream>map-stream": { - "builtin": { - "stream.Stream": true - }, - "globals": { - "process.nextTick": true + "gulp-watch>anymatch>micromatch>object.omit>for-own": { + "packages": { + "gulp>undertaker>object.reduce>for-own>for-in": true } }, - "gulp-livereload>event-stream>pause-stream": { + "gulp>undertaker>object.reduce>for-own": { "packages": { - "debounce-stream>through": true + "gulp>undertaker>object.reduce>for-own>for-in": true } }, - "gulp-livereload>event-stream>split": { - "builtin": { - "string_decoder.StringDecoder": true - }, + "gulp>gulp-cli>matchdep>micromatch>fragment-cache": { "packages": { - "debounce-stream>through": true + "gulp>gulp-cli>liftoff>fined>parse-filepath>map-cache": true } }, - "gulp-livereload>event-stream>stream-combiner": { - "packages": { - "debounce-stream>duplexer": true + "gulp-livereload>event-stream>from": { + "builtin": { + "stream": true + }, + "globals": { + "process.nextTick": true } }, - "gulp-livereload>tiny-lr": { + "fs-extra": { "builtin": { - "events": true, + "assert": true, "fs": true, - "http": true, - "https": true, - "url.parse": true + "os.tmpdir": true, + "path.dirname": true, + "path.isAbsolute": true, + "path.join": true, + "path.normalize": true, + "path.parse": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true }, "globals": { - "console.error": true + "Buffer": true, + "console.warn": true, + "process.arch": true, + "process.cwd": true, + "process.platform": true, + "process.umask": true, + "process.versions.node.split": true, + "setTimeout": true }, "packages": { - "@storybook/addon-knobs>qs": true, - "gulp-livereload>tiny-lr>body": true, - "gulp-livereload>tiny-lr>debug": true, - "gulp-livereload>tiny-lr>faye-websocket": true, - "react>object-assign": true + "del>graceful-fs": true, + "fs-extra>jsonfile": true, + "fs-extra>universalify": true } }, - "gulp-livereload>tiny-lr>body": { + "gulp>vinyl-fs>fs-mkdirp-stream": { "builtin": { - "querystring.parse": true + "path.dirname": true, + "path.resolve": true + }, + "globals": { + "process.umask": true }, "packages": { - "gulp-livereload>tiny-lr>body>continuable-cache": true, - "gulp-livereload>tiny-lr>body>error": true, - "gulp-livereload>tiny-lr>body>raw-body": true, - "gulp-livereload>tiny-lr>body>safe-json-parse": true + "del>graceful-fs": true, + "gulp>vinyl-fs>fs-mkdirp-stream>through2": true } }, - "gulp-livereload>tiny-lr>body>error": { + "nyc>glob>fs.realpath": { "builtin": { - "assert": true + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readlink": true, + "fs.readlinkSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.normalize": true, + "path.resolve": true }, - "packages": { - "gulp-livereload>tiny-lr>body>error>string-template": true, - "watchify>xtend": true + "globals": { + "console.error": true, + "console.trace": true, + "process.env.NODE_DEBUG": true, + "process.nextTick": true, + "process.noDeprecation": true, + "process.platform": true, + "process.throwDeprecation": true, + "process.traceDeprecation": true, + "process.version": true } }, - "gulp-livereload>tiny-lr>body>raw-body": { + "chokidar>fsevents": { "globals": { - "Buffer.concat": true, - "process.nextTick": true + "console.assert": true, + "process.platform": true }, - "packages": { - "gulp-livereload>tiny-lr>body>raw-body>bytes": true, - "gulp-livereload>tiny-lr>body>raw-body>string_decoder": true - } - }, - "gulp-livereload>tiny-lr>body>raw-body>string_decoder": { - "builtin": { - "buffer.Buffer": true - } + "native": true }, - "gulp-livereload>tiny-lr>debug": { + "gulp>glob-watcher>chokidar>fsevents": { "builtin": { - "tty.isatty": true, - "util": true + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, + "util.inherits": true }, "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "__dirname": true, + "console.assert": true, + "process.nextTick": true, + "process.platform": true, + "setImmediate": true }, "packages": { - "mocha>ms": true, - "mocha>supports-color": true + "gulp-watch>chokidar>fsevents>node-pre-gyp": true } }, - "gulp-livereload>tiny-lr>faye-websocket": { + "gulp-watch>chokidar>fsevents": { "builtin": { - "net.connect": true, - "stream.Stream": true, - "tls.connect": true, - "url.parse": true, + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, "util.inherits": true }, "globals": { - "Buffer": true, - "clearInterval": true, + "__dirname": true, + "console.assert": true, "process.nextTick": true, - "setInterval": true + "process.platform": true, + "setImmediate": true }, "packages": { - "webpack-dev-server>sockjs>websocket-driver": true + "gulp-watch>chokidar>fsevents>node-pre-gyp": true } }, - "gulp-postcss": { + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge": { "builtin": { - "path.dirname": true, - "path.isAbsolute": true, - "path.join": true, - "stream.Transform": true + "util.format": true }, "globals": { - "Buffer.from": true, - "setImmediate": true - }, - "packages": { - "fancy-log": true, - "gulp-postcss>postcss-load-config": true, - "gulp-zip>plugin-error": true, - "postcss": true, - "vinyl-sourcemaps-apply": true - } - }, - "gulp-postcss>postcss-load-config": { - "builtin": { - "module.createRequire": true, - "module.createRequireFromPath": true, - "path.resolve": true - }, - "globals": { - "process.cwd": true, - "process.env.NODE_ENV": true + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true }, "packages": { - "gulp-postcss>postcss-load-config>lilconfig": true, - "gulp-postcss>postcss-load-config>yaml": true, - "ts-node": true + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>aproba": true, + "@storybook/react>@storybook/node-logger>npmlog>console-control-strings": true, + "@storybook/react>@storybook/node-logger>npmlog>gauge>has-unicode": true, + "react>object-assign": true, + "nyc>signal-exit": true, + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width": true, + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": true, + "@storybook/react>@storybook/node-logger>npmlog>gauge>wide-align": true } }, - "gulp-postcss>postcss-load-config>lilconfig": { + "browserify>insert-module-globals>undeclared-identifiers>get-assigned-identifiers": { "builtin": { - "fs.accessSync": true, - "fs.promises.access": true, - "fs.promises.readFile": true, - "fs.readFileSync": true, - "os.homedir": true, - "path.extname": true, - "path.join": true, - "path.parse": true, - "path.resolve": true, - "path.sep": true - }, - "globals": { - "process.cwd": true + "assert.equal": true } }, - "gulp-postcss>postcss-load-config>yaml": { + "string.prototype.matchall>get-intrinsic": { "globals": { - "Buffer": true, - "YAML_SILENCE_DEPRECATION_WARNINGS": true, - "YAML_SILENCE_WARNINGS": true, - "atob": true, - "btoa": true, - "console.warn": true, - "process": true + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true + }, + "packages": { + "string.prototype.matchall>call-bind>es-errors": true, + "browserify>has>function-bind": true, + "string.prototype.matchall>es-abstract>has-proto": true, + "string.prototype.matchall>has-symbols": true, + "depcheck>is-core-module>hasown": true } }, - "gulp-sass": { + "gulp-zip>get-stream": { "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true, - "path.relative": true, - "stream.Transform": true + "buffer.constants.MAX_LENGTH": true, + "stream.PassThrough": true }, "globals": { - "process.cwd": true, - "process.exit": true, - "process.stderr.write": true + "Buffer.concat": true }, "packages": { - "eslint>strip-ansi": true, - "gulp-sass>lodash.clonedeep": true, - "gulp-sass>replace-ext": true, - "gulp-zip>plugin-error": true, - "postcss>picocolors": true, - "vinyl-sourcemaps-apply": true + "pumpify>pump": true } }, - "gulp-sass>replace-ext": { + "gulp-watch>anymatch>micromatch>parse-glob>glob-base": { "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true, - "path.sep": true + "path.dirname": true + }, + "packages": { + "eslint>glob-parent": true, + "gulp-watch>anymatch>micromatch>parse-glob>glob-base>is-glob": true } }, - "gulp-sort": { + "eslint>glob-parent": { + "builtin": { + "os.platform": true, + "path.posix.dirname": true + }, "packages": { - "gulp-sort>through2": true + "del>is-glob": true } }, - "gulp-sort>through2": { + "gulp>vinyl-fs>glob-stream": { "builtin": { "util.inherits": true }, "globals": { + "process.cwd": true, "process.nextTick": true }, "packages": { - "gulp-sort>through2>readable-stream": true, - "watchify>xtend": true + "react-markdown>unified>extend": true, + "eslint>glob-parent": true, + "nyc>glob": true, + "gulp>glob-watcher>is-negated-glob": true, + "gulp>vinyl-fs>glob-stream>ordered-read-streams": true, + "gulp>vinyl-fs>glob-stream>pumpify": true, + "gulp>vinyl-fs>glob-stream>readable-stream": true, + "vinyl>remove-trailing-separator": true, + "gulp>vinyl-fs>glob-stream>to-absolute-glob": true, + "gulp>vinyl-fs>glob-stream>unique-stream": true } }, - "gulp-sort>through2>readable-stream": { + "gulp>glob-watcher": { + "packages": { + "gulp>glob-watcher>anymatch": true, + "gulp>glob-watcher>async-done": true, + "chokidar": true, + "gulp>glob-watcher>is-negated-glob": true, + "gulp>glob-watcher>just-debounce": true, + "gulp>undertaker>object.defaults": true + } + }, + "nyc>glob": { "builtin": { + "assert": true, "events.EventEmitter": true, - "stream": true, + "fs": true, + "path.join": true, + "path.resolve": true, "util": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "console.error": true, + "process.cwd": true, + "process.nextTick": true, + "process.platform": true }, "packages": { - "gulp-sort>through2>readable-stream>isarray": true, - "gulp-sort>through2>readable-stream>safe-buffer": true, - "gulp-sort>through2>readable-stream>string_decoder": true, + "nyc>glob>fs.realpath": true, + "nyc>glob>inflight": true, "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "eslint>minimatch": true, + "@metamask/object-multiplex>once": true, + "gulp-watch>path-is-absolute": true } }, - "gulp-sort>through2>readable-stream>safe-buffer": { + "stylelint>global-modules": { "builtin": { - "buffer": true + "path.resolve": true + }, + "globals": { + "process.env.OSTYPE": true, + "process.platform": true + }, + "packages": { + "stylelint>global-modules>global-prefix": true } }, - "gulp-sort>through2>readable-stream>string_decoder": { + "stylelint>global-modules>global-prefix": { + "builtin": { + "fs.readFileSync": true, + "fs.realpathSync": true, + "os.homedir": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, + "globals": { + "process.env.APPDATA": true, + "process.env.DESTDIR": true, + "process.env.OSTYPE": true, + "process.env.PREFIX": true, + "process.execPath": true, + "process.platform": true + }, "packages": { - "gulp-sort>through2>readable-stream>safe-buffer": true + "stylelint>global-modules>global-prefix>ini": true, + "stylelint>global-modules>global-prefix>which": true } }, - "gulp-sourcemaps": { + "globby": { "builtin": { + "fs.Stats": true, + "fs.readFile": true, + "fs.readFileSync": true, + "fs.statSync": true, "path.dirname": true, - "path.extname": true, + "path.isAbsolute": true, "path.join": true, + "path.posix.join": true, "path.relative": true, - "path.resolve": true, - "path.sep": true + "stream.Transform": true, + "util.promisify": true }, "globals": { - "Buffer.concat": true, - "Buffer.from": true + "process.cwd": true }, "packages": { - "del>graceful-fs": true, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map": true, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources": true, - "gulp-sourcemaps>acorn": true, - "gulp-sourcemaps>css": true, - "gulp-sourcemaps>debug-fabulous": true, - "gulp-sourcemaps>detect-newline": true, - "gulp-sourcemaps>source-map": true, - "gulp-sourcemaps>strip-bom-string": true, - "gulp-sourcemaps>through2": true, - "nyc>convert-source-map": true + "globby>array-union": true, + "globby>dir-glob": true, + "fast-glob": true, + "eslint>ignore": true, + "globby>merge2": true, + "del>slash": true } }, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map": { - "packages": { - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>acorn": true, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>normalize-path": true, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss": true, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>source-map": true, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>through2": true + "stylelint>globjoin": { + "builtin": { + "path.join": true } }, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>acorn": { + "stylelint>postcss-sass>gonzales-pe": { "globals": { + "console.error": true, "define": true } }, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss": { - "builtin": { - "fs": true, - "path": true - }, - "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console": true, - "process.env.NODE_ENV": true - }, + "string.prototype.matchall>es-abstract>gopd": { "packages": { - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss>picocolors": true, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>source-map": true + "string.prototype.matchall>get-intrinsic": true } }, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss>picocolors": { + "del>graceful-fs": { "builtin": { - "tty.isatty": true + "assert.equal": true, + "constants.O_SYMLINK": true, + "constants.O_WRONLY": true, + "constants.hasOwnProperty": true, + "fs": true, + "stream.Stream.call": true, + "util": true }, "globals": { - "process.argv.includes": true, - "process.env": true, - "process.platform": true - } - }, - "gulp-sourcemaps>@gulp-sourcemaps/identity-map>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, - "packages": { - "readable-stream": true - } - }, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources": { - "packages": { - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2": true, - "gulp-watch>anymatch>normalize-path": true + "clearTimeout": true, + "console.error": true, + "process": true, + "setTimeout": true } }, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2": { + "gulp": { "builtin": { "util.inherits": true }, - "globals": { - "process.nextTick": true - }, "packages": { - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream": true, - "watchify>xtend": true + "gulp>glob-watcher": true, + "gulp>undertaker": true, + "gulp>vinyl-fs": true } }, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream": { + "gulp-livereload": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "path.relative": true }, "packages": { - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>isarray": true, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>safe-buffer": true, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>string_decoder": { - "packages": { - "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>safe-buffer": true - } - }, - "gulp-sourcemaps>acorn": { - "globals": { - "define": true + "gulp-livereload>chalk": true, + "gulp-livereload>debug": true, + "gulp-livereload>event-stream": true, + "fancy-log": true, + "gulp-livereload>lodash.assign": true, + "gulp-livereload>tiny-lr": true } }, - "gulp-sourcemaps>css": { + "gulp-postcss": { "builtin": { - "fs.readFileSync": true, "path.dirname": true, - "path.sep": true - }, - "packages": { - "gulp-sourcemaps>css>source-map": true, - "gulp-sourcemaps>css>source-map-resolve": true, - "pumpify>inherits": true - } - }, - "gulp-sourcemaps>css>source-map-resolve": { - "builtin": { - "path.sep": true, - "url.resolve": true + "path.isAbsolute": true, + "path.join": true, + "stream.Transform": true }, "globals": { - "TextDecoder": true, + "Buffer.from": true, "setImmediate": true }, "packages": { - "gulp-sourcemaps>css>source-map-resolve>atob": true, - "gulp-sourcemaps>css>source-map-resolve>decode-uri-component": true - } - }, - "gulp-sourcemaps>css>source-map-resolve>atob": { - "globals": { - "Buffer.from": true - } - }, - "gulp-sourcemaps>debug-fabulous": { - "packages": { - "gulp-sourcemaps>debug-fabulous>debug": true, - "gulp-sourcemaps>debug-fabulous>memoizee": true, - "react>object-assign": true + "fancy-log": true, + "gulp-zip>plugin-error": true, + "postcss": true, + "gulp-postcss>postcss-load-config": true, + "vinyl-sourcemaps-apply": true } }, - "gulp-sourcemaps>debug-fabulous>debug": { + "gulp-sass": { "builtin": { - "tty.isatty": true, - "util": true - }, - "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.relative": true, + "stream.Transform": true }, - "packages": { - "mocha>ms": true, - "mocha>supports-color": true - } - }, - "gulp-sourcemaps>debug-fabulous>memoizee": { "globals": { - "clearTimeout": true, - "setTimeout": true + "process.cwd": true, + "process.exit": true, + "process.stderr.write": true }, "packages": { - "gulp-sourcemaps>debug-fabulous>memoizee>event-emitter": true, - "gulp-sourcemaps>debug-fabulous>memoizee>is-promise": true, - "gulp-sourcemaps>debug-fabulous>memoizee>lru-queue": true, - "gulp-sourcemaps>debug-fabulous>memoizee>next-tick": true, - "gulp-sourcemaps>debug-fabulous>memoizee>timers-ext": true, - "resolve-url-loader>es6-iterator>d": true, - "resolve-url-loader>es6-iterator>es5-ext": true - } - }, - "gulp-sourcemaps>debug-fabulous>memoizee>event-emitter": { - "packages": { - "resolve-url-loader>es6-iterator>d": true, - "resolve-url-loader>es6-iterator>es5-ext": true - } - }, - "gulp-sourcemaps>debug-fabulous>memoizee>lru-queue": { - "packages": { - "resolve-url-loader>es6-iterator>es5-ext": true - } - }, - "gulp-sourcemaps>debug-fabulous>memoizee>next-tick": { - "globals": { - "MutationObserver": true, - "WebKitMutationObserver": true, - "document": true, - "process": true, - "queueMicrotask": true, - "setImmediate": true, - "setTimeout": true - } - }, - "gulp-sourcemaps>debug-fabulous>memoizee>timers-ext": { - "packages": { - "resolve-url-loader>es6-iterator>es5-ext": true + "gulp-sass>lodash.clonedeep": true, + "postcss>picocolors": true, + "gulp-zip>plugin-error": true, + "gulp-sass>replace-ext": true, + "eslint>strip-ansi": true, + "vinyl-sourcemaps-apply": true } }, - "gulp-sourcemaps>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, + "gulp-sort": { "packages": { - "gulp-sourcemaps>through2>readable-stream": true, - "watchify>xtend": true + "gulp-sort>through2": true } }, - "gulp-sourcemaps>through2>readable-stream": { + "gulp-sourcemaps": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer.concat": true, + "Buffer.from": true }, "packages": { - "gulp-sourcemaps>through2>readable-stream>isarray": true, - "gulp-sourcemaps>through2>readable-stream>safe-buffer": true, - "gulp-sourcemaps>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "gulp-sourcemaps>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "gulp-sourcemaps>through2>readable-stream>string_decoder": { - "packages": { - "gulp-sourcemaps>through2>readable-stream>safe-buffer": true + "gulp-sourcemaps>@gulp-sourcemaps/identity-map": true, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources": true, + "gulp-sourcemaps>acorn": true, + "nyc>convert-source-map": true, + "gulp-sourcemaps>css": true, + "gulp-sourcemaps>debug-fabulous": true, + "gulp-sourcemaps>detect-newline": true, + "del>graceful-fs": true, + "gulp-sourcemaps>source-map": true, + "gulp-sourcemaps>strip-bom-string": true, + "gulp-sourcemaps>through2": true } }, "gulp-stylelint": { @@ -4071,23 +3692,12 @@ "process.nextTick": true }, "packages": { - "eslint>strip-ansi": true, "fancy-log": true, - "gulp-stylelint>through2": true, "gulp-zip>plugin-error": true, "source-map": true, - "stylelint": true - } - }, - "gulp-stylelint>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, - "packages": { - "readable-stream": true + "eslint>strip-ansi": true, + "stylelint": true, + "gulp-stylelint>through2": true } }, "gulp-watch": { @@ -4104,777 +3714,513 @@ "setTimeout": true }, "packages": { - "chokidar": true, - "eslint>glob-parent": true, "gulp-watch>ansi-colors": true, "gulp-watch>anymatch": true, + "chokidar": true, "gulp-watch>fancy-log": true, + "eslint>glob-parent": true, + "react>object-assign": true, "gulp-watch>path-is-absolute": true, + "gulp-zip>plugin-error": true, "gulp-watch>readable-stream": true, "gulp-watch>slash": true, - "gulp-watch>vinyl-file": true, - "gulp-zip>plugin-error": true, - "react>object-assign": true, - "vinyl": true - } - }, - "gulp-watch>ansi-colors": { - "packages": { - "fancy-log>ansi-gray>ansi-wrap": true + "vinyl": true, + "gulp-watch>vinyl-file": true } }, - "gulp-watch>anymatch": { + "gulp-zip": { "builtin": { - "path.sep": true + "buffer.constants.MAX_LENGTH": true, + "path.join": true }, "packages": { - "gulp-watch>anymatch>micromatch": true, - "gulp-watch>anymatch>normalize-path": true + "gulp-zip>get-stream": true, + "gulp-zip>plugin-error": true, + "gulp-zip>through2": true, + "vinyl": true, + "gulp-zip>yazl": true } }, - "gulp-watch>anymatch>micromatch": { - "builtin": { - "path.sep": true - }, - "globals": { - "process": true - }, + "prettier-eslint>loglevel-colored-level-prefix>chalk>has-ansi": { "packages": { - "gulp-watch>anymatch>micromatch>arr-diff": true, - "gulp-watch>anymatch>micromatch>array-unique": true, - "gulp-watch>anymatch>micromatch>braces": true, - "gulp-watch>anymatch>micromatch>expand-brackets": true, - "gulp-watch>anymatch>micromatch>extglob": true, - "gulp-watch>anymatch>micromatch>filename-regex": true, - "gulp-watch>anymatch>micromatch>is-extglob": true, - "gulp-watch>anymatch>micromatch>is-glob": true, - "gulp-watch>anymatch>micromatch>kind-of": true, - "gulp-watch>anymatch>micromatch>object.omit": true, - "gulp-watch>anymatch>micromatch>parse-glob": true, - "gulp-watch>anymatch>micromatch>regex-cache": true, - "gulp-watch>anymatch>normalize-path": true + "prettier-eslint>loglevel-colored-level-prefix>chalk>has-ansi>ansi-regex": true } }, - "gulp-watch>anymatch>micromatch>arr-diff": { - "packages": { - "gulp>undertaker>arr-flatten": true + "chalk>supports-color>has-flag": { + "globals": { + "process.argv": true } }, - "gulp-watch>anymatch>micromatch>braces": { - "packages": { - "gulp-watch>anymatch>micromatch>braces>expand-range": true, - "gulp-watch>anymatch>micromatch>braces>preserve": true, - "gulp-watch>anymatch>micromatch>braces>repeat-element": true + "gulp-livereload>chalk>supports-color>has-flag": { + "globals": { + "process.argv": true } }, - "gulp-watch>anymatch>micromatch>braces>expand-range": { - "packages": { - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range": true + "postcss-discard-font-face>postcss>supports-color>has-flag": { + "globals": { + "process.argv": true } }, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range": { + "string.prototype.matchall>es-abstract>has-property-descriptors": { "packages": { - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number": true, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>isobject": true, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic": true, - "gulp-watch>anymatch>micromatch>braces>repeat-element": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true + "string.prototype.matchall>call-bind>es-define-property": true } }, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number": { + "koa>is-generator-function>has-tostringtag": { "packages": { - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number>kind-of": true + "string.prototype.matchall>has-symbols": true } }, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number>kind-of": { - "packages": { - "browserify>insert-module-globals>is-buffer": true + "@storybook/react>@storybook/node-logger>npmlog>gauge>has-unicode": { + "builtin": { + "os.type": true + }, + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true } }, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>isobject": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value": { "packages": { - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>isobject>isarray": true + "gulp>gulp-cli>array-sort>get-value": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values": true, + "gulp>gulp-cli>isobject": true } }, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value": { "packages": { - "@babel/register>clone-deep>kind-of": true, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic>math-random": true, - "gulp>undertaker>bach>array-last>is-number": true - } - }, - "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic>math-random": { - "builtin": { - "crypto.randomBytes": true + "gulp>gulp-cli>array-sort>get-value": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>has-values": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>isobject": true } }, - "gulp-watch>anymatch>micromatch>expand-brackets": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values": { "packages": { - "gulp-watch>anymatch>micromatch>expand-brackets>is-posix-bracket": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>kind-of": true } }, - "gulp-watch>anymatch>micromatch>extglob": { + "browserify>has": { "packages": { - "gulp-watch>anymatch>micromatch>is-extglob": true + "browserify>has>function-bind": true } }, - "gulp-watch>anymatch>micromatch>is-glob": { + "depcheck>is-core-module>hasown": { "packages": { - "gulp-watch>anymatch>micromatch>is-extglob": true + "browserify>has>function-bind": true } }, - "gulp-watch>anymatch>micromatch>kind-of": { + "stylelint>postcss-html>htmlparser2": { + "builtin": { + "buffer.Buffer": true, + "events.EventEmitter": true, + "string_decoder.StringDecoder": true + }, "packages": { - "browserify>insert-module-globals>is-buffer": true + "stylelint>postcss-html>htmlparser2>domelementtype": true, + "stylelint>postcss-html>htmlparser2>domhandler": true, + "stylelint>postcss-html>htmlparser2>domutils": true, + "stylelint>postcss-html>htmlparser2>entities": true, + "pumpify>inherits": true, + "readable-stream": true } }, - "gulp-watch>anymatch>micromatch>object.omit": { - "packages": { - "gulp-watch>anymatch>micromatch>object.omit>for-own": true, - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + "webpack-dev-server>sockjs>websocket-driver>http-parser-js": { + "builtin": { + "assert.equal": true, + "assert.ok": true } }, - "gulp-watch>anymatch>micromatch>object.omit>for-own": { - "packages": { - "gulp>undertaker>object.reduce>for-own>for-in": true + "eslint>ignore": { + "globals": { + "process": true } }, - "gulp-watch>anymatch>micromatch>parse-glob": { - "packages": { - "gulp-watch>anymatch>micromatch>is-extglob": true, - "gulp-watch>anymatch>micromatch>parse-glob>glob-base": true, - "gulp-watch>anymatch>micromatch>parse-glob>is-dotfile": true, - "gulp-watch>anymatch>micromatch>parse-glob>is-glob": true + "sass-embedded>immutable": { + "globals": { + "console": true, + "define": true } }, - "gulp-watch>anymatch>micromatch>parse-glob>glob-base": { + "eslint>@eslint/eslintrc>import-fresh": { "builtin": { "path.dirname": true }, + "globals": { + "__dirname": true, + "__filename": true + }, "packages": { - "eslint>glob-parent": true, - "gulp-watch>anymatch>micromatch>parse-glob>glob-base>is-glob": true + "eslint>@eslint/eslintrc>import-fresh>parent-module": true, + "eslint>@eslint/eslintrc>import-fresh>resolve-from": true } }, - "gulp-watch>anymatch>micromatch>parse-glob>glob-base>is-glob": { + "nyc>glob>inflight": { + "globals": { + "process.nextTick": true + }, "packages": { - "gulp-watch>anymatch>micromatch>is-extglob": true + "@metamask/object-multiplex>once": true, + "@metamask/object-multiplex>once>wrappy": true } }, - "gulp-watch>anymatch>micromatch>parse-glob>is-glob": { - "packages": { - "gulp-watch>anymatch>micromatch>is-extglob": true + "pumpify>inherits": { + "builtin": { + "util.inherits": true } }, - "gulp-watch>anymatch>micromatch>regex-cache": { - "packages": { - "gulp-watch>anymatch>micromatch>regex-cache>is-equal-shallow": true + "ini": { + "globals": { + "process": true } }, - "gulp-watch>anymatch>micromatch>regex-cache>is-equal-shallow": { - "packages": { - "gulp-watch>anymatch>micromatch>regex-cache>is-equal-shallow>is-primitive": true + "stylelint>global-modules>global-prefix>ini": { + "globals": { + "process": true } }, - "gulp-watch>anymatch>normalize-path": { + "@lavamoat/lavapack>combine-source-map>inline-source-map": { + "globals": { + "Buffer.from": true + }, "packages": { - "vinyl>remove-trailing-separator": true + "@lavamoat/lavapack>combine-source-map>inline-source-map>source-map": true } }, - "gulp-watch>chokidar": { + "browserify>insert-module-globals": { "builtin": { - "events.EventEmitter": true, - "fs": true, - "path.basename": true, "path.dirname": true, - "path.extname": true, - "path.join": true, + "path.isAbsolute": true, "path.relative": true, - "path.resolve": true, "path.sep": true }, "globals": { - "clearTimeout": true, - "console.error": true, - "process.env.CHOKIDAR_INTERVAL": true, - "process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR": true, - "process.env.CHOKIDAR_USEPOLLING": true, - "process.nextTick": true, - "process.platform": true, - "setTimeout": true + "Buffer.concat": true, + "Buffer.isBuffer": true }, "packages": { - "chokidar>normalize-path": true, - "eslint>is-glob": true, - "gulp-watch>chokidar>anymatch": true, - "gulp-watch>chokidar>async-each": true, - "gulp-watch>chokidar>braces": true, - "gulp-watch>chokidar>fsevents": true, - "gulp-watch>chokidar>is-binary-path": true, - "gulp-watch>chokidar>readdirp": true, - "gulp-watch>chokidar>upath": true, - "gulp-watch>glob-parent": true, + "browserify>syntax-error>acorn-node": true, + "@lavamoat/lavapack>combine-source-map": true, "gulp-watch>path-is-absolute": true, - "pumpify>inherits": true + "browserify>insert-module-globals>through2": true, + "browserify>insert-module-globals>undeclared-identifiers": true, + "watchify>xtend": true } }, - "gulp-watch>chokidar>fsevents": { - "builtin": { - "events.EventEmitter": true, - "fs.stat": true, - "path.join": true, - "util.inherits": true - }, - "globals": { - "__dirname": true, - "console.assert": true, - "process.nextTick": true, - "process.platform": true, - "setImmediate": true - }, + "string.prototype.matchall>internal-slot": { "packages": { - "gulp-watch>chokidar>fsevents>node-pre-gyp": true + "string.prototype.matchall>call-bind>es-errors": true, + "depcheck>is-core-module>hasown": true, + "string.prototype.matchall>side-channel": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp": { - "builtin": { - "events.EventEmitter": true, - "fs.existsSync": true, - "fs.readFileSync": true, - "fs.renameSync": true, - "path.dirname": true, - "path.existsSync": true, - "path.join": true, - "path.resolve": true, - "url.parse": true, - "url.resolve": true, - "util.inherits": true - }, - "globals": { - "__dirname": true, - "console.log": true, - "process.arch": true, - "process.cwd": true, - "process.env": true, - "process.platform": true, - "process.version.substr": true, - "process.versions": true - }, + "gulp>gulp-cli>replace-homedir>is-absolute": { "packages": { - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": true + "gulp>gulp-cli>replace-homedir>is-absolute>is-relative": true, + "nyc>spawn-wrap>is-windows": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": { - "builtin": { - "child_process.spawnSync": true, - "fs.readdirSync": true, - "os.platform": true - }, - "globals": { - "process.env": true + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": { + "packages": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor>kind-of": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": { - "builtin": { - "path": true, - "stream.Stream": true, - "url": true - }, - "globals": { - "console": true, - "process.argv": true, - "process.env.DEBUG_NOPT": true, - "process.env.NOPT_DEBUG": true, - "process.platform": true - }, + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-accessor-descriptor": { "packages": { - "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>nopt>abbrev": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": true + "@babel/register>clone-deep>kind-of": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": { - "builtin": { - "child_process.exec": true, - "path": true - }, - "globals": { - "process.env.COMPUTERNAME": true, - "process.env.ComSpec": true, - "process.env.EDITOR": true, - "process.env.HOSTNAME": true, - "process.env.PATH": true, - "process.env.PROMPT": true, - "process.env.PS1": true, - "process.env.Path": true, - "process.env.SHELL": true, - "process.env.USER": true, - "process.env.USERDOMAIN": true, - "process.env.USERNAME": true, - "process.env.VISUAL": true, - "process.env.path": true, - "process.nextTick": true, - "process.platform": true - }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-accessor-descriptor": { "packages": { - "@storybook/core>@storybook/core-server>x-default-browser>default-browser-id>untildify>os-homedir": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor>kind-of": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { - "globals": { - "process.env.SystemRoot": true, - "process.env.TEMP": true, - "process.env.TMP": true, - "process.env.TMPDIR": true, - "process.env.windir": true, - "process.platform": true + "react-syntax-highlighter>refractor>parse-entities>is-alphanumerical": { + "packages": { + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-alphabetical": true, + "react-syntax-highlighter>refractor>parse-entities>is-decimal": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": { + "chokidar>is-binary-path": { "builtin": { - "assert": true, - "fs": true, - "path.join": true - }, - "globals": { - "process.platform": true, - "setTimeout": true + "path.extname": true }, "packages": { - "nyc>glob": true + "chokidar>is-binary-path>binary-extensions": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": { + "string.prototype.matchall>es-abstract>is-callable": { "globals": { - "console": true, - "process": true + "document": true } }, - "gulp-watch>fancy-log": { + "depcheck>is-core-module": { "globals": { - "console": true, - "process.argv.indexOf": true, - "process.stderr.write": true, - "process.stdout.write": true + "process.versions": true }, "packages": { - "fancy-log>ansi-gray": true, - "fancy-log>color-support": true, - "fancy-log>time-stamp": true + "depcheck>is-core-module>hasown": true } }, - "gulp-watch>path-is-absolute": { - "globals": { - "process.platform": true + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": { + "packages": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor>kind-of": true } }, - "gulp-watch>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-data-descriptor": { "packages": { - "gulp-watch>readable-stream>isarray": true, - "gulp-watch>readable-stream>safe-buffer": true, - "gulp-watch>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "@babel/register>clone-deep>kind-of": true } }, - "gulp-watch>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor>kind-of": true } }, - "gulp-watch>readable-stream>string_decoder": { + "@metamask/eth-token-tracker>deep-equal>is-date-object": { "packages": { - "gulp-watch>readable-stream>safe-buffer": true + "koa>is-generator-function>has-tostringtag": true } }, - "gulp-watch>vinyl-file": { - "builtin": { - "path.resolve": true - }, - "globals": { - "process.cwd": true - }, + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor": { "packages": { - "del>graceful-fs": true, - "gh-pages>globby>pinkie-promise": true, - "gulp-watch>vinyl-file>pify": true, - "gulp-watch>vinyl-file>strip-bom": true, - "gulp-watch>vinyl-file>strip-bom-stream": true, - "gulp-watch>vinyl-file>vinyl": true + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": true, + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>kind-of": true } }, - "gulp-watch>vinyl-file>strip-bom": { - "globals": { - "Buffer.isBuffer": true - }, + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": { "packages": { - "gulp>vinyl-fs>remove-bom-buffer>is-utf8": true + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-accessor-descriptor": true, + "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-data-descriptor": true, + "@babel/register>clone-deep>kind-of": true } }, - "gulp-watch>vinyl-file>strip-bom-stream": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor": { "packages": { - "gulp-watch>vinyl-file>strip-bom": true, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-accessor-descriptor": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>kind-of": true } }, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": { - "builtin": { - "util.inherits": true - }, - "globals": { - "Buffer.concat": true, - "setImmediate": true - }, + "gulp-watch>anymatch>micromatch>regex-cache>is-equal-shallow": { "packages": { - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream": true + "gulp-watch>anymatch>micromatch>regex-cache>is-equal-shallow>is-primitive": true } }, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, + "gulp-zip>plugin-error>extend-shallow>is-extendable": { "packages": { - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>isarray": true, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>safe-buffer": true, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "@babel/register>clone-deep>is-plain-object": true } }, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep>is-extendable": { + "packages": { + "@babel/register>clone-deep>is-plain-object": true } }, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>string_decoder": { + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": { "packages": { - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>safe-buffer": true + "gulp>gulp-cli>yargs>string-width>is-fullwidth-code-point>number-is-nan": true } }, - "gulp-watch>vinyl-file>vinyl": { - "builtin": { - "buffer.Buffer": true, - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true, - "path.relative": true, - "stream.PassThrough": true, - "stream.Stream": true - }, - "globals": { - "process.cwd": true - }, + "del>is-glob": { "packages": { - "@metamask/jazzicon>color>clone": true, - "gulp-watch>vinyl-file>vinyl>clone-stats": true, - "gulp-watch>vinyl-file>vinyl>replace-ext": true + "del>is-glob>is-extglob": true } }, - "gulp-watch>vinyl-file>vinyl>clone-stats": { - "builtin": { - "fs.Stats": true + "gulp-watch>anymatch>micromatch>parse-glob>glob-base>is-glob": { + "packages": { + "gulp-watch>anymatch>micromatch>is-extglob": true } }, - "gulp-watch>vinyl-file>vinyl>replace-ext": { - "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true - } - }, - "gulp-zip": { - "builtin": { - "buffer.constants.MAX_LENGTH": true, - "path.join": true - }, + "gulp-watch>anymatch>micromatch>is-glob": { "packages": { - "gulp-zip>get-stream": true, - "gulp-zip>plugin-error": true, - "gulp-zip>through2": true, - "gulp-zip>yazl": true, - "vinyl": true + "gulp-watch>anymatch>micromatch>is-extglob": true } }, - "gulp-zip>get-stream": { - "builtin": { - "buffer.constants.MAX_LENGTH": true, - "stream.PassThrough": true - }, - "globals": { - "Buffer.concat": true - }, + "gulp-watch>anymatch>micromatch>parse-glob>is-glob": { "packages": { - "pumpify>pump": true + "gulp-watch>anymatch>micromatch>is-extglob": true } }, - "gulp-zip>plugin-error": { - "builtin": { - "util.inherits": true - }, + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number": { "packages": { - "gulp-watch>ansi-colors": true, - "gulp-zip>plugin-error>arr-diff": true, - "gulp-zip>plugin-error>arr-union": true, - "gulp-zip>plugin-error>extend-shallow": true + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number>kind-of": true } }, - "gulp-zip>plugin-error>extend-shallow": { + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number": { "packages": { - "gulp-zip>plugin-error>extend-shallow>assign-symbols": true, - "gulp-zip>plugin-error>extend-shallow>is-extendable": true + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number>kind-of": true } }, - "gulp-zip>plugin-error>extend-shallow>is-extendable": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number": { "packages": { - "@babel/register>clone-deep>is-plain-object": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number>kind-of": true } }, - "gulp-zip>through2": { + "del>is-path-cwd": { "builtin": { - "util.inherits": true + "path.resolve": true }, "globals": { - "process.nextTick": true - }, - "packages": { - "readable-stream": true + "process.cwd": true, + "process.platform": true } }, - "gulp-zip>yazl": { + "del>is-path-inside": { "builtin": { - "events.EventEmitter": true, - "fs.createReadStream": true, - "fs.stat": true, - "stream.PassThrough": true, - "stream.Transform": true, - "util.inherits": true, - "zlib.DeflateRaw": true, - "zlib.deflateRaw": true - }, - "globals": { - "Buffer": true, - "setImmediate": true, - "utf8FileName.length": true - }, - "packages": { - "gulp-zip>yazl>buffer-crc32": true + "path.relative": true, + "path.resolve": true, + "path.sep": true } }, - "gulp-zip>yazl>buffer-crc32": { - "builtin": { - "buffer.Buffer": true + "@babel/register>clone-deep>is-plain-object": { + "packages": { + "gulp>gulp-cli>isobject": true } }, - "gulp>glob-watcher": { + "string.prototype.matchall>es-abstract>is-regex": { "packages": { - "chokidar": true, - "gulp>glob-watcher>anymatch": true, - "gulp>glob-watcher>async-done": true, - "gulp>glob-watcher>is-negated-glob": true, - "gulp>glob-watcher>just-debounce": true, - "gulp>undertaker>object.defaults": true + "string.prototype.matchall>call-bind": true, + "koa>is-generator-function>has-tostringtag": true } }, - "gulp>glob-watcher>anymatch": { - "builtin": { - "path.sep": true - }, + "gulp>gulp-cli>replace-homedir>is-absolute>is-relative": { "packages": { - "gulp-watch>anymatch>normalize-path": true, - "gulp>glob-watcher>anymatch>micromatch": true + "gulp>gulp-cli>replace-homedir>is-absolute>is-relative>is-unc-path": true } }, - "gulp>glob-watcher>anymatch>micromatch": { - "builtin": { - "path.basename": true, - "path.sep": true, - "util.inspect": true - }, - "globals": { - "process.platform": true - }, + "eslint-plugin-react>array-includes>is-string": { "packages": { - "@babel/register>clone-deep>kind-of": true, - "gulp-zip>plugin-error>arr-diff": true, - "gulp-zip>plugin-error>extend-shallow": true, - "gulp>glob-watcher>anymatch>micromatch>braces": true, - "gulp>glob-watcher>anymatch>micromatch>define-property": true, - "gulp>glob-watcher>anymatch>micromatch>extglob": true, - "gulp>gulp-cli>liftoff>fined>object.pick": true, - "gulp>gulp-cli>matchdep>micromatch>array-unique": true, - "gulp>gulp-cli>matchdep>micromatch>fragment-cache": true, - "gulp>gulp-cli>matchdep>micromatch>nanomatch": true, - "gulp>gulp-cli>matchdep>micromatch>regex-not": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex": true + "koa>is-generator-function>has-tostringtag": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces": { + "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { "packages": { - "gulp-watch>anymatch>micromatch>braces>repeat-element": true, - "gulp>glob-watcher>anymatch>micromatch>braces>extend-shallow": true, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range": true, - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>array-unique": true, - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node": true, - "gulp>gulp-cli>matchdep>micromatch>braces>split-string": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex": true, - "gulp>undertaker>arr-flatten": true + "string.prototype.matchall>has-symbols": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces>extend-shallow": { + "gulp>gulp-cli>replace-homedir>is-absolute>is-relative>is-unc-path": { "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + "gulp>gulp-cli>replace-homedir>is-absolute>is-relative>is-unc-path>unc-path-regex": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range": { + "mocha>log-symbols>is-unicode-supported": { + "globals": { + "process.env.CI": true, + "process.env.TERM": true, + "process.env.TERM_PROGRAM": true, + "process.env.WT_SESSION": true, + "process.platform": true + } + }, + "nyc>spawn-wrap>is-windows": { + "globals": { + "define": true, + "isWindows": "write", + "process": true + } + }, + "@sentry/cli>which>isexe": { "builtin": { - "util.inspect": true + "fs": true }, - "packages": { - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>extend-shallow": true, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number": true, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>to-regex-range": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true + "globals": { + "TESTING_WINDOWS": true, + "process.env.PATHEXT": true, + "process.getgid": true, + "process.getuid": true, + "process.platform": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>extend-shallow": { + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>isobject": { "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>isobject>isarray": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>isobject": { "packages": { - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number>kind-of": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>isobject>isarray": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number>kind-of": { - "packages": { - "browserify>insert-module-globals>is-buffer": true + "postcss-discard-font-face>postcss>js-base64": { + "globals": { + "Base64": "write", + "define": true } }, - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>to-regex-range": { - "packages": { - "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true + "eslint-plugin-jsdoc>@es-joy/jsdoccomment>jsdoc-type-pratt-parser": { + "globals": { + "define": true } }, - "gulp>glob-watcher>anymatch>micromatch>define-property": { - "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + "@babel/core>@babel/generator>jsesc": { + "globals": { + "Buffer": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob": { - "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>define-property": true, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets": true, - "gulp>glob-watcher>anymatch>micromatch>extglob>extend-shallow": true, - "gulp>gulp-cli>matchdep>micromatch>array-unique": true, - "gulp>gulp-cli>matchdep>micromatch>fragment-cache": true, - "gulp>gulp-cli>matchdep>micromatch>regex-not": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex": true + "webpack>json-parse-even-better-errors": { + "globals": { + "Buffer.isBuffer": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>define-property": { + "@lavamoat/lavapack>json-stable-stringify": { "packages": { - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + "string.prototype.matchall>call-bind": true, + "@lavamoat/lavapack>json-stable-stringify>isarray": true, + "@lavamoat/lavapack>json-stable-stringify>jsonify": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets": { + "depcheck>json5": { "globals": { - "__filename": true - }, - "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>debug": true, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property": true, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>extend-shallow": true, - "gulp>gulp-cli>matchdep>micromatch>extglob>expand-brackets>posix-character-classes": true, - "gulp>gulp-cli>matchdep>micromatch>regex-not": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex": true + "console.warn": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>debug": { + "eslint-plugin-import>tsconfig-paths>json5": { + "globals": { + "console.warn": true + } + }, + "fs-extra>jsonfile": { "builtin": { - "fs.SyncWriteStream": true, - "net.Socket": true, - "tty.WriteStream": true, - "tty.isatty": true, - "util": true + "fs": true }, "globals": { - "chrome": true, - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "Buffer.isBuffer": true }, "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>debug>ms": true + "del>graceful-fs": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property": { - "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor": true + "browserify>JSONStream>jsonparse": { + "globals": { + "Buffer": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor": { + "eslint-plugin-react>jsx-ast-utils": { + "globals": { + "console.error": true + }, "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": true, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": true, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>kind-of": true + "gulp>vinyl-fs>object.assign": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": { - "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor>kind-of": true + "gulp>glob-watcher>just-debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor>kind-of": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>kind-of": { "packages": { "browserify>insert-module-globals>is-buffer": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": { + "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor>kind-of": { "packages": { - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor>kind-of": true + "browserify>insert-module-globals>is-buffer": true } }, "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor>kind-of": { @@ -4882,85 +4228,47 @@ "browserify>insert-module-globals>is-buffer": true } }, - "gulp>glob-watcher>anymatch>micromatch>extglob>expand-brackets>extend-shallow": { - "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true - } - }, - "gulp>glob-watcher>anymatch>micromatch>extglob>extend-shallow": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor>kind-of": { "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>glob-watcher>async-done": { - "globals": { - "process.nextTick": true - }, + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number>kind-of": { "packages": { - "@metamask/object-multiplex>once": true, - "duplexify>end-of-stream": true, - "gulp>glob-watcher>async-done>stream-exhaust": true, - "readable-stream-2>process-nextick-args": true - } - }, - "gulp>glob-watcher>async-done>stream-exhaust": { - "builtin": { - "stream.Writable": true, - "util.inherits": true - }, - "globals": { - "setImmediate": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>glob-watcher>chokidar": { + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>is-number>kind-of": { "packages": { - "gulp>glob-watcher>chokidar>fsevents": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>glob-watcher>chokidar>fsevents": { - "builtin": { - "events.EventEmitter": true, - "fs.stat": true, - "path.join": true, - "util.inherits": true - }, - "globals": { - "__dirname": true, - "console.assert": true, - "process.nextTick": true, - "process.platform": true, - "setImmediate": true - }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number>kind-of": { "packages": { - "gulp-watch>chokidar>fsevents>node-pre-gyp": true - } - }, - "gulp>glob-watcher>just-debounce": { - "globals": { - "clearTimeout": true, - "setTimeout": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>gulp-cli>liftoff>fined>object.pick": { + "lavamoat>lavamoat-core>merge-deep>kind-of": { "packages": { - "gulp>gulp-cli>isobject": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node": { + "gulp-watch>anymatch>micromatch>kind-of": { "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>define-property": true, - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>define-property": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy>kind-of": { "packages": { - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util": { + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>kind-of": { + "globals": { + "Buffer": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util>kind-of": true + "browserify>insert-module-globals>is-buffer": true } }, "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util>kind-of": { @@ -4968,1828 +4276,1234 @@ "browserify>insert-module-globals>is-buffer": true } }, - "gulp>gulp-cli>matchdep>micromatch>braces>split-string": { - "packages": { - "gulp-zip>plugin-error>extend-shallow": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path>kind-of": { "packages": { - "@babel/register>clone-deep>kind-of": true, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-accessor-descriptor": true, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-data-descriptor": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-accessor-descriptor": { + "labeled-stream-splicer": { "packages": { - "@babel/register>clone-deep>kind-of": true + "pumpify>inherits": true, + "labeled-stream-splicer>stream-splicer": true } }, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor>is-data-descriptor": { + "gulp>undertaker>last-run": { + "builtin": { + "assert": true + }, "packages": { - "@babel/register>clone-deep>kind-of": true + "gulp>undertaker>last-run>default-resolution": true, + "gulp>undertaker>es6-weak-map": true } }, - "gulp>gulp-cli>matchdep>micromatch>fragment-cache": { + "lavamoat-browserify": { + "builtin": { + "node:fs.existsSync": true, + "node:fs.mkdirSync": true, + "node:fs.readFileSync": true, + "node:fs.writeFileSync": true, + "node:path.dirname": true, + "node:path.extname": true, + "node:path.resolve": true, + "node:util.callbackify": true + }, + "globals": { + "console.warn": true, + "process.cwd": true, + "setTimeout": true + }, "packages": { - "gulp>gulp-cli>liftoff>fined>parse-filepath>map-cache": true + "lavamoat>@lavamoat/aa": true, + "@lavamoat/lavapack": true, + "browserify>browser-resolve": true, + "lavamoat-browserify>concat-stream": true, + "duplexify": true, + "lavamoat>lavamoat-core": true, + "lavamoat-browserify>readable-stream": true, + "through2": true } }, - "gulp>gulp-cli>matchdep>micromatch>nanomatch": { + "lavamoat>lavamoat-core": { "builtin": { - "path.basename": true, - "path.sep": true, - "util.inspect": true + "node:events": true, + "node:fs.readFileSync": true, + "node:fs/promises.writeFile": true, + "node:path.extname": true, + "node:path.join": true + }, + "globals": { + "__dirname": true, + "console.error": true, + "console.warn": true, + "define": true }, "packages": { - "@babel/register>clone-deep>kind-of": true, - "gulp-zip>plugin-error>arr-diff": true, - "gulp-zip>plugin-error>extend-shallow": true, - "gulp>gulp-cli>liftoff>fined>object.pick": true, - "gulp>gulp-cli>matchdep>micromatch>array-unique": true, - "gulp>gulp-cli>matchdep>micromatch>fragment-cache": true, - "gulp>gulp-cli>matchdep>micromatch>nanomatch>define-property": true, - "gulp>gulp-cli>matchdep>micromatch>regex-not": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex": true, - "nyc>spawn-wrap>is-windows": true + "@lavamoat/lavapack>json-stable-stringify": true, + "lavamoat>lavamoat-tofu": true, + "lavamoat>lavamoat-core>merge-deep": true } }, - "gulp>gulp-cli>matchdep>micromatch>nanomatch>define-property": { + "lavamoat>lavamoat-tofu": { + "globals": { + "console.log": true + }, "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + "@babel/core>@babel/parser": true, + "depcheck>@babel/traverse": true } }, - "gulp>gulp-cli>matchdep>micromatch>regex-not": { - "packages": { - "gulp-zip>plugin-error>extend-shallow": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex": true + "lavamoat>lavamoat-core>merge-deep>clone-deep>lazy-cache": { + "globals": { + "process.env.TRAVIS": true, + "process.env.UNLAZY": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon": { - "builtin": { - "fs.readFileSync": true, - "path.dirname": true, - "util.inspect": true - }, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>lazy-cache": { "globals": { - "__filename": true - }, - "packages": { - "gulp>gulp-cli>liftoff>fined>parse-filepath>map-cache": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>debug": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>extend-shallow": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>source-map": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>use": true, - "resolve-url-loader>rework>css>source-map-resolve": true + "process.env.UNLAZY": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base": { + "gulp>vinyl-fs>lazystream": { "builtin": { "util.inherits": true }, "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>component-emitter": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>define-property": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>pascalcase": true + "gulp>vinyl-fs>lazystream>readable-stream": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base": { + "gulp>vinyl-fs>lead": { + "globals": { + "process.nextTick": true + }, "packages": { - "gulp>gulp-cli>array-sort>get-value": true, - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>union-value": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>component-emitter": true + "gulp>vinyl-fs>lead>flush-write-stream": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit": { + "eslint>levn": { "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>map-visit": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>object-visit": true + "eslint>levn>prelude-ls": true, + "eslint>levn>type-check": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>map-visit": { + "gulp-postcss>postcss-load-config>lilconfig": { "builtin": { - "util.inspect": true + "fs.accessSync": true, + "fs.promises.access": true, + "fs.promises.readFile": true, + "fs.readFileSync": true, + "os.homedir": true, + "path.extname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true, + "path.sep": true }, - "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>object-visit": true + "globals": { + "process.cwd": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>object-visit": { + "eslint-plugin-import>eslint-module-utils>find-up>locate-path": { + "builtin": { + "path.resolve": true + }, + "globals": { + "process.cwd": true + }, "packages": { - "gulp>gulp-cli>isobject": true + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate": true, + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>path-exists": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value": { - "packages": { - "gulp>gulp-cli>array-sort>get-value": true, - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values": { - "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>kind-of": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number": { - "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number>kind-of": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>is-number>kind-of": { - "packages": { - "browserify>insert-module-globals>is-buffer": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>has-value>has-values>kind-of": { - "packages": { - "browserify>insert-module-globals>is-buffer": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value": { + "mocha>find-up>locate-path": { + "builtin": { + "fs.lstat": true, + "fs.lstatSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.resolve": true, + "util.promisify": true + }, + "globals": { + "process.cwd": true + }, "packages": { - "@babel/register>clone-deep>is-plain-object": true, - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, - "gulp>gulp-cli>matchdep>micromatch>braces>split-string": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value>extend-shallow": true + "mocha>find-up>locate-path>p-locate": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value>extend-shallow": { - "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true + "lodash": { + "globals": { + "define": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path": { - "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path>kind-of": true + "@babel/preset-env>babel-plugin-polyfill-corejs2>@babel/helper-define-polyfill-provider>lodash.debounce": { + "globals": { + "clearTimeout": true, + "setTimeout": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path>kind-of": { + "mocha>log-symbols": { "packages": { - "browserify>insert-module-globals>is-buffer": true + "chalk": true, + "mocha>log-symbols>is-unicode-supported": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>union-value": { + "loose-envify": { + "builtin": { + "stream.PassThrough": true, + "stream.Transform": true, + "util.inherits": true + }, + "globals": { + "process.env": true + }, "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, - "gulp-zip>plugin-error>arr-union": true, - "gulp>gulp-cli>array-sort>get-value": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value": true + "loose-envify>js-tokens": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value": { + "@babel/core>@babel/helper-compilation-targets>lru-cache": { "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value": true + "@babel/core>@babel/helper-compilation-targets>lru-cache>yallist": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value": { + "gulp-sourcemaps>debug-fabulous>memoizee>lru-queue": { "packages": { - "gulp>gulp-cli>array-sort>get-value": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>has-values": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>isobject": true + "resolve-url-loader>es6-iterator>es5-ext": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>isobject": { + "gulp>undertaker>arr-map>make-iterator": { "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value>isobject>isarray": true + "@babel/register>clone-deep>kind-of": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils": { + "gulp-livereload>event-stream>map-stream": { "builtin": { - "util": true + "stream.Stream": true }, - "packages": { - "gulp-zip>plugin-error>arr-union": true, - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true + "globals": { + "process.nextTick": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>map-visit": { "builtin": { - "util.inherits": true + "util.inspect": true }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>object-visit": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy": { + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>markdown-table": { "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy>copy-descriptor": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy>kind-of": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy>kind-of": { - "packages": { - "browserify>insert-module-globals>is-buffer": true + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic>math-random": { + "builtin": { + "crypto.randomBytes": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>define-property": { + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>mdast-util-compact": { "packages": { - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + "react-markdown>unist-util-visit": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep": { + "gulp-sourcemaps>debug-fabulous>memoizee": { + "globals": { + "clearTimeout": true, + "setTimeout": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep>is-extendable": true, - "gulp>undertaker>object.reduce>for-own>for-in": true + "resolve-url-loader>es6-iterator>d": true, + "resolve-url-loader>es6-iterator>es5-ext": true, + "gulp-sourcemaps>debug-fabulous>memoizee>event-emitter": true, + "gulp-sourcemaps>debug-fabulous>memoizee>is-promise": true, + "gulp-sourcemaps>debug-fabulous>memoizee>lru-queue": true, + "gulp-sourcemaps>debug-fabulous>memoizee>next-tick": true, + "gulp-sourcemaps>debug-fabulous>memoizee>timers-ext": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep>is-extendable": { + "lavamoat>lavamoat-core>merge-deep": { "packages": { - "@babel/register>clone-deep>is-plain-object": true + "gulp-zip>plugin-error>arr-union": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep": true, + "lavamoat>lavamoat-core>merge-deep>kind-of": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>debug": { + "globby>merge2": { "builtin": { - "fs.SyncWriteStream": true, - "net.Socket": true, - "tty.WriteStream": true, - "tty.isatty": true, - "util": true + "stream.PassThrough": true }, "globals": { - "chrome": true, - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, - "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>debug>ms": true + "process.nextTick": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": { + "gulp>glob-watcher>anymatch>micromatch": { + "builtin": { + "path.basename": true, + "path.sep": true, + "util.inspect": true + }, + "globals": { + "process.platform": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor": true + "gulp-zip>plugin-error>arr-diff": true, + "gulp>gulp-cli>matchdep>micromatch>array-unique": true, + "gulp>glob-watcher>anymatch>micromatch>braces": true, + "gulp>glob-watcher>anymatch>micromatch>define-property": true, + "gulp-zip>plugin-error>extend-shallow": true, + "gulp>glob-watcher>anymatch>micromatch>extglob": true, + "gulp>gulp-cli>matchdep>micromatch>fragment-cache": true, + "@babel/register>clone-deep>kind-of": true, + "gulp>gulp-cli>matchdep>micromatch>nanomatch": true, + "gulp>gulp-cli>liftoff>fined>object.pick": true, + "gulp>gulp-cli>matchdep>micromatch>regex-not": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor": { + "gulp-watch>anymatch>micromatch": { + "builtin": { + "path.sep": true + }, + "globals": { + "process": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-accessor-descriptor": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor": true, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>kind-of": true + "gulp-watch>anymatch>micromatch>arr-diff": true, + "gulp-watch>anymatch>micromatch>array-unique": true, + "gulp-watch>anymatch>micromatch>braces": true, + "gulp-watch>anymatch>micromatch>expand-brackets": true, + "gulp-watch>anymatch>micromatch>extglob": true, + "gulp-watch>anymatch>micromatch>filename-regex": true, + "gulp-watch>anymatch>micromatch>is-extglob": true, + "gulp-watch>anymatch>micromatch>is-glob": true, + "gulp-watch>anymatch>micromatch>kind-of": true, + "gulp-watch>anymatch>normalize-path": true, + "gulp-watch>anymatch>micromatch>object.omit": true, + "gulp-watch>anymatch>micromatch>parse-glob": true, + "gulp-watch>anymatch>micromatch>regex-cache": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-accessor-descriptor": { + "fast-glob>micromatch": { + "builtin": { + "util.inspect": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor>kind-of": true + "chokidar>braces": true, + "chokidar>anymatch>picomatch": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor": { + "eslint>minimatch": { + "builtin": { + "path": true + }, + "globals": { + "console": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor>kind-of": true + "eslint>minimatch>brace-expansion": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property>is-descriptor>is-data-descriptor>kind-of": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep": { "packages": { - "browserify>insert-module-globals>is-buffer": true + "gulp>undertaker>object.reduce>for-own>for-in": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>mixin-deep>is-extendable": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>extend-shallow": { + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object": { "packages": { + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object>for-in": true, "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true } }, - "gulp>gulp-cli>matchdep>micromatch>snapdragon>use": { - "packages": { - "@babel/register>clone-deep>kind-of": true + "mockttp>portfinder>mkdirp": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true } }, - "gulp>gulp-cli>matchdep>micromatch>to-regex": { + "browserify>module-deps": { + "builtin": { + "fs.createReadStream": true, + "fs.readFile": true, + "path.delimiter": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, + "globals": { + "process.cwd": true, + "process.env.NODE_PATH": true, + "process.nextTick": true, + "process.platform": true, + "setTimeout": true, + "tr": true + }, "packages": { - "gulp-zip>plugin-error>extend-shallow": true, - "gulp>gulp-cli>matchdep>micromatch>regex-not": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex>define-property": true, - "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex": true - } - }, - "gulp>gulp-cli>matchdep>micromatch>to-regex>define-property": { - "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>gulp-cli>matchdep>micromatch>define-property>is-descriptor": true + "browserify>browser-resolve": true, + "browserify>cached-path-relative": true, + "browserify>concat-stream": true, + "watchify>defined": true, + "browserify>module-deps>detective": true, + "browserify>duplexer2": true, + "pumpify>inherits": true, + "loose-envify": true, + "browserify>parents": true, + "browserify>module-deps>readable-stream": true, + "depcheck>resolve": true, + "browserify>module-deps>stream-combiner2": true, + "browserify>module-deps>through2": true, + "watchify>xtend": true } }, - "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex": { + "gulp>gulp-cli>matchdep>micromatch>nanomatch": { + "builtin": { + "path.basename": true, + "path.sep": true, + "util.inspect": true + }, "packages": { - "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex>ret": true + "gulp-zip>plugin-error>arr-diff": true, + "gulp>gulp-cli>matchdep>micromatch>array-unique": true, + "gulp>gulp-cli>matchdep>micromatch>nanomatch>define-property": true, + "gulp-zip>plugin-error>extend-shallow": true, + "gulp>gulp-cli>matchdep>micromatch>fragment-cache": true, + "nyc>spawn-wrap>is-windows": true, + "@babel/register>clone-deep>kind-of": true, + "gulp>gulp-cli>liftoff>fined>object.pick": true, + "gulp>gulp-cli>matchdep>micromatch>regex-not": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex": true } }, - "gulp>gulp-cli>replace-homedir>is-absolute": { - "packages": { - "gulp>gulp-cli>replace-homedir>is-absolute>is-relative": true, - "nyc>spawn-wrap>is-windows": true + "gulp-sourcemaps>debug-fabulous>memoizee>next-tick": { + "globals": { + "MutationObserver": true, + "WebKitMutationObserver": true, + "document": true, + "process": true, + "queueMicrotask": true, + "setImmediate": true, + "setTimeout": true } }, - "gulp>gulp-cli>replace-homedir>is-absolute>is-relative": { + "gulp-watch>chokidar>fsevents>node-pre-gyp": { + "builtin": { + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, + "path.dirname": true, + "path.existsSync": true, + "path.join": true, + "path.resolve": true, + "url.parse": true, + "url.resolve": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true + }, "packages": { - "gulp>gulp-cli>replace-homedir>is-absolute>is-relative>is-unc-path": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": true, + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": true } }, - "gulp>gulp-cli>replace-homedir>is-absolute>is-relative>is-unc-path": { - "packages": { - "gulp>gulp-cli>replace-homedir>is-absolute>is-relative>is-unc-path>unc-path-regex": true - } + "node-sass": { + "native": true }, - "gulp>undertaker": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": { "builtin": { - "assert": true, - "events.EventEmitter": true, - "util.inherits": true + "path": true, + "stream.Stream": true, + "url": true }, "globals": { - "process.env.UNDERTAKER_SETTLE": true, - "process.env.UNDERTAKER_TIME_RESOLUTION": true, - "process.hrtime": true + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true }, "packages": { - "gulp>undertaker>arr-flatten": true, - "gulp>undertaker>arr-map": true, - "gulp>undertaker>bach": true, - "gulp>undertaker>collection-map": true, - "gulp>undertaker>es6-weak-map": true, - "gulp>undertaker>last-run": true, - "gulp>undertaker>object.defaults": true, - "gulp>undertaker>object.reduce": true, - "gulp>undertaker>undertaker-registry": true + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>nopt>abbrev": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": true } }, - "gulp>undertaker>arr-map": { + "gulp-watch>anymatch>normalize-path": { "packages": { - "gulp>undertaker>arr-map>make-iterator": true + "vinyl>remove-trailing-separator": true } }, - "gulp>undertaker>arr-map>make-iterator": { + "stylelint>normalize-selector": { + "globals": { + "define": true + } + }, + "gulp>vinyl-fs>vinyl-sourcemap>now-and-later": { "packages": { - "@babel/register>clone-deep>kind-of": true + "@metamask/object-multiplex>once": true } }, - "gulp>undertaker>bach": { + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog": { "builtin": { - "assert.ok": true + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true }, "packages": { - "gulp>glob-watcher>async-done": true, - "gulp>undertaker>arr-flatten": true, - "gulp>undertaker>arr-map": true, - "gulp>undertaker>bach>arr-filter": true, - "gulp>undertaker>bach>array-each": true, - "gulp>undertaker>bach>array-initial": true, - "gulp>undertaker>bach>array-last": true, - "gulp>undertaker>bach>async-settle": true, - "gulp>vinyl-fs>vinyl-sourcemap>now-and-later": true + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>are-we-there-yet": true, + "@storybook/react>@storybook/node-logger>npmlog>console-control-strings": true, + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge": true, + "nyc>yargs>set-blocking": true } }, - "gulp>undertaker>bach>arr-filter": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy": { "packages": { - "gulp>undertaker>arr-map>make-iterator": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy>copy-descriptor": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy>kind-of": true } }, - "gulp>undertaker>bach>array-initial": { + "string.prototype.matchall>es-abstract>object-inspect": { + "builtin": { + "util.inspect": true + }, + "globals": { + "HTMLElement": true, + "WeakRef": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>collection-visit>object-visit": { "packages": { - "gulp>undertaker>bach>array-last>is-number": true, - "gulp>undertaker>object.defaults>array-slice": true + "gulp>gulp-cli>isobject": true } }, - "gulp>undertaker>bach>array-last": { + "gulp>vinyl-fs>object.assign": { "packages": { - "gulp>undertaker>bach>array-last>is-number": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>has-symbols": true, + "@lavamoat/lavapack>json-stable-stringify>object-keys": true } }, - "gulp>undertaker>bach>async-settle": { + "gulp>undertaker>object.defaults": { "packages": { - "gulp>glob-watcher>async-done": true + "gulp>undertaker>bach>array-each": true, + "gulp>undertaker>object.defaults>array-slice": true, + "gulp>undertaker>object.reduce>for-own": true, + "gulp>gulp-cli>isobject": true } }, - "gulp>undertaker>collection-map": { + "eslint-plugin-react>object.entries": { "packages": { - "gulp>undertaker>arr-map": true, - "gulp>undertaker>arr-map>make-iterator": true, - "gulp>undertaker>object.reduce>for-own": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>es-abstract": true } }, - "gulp>undertaker>es6-weak-map": { + "eslint-plugin-react>object.fromentries": { "packages": { - "resolve-url-loader>es6-iterator": true, - "resolve-url-loader>es6-iterator>d": true, - "resolve-url-loader>es6-iterator>es5-ext": true, - "resolve-url-loader>es6-iterator>es6-symbol": true + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>es-abstract": true } }, - "gulp>undertaker>last-run": { - "builtin": { - "assert": true - }, + "eslint-plugin-react>object.hasown": { "packages": { - "gulp>undertaker>es6-weak-map": true, - "gulp>undertaker>last-run>default-resolution": true + "string.prototype.matchall>es-abstract": true } }, - "gulp>undertaker>last-run>default-resolution": { - "globals": { - "process.version.match": true + "gulp-watch>anymatch>micromatch>object.omit": { + "packages": { + "gulp-watch>anymatch>micromatch>object.omit>for-own": true, + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true } }, - "gulp>undertaker>object.defaults": { + "gulp>gulp-cli>liftoff>fined>object.pick": { "packages": { - "gulp>gulp-cli>isobject": true, - "gulp>undertaker>bach>array-each": true, - "gulp>undertaker>object.defaults>array-slice": true, - "gulp>undertaker>object.reduce>for-own": true + "gulp>gulp-cli>isobject": true } }, "gulp>undertaker>object.reduce": { "packages": { - "gulp>undertaker>arr-map>make-iterator": true, - "gulp>undertaker>object.reduce>for-own": true + "gulp>undertaker>object.reduce>for-own": true, + "gulp>undertaker>arr-map>make-iterator": true } }, - "gulp>undertaker>object.reduce>for-own": { + "@metamask/object-multiplex>once": { "packages": { - "gulp>undertaker>object.reduce>for-own>for-in": true + "@metamask/object-multiplex>once>wrappy": true } }, - "gulp>vinyl-fs": { + "gulp>vinyl-fs>glob-stream>ordered-read-streams": { "builtin": { - "os.platform": true, - "path.relative": true, - "path.resolve": true, "util.inherits": true }, - "globals": { - "Buffer.isBuffer": true, - "process.cwd": true, - "process.geteuid": true, - "process.getuid": true, - "process.nextTick": true - }, "packages": { - "del>graceful-fs": true, - "gulp>vinyl-fs>fs-mkdirp-stream": true, - "gulp>vinyl-fs>glob-stream": true, - "gulp>vinyl-fs>is-valid-glob": true, - "gulp>vinyl-fs>lazystream": true, - "gulp>vinyl-fs>lead": true, - "gulp>vinyl-fs>object.assign": true, - "gulp>vinyl-fs>pumpify": true, - "gulp>vinyl-fs>readable-stream": true, - "gulp>vinyl-fs>remove-bom-buffer": true, - "gulp>vinyl-fs>remove-bom-stream": true, - "gulp>vinyl-fs>resolve-options": true, - "gulp>vinyl-fs>through2": true, - "gulp>vinyl-fs>to-through": true, - "gulp>vinyl-fs>value-or-function": true, - "gulp>vinyl-fs>vinyl-sourcemap": true, - "vinyl": true + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream": true } }, - "gulp>vinyl-fs>fs-mkdirp-stream": { + "@storybook/core>@storybook/core-server>x-default-browser>default-browser-id>untildify>os-homedir": { "builtin": { - "path.dirname": true, - "path.resolve": true + "os.homedir": true }, "globals": { - "process.umask": true - }, - "packages": { - "del>graceful-fs": true, - "gulp>vinyl-fs>fs-mkdirp-stream>through2": true + "process.env": true, + "process.getuid": true, + "process.platform": true } }, - "gulp>vinyl-fs>fs-mkdirp-stream>through2": { - "builtin": { - "util.inherits": true - }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { "globals": { - "process.nextTick": true - }, - "packages": { - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream": true, - "watchify>xtend": true + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true } }, - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "child_process.exec": true, + "path": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true }, "packages": { - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>isarray": true, - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "@storybook/core>@storybook/core-server>x-default-browser>default-browser-id>untildify>os-homedir": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true } }, - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "@storybook/test-runner>jest-circus>p-limit": { + "packages": { + "@storybook/test-runner>jest-circus>p-limit>yocto-queue": true } }, - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>string_decoder": { + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate>p-limit": { "packages": { - "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>safe-buffer": true + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate>p-limit>p-try": true } }, - "gulp>vinyl-fs>glob-stream": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.cwd": true, - "process.nextTick": true - }, + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate": { "packages": { - "eslint>glob-parent": true, - "gulp>glob-watcher>is-negated-glob": true, - "gulp>vinyl-fs>glob-stream>ordered-read-streams": true, - "gulp>vinyl-fs>glob-stream>pumpify": true, - "gulp>vinyl-fs>glob-stream>readable-stream": true, - "gulp>vinyl-fs>glob-stream>to-absolute-glob": true, - "gulp>vinyl-fs>glob-stream>unique-stream": true, - "nyc>glob": true, - "react-markdown>unified>extend": true, - "vinyl>remove-trailing-separator": true + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>p-locate>p-limit": true } }, - "gulp>vinyl-fs>glob-stream>ordered-read-streams": { - "builtin": { - "util.inherits": true - }, + "mocha>find-up>locate-path>p-locate": { "packages": { - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream": true + "@storybook/test-runner>jest-circus>p-limit": true } }, - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, + "del>p-map": { "packages": { - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>isarray": true, - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "del>p-map>aggregate-error": true } }, - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "eslint>@eslint/eslintrc>import-fresh>parent-module": { + "packages": { + "@metamask/test-bundler>ow>callsites": true } }, - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>string_decoder": { + "browserify>parents": { + "globals": { + "process.cwd": true, + "process.platform": true + }, "packages": { - "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>safe-buffer": true + "browserify>parents>path-platform": true } }, - "gulp>vinyl-fs>glob-stream>pumpify": { + "react-syntax-highlighter>refractor>parse-entities": { "packages": { - "gulp>vinyl-fs>glob-stream>pumpify>duplexify": true, - "gulp>vinyl-fs>glob-stream>pumpify>pump": true, - "pumpify>inherits": true + "react-syntax-highlighter>refractor>parse-entities>character-entities-legacy": true, + "react-syntax-highlighter>refractor>parse-entities>character-entities": true, + "react-syntax-highlighter>refractor>parse-entities>character-reference-invalid": true, + "react-syntax-highlighter>refractor>parse-entities>is-alphanumerical": true, + "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, + "react-syntax-highlighter>refractor>parse-entities>is-hexadecimal": true } }, - "gulp>vinyl-fs>glob-stream>pumpify>duplexify": { - "globals": { - "Buffer": true, - "process.nextTick": true - }, + "gulp-watch>anymatch>micromatch>parse-glob": { "packages": { - "duplexify>end-of-stream": true, - "duplexify>stream-shift": true, - "gulp>vinyl-fs>glob-stream>readable-stream": true, - "pumpify>inherits": true + "gulp-watch>anymatch>micromatch>parse-glob>glob-base": true, + "gulp-watch>anymatch>micromatch>parse-glob>is-dotfile": true, + "gulp-watch>anymatch>micromatch>is-extglob": true, + "gulp-watch>anymatch>micromatch>parse-glob>is-glob": true } }, - "gulp>vinyl-fs>glob-stream>pumpify>pump": { - "builtin": { - "fs": true - }, + "depcheck>cosmiconfig>parse-json": { "packages": { - "@metamask/object-multiplex>once": true, - "duplexify>end-of-stream": true + "@babel/code-frame": true, + "depcheck>cosmiconfig>parse-json>error-ex": true, + "webpack>json-parse-even-better-errors": true, + "depcheck>cosmiconfig>parse-json>lines-and-columns": true } }, - "gulp>vinyl-fs>glob-stream>readable-stream": { + "nyc>find-up>path-exists": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "gulp>vinyl-fs>glob-stream>readable-stream>isarray": true, - "gulp>vinyl-fs>glob-stream>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>glob-stream>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "fs.access": true, + "fs.accessSync": true, + "util.promisify": true } }, - "gulp>vinyl-fs>glob-stream>readable-stream>safe-buffer": { + "eslint-plugin-import>eslint-module-utils>find-up>locate-path>path-exists": { "builtin": { - "buffer": true + "fs.access": true, + "fs.accessSync": true } }, - "gulp>vinyl-fs>glob-stream>readable-stream>string_decoder": { - "packages": { - "gulp>vinyl-fs>glob-stream>readable-stream>safe-buffer": true + "gulp-watch>path-is-absolute": { + "globals": { + "process.platform": true } }, - "gulp>vinyl-fs>glob-stream>to-absolute-glob": { + "depcheck>resolve>path-parse": { + "globals": { + "process.platform": true + } + }, + "browserify>parents>path-platform": { "builtin": { - "path.resolve": true + "path": true, + "util.isObject": true, + "util.isString": true }, "globals": { "process.cwd": true, + "process.env": true, "process.platform": true - }, - "packages": { - "gulp>glob-watcher>is-negated-glob": true, - "gulp>gulp-cli>replace-homedir>is-absolute": true } }, - "gulp>vinyl-fs>glob-stream>unique-stream": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify": true, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter": true + "globby>dir-glob>path-type": { + "builtin": { + "fs": true, + "util.promisify": true } }, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter": { + "gulp-livereload>event-stream>pause-stream": { "packages": { - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2": true, - "watchify>xtend": true + "debounce-stream>through": true } }, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2": { + "postcss>picocolors": { + "globals": { + "process": true + } + }, + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss>picocolors": { "builtin": { - "util.inherits": true + "tty.isatty": true }, "globals": { - "process.nextTick": true + "process.argv.includes": true, + "process.env": true, + "process.platform": true + } + }, + "stylelint>postcss-less>postcss>picocolors": { + "builtin": { + "tty.isatty": true }, - "packages": { - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream": true, - "watchify>xtend": true + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true } }, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream": { + "stylelint>postcss-safe-parser>postcss>picocolors": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "tty.isatty": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>isarray": true, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "process.argv.includes": true, + "process.env": true, + "process.platform": true } }, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>safe-buffer": { + "stylelint>postcss-sass>postcss>picocolors": { "builtin": { - "buffer": true + "tty.isatty": true + }, + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true } }, - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>string_decoder": { - "packages": { - "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>safe-buffer": true + "stylelint>postcss-scss>postcss>picocolors": { + "builtin": { + "tty.isatty": true + }, + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true } }, - "gulp>vinyl-fs>lazystream": { + "stylelint>postcss>picocolors": { "builtin": { - "util.inherits": true + "tty.isatty": true }, - "packages": { - "gulp>vinyl-fs>lazystream>readable-stream": true + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true } }, - "gulp>vinyl-fs>lazystream>readable-stream": { + "stylelint>sugarss>postcss>picocolors": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "tty.isatty": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "gulp>vinyl-fs>lazystream>readable-stream>isarray": true, - "gulp>vinyl-fs>lazystream>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>lazystream>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "process.argv.includes": true, + "process.env": true, + "process.platform": true } }, - "gulp>vinyl-fs>lazystream>readable-stream>safe-buffer": { + "chokidar>anymatch>picomatch": { "builtin": { - "buffer": true + "path.basename": true, + "path.sep": true + }, + "globals": { + "process.platform": true, + "process.version.slice": true } }, - "gulp>vinyl-fs>lazystream>readable-stream>string_decoder": { + "gh-pages>globby>pinkie-promise": { "packages": { - "gulp>vinyl-fs>lazystream>readable-stream>safe-buffer": true + "gh-pages>globby>pinkie-promise>pinkie": true } }, - "gulp>vinyl-fs>lead": { + "gh-pages>globby>pinkie-promise>pinkie": { "globals": { - "process.nextTick": true - }, - "packages": { - "gulp>vinyl-fs>lead>flush-write-stream": true + "process": true, + "setImmediate": true, + "setTimeout": true } }, - "gulp>vinyl-fs>lead>flush-write-stream": { - "globals": { - "Buffer": true + "gulp-zip>plugin-error": { + "builtin": { + "util.inherits": true }, "packages": { - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream": true, - "pumpify>inherits": true + "gulp-watch>ansi-colors": true, + "gulp-zip>plugin-error>arr-diff": true, + "gulp-zip>plugin-error>arr-union": true, + "gulp-zip>plugin-error>extend-shallow": true } }, - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream": { + "postcss": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "fs.existsSync": true, + "fs.readFileSync": true, + "path.dirname": true, + "path.isAbsolute": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true, + "url.fileURLToPath": true, + "url.pathToFileURL": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer": true, + "URL": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.LANG": true, + "process.env.NODE_ENV": true }, "packages": { - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>isarray": true, - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "nanoid": true, + "postcss>picocolors": true, + "postcss>source-map-js": true } }, - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>string_decoder": { + "postcss-discard-font-face": { "packages": { - "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>safe-buffer": true + "postcss-discard-font-face>balanced-match": true, + "postcss-discard-font-face>postcss": true } }, - "gulp>vinyl-fs>object.assign": { + "stylelint>postcss-html": { + "globals": { + "__dirname": true + }, "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>has-symbols": true + "stylelint>postcss-html>htmlparser2": true, + "stylelint>postcss-syntax": true } }, - "gulp>vinyl-fs>pumpify": { + "stylelint>postcss-less": { "packages": { - "gulp>vinyl-fs>pumpify>duplexify": true, - "gulp>vinyl-fs>pumpify>pump": true, - "pumpify>inherits": true + "stylelint>postcss-less>postcss": true } }, - "gulp>vinyl-fs>pumpify>duplexify": { + "gulp-postcss>postcss-load-config": { + "builtin": { + "module.createRequire": true, + "module.createRequireFromPath": true, + "path.resolve": true + }, "globals": { - "Buffer": true, - "process.nextTick": true + "process.cwd": true, + "process.env.NODE_ENV": true }, "packages": { - "duplexify>end-of-stream": true, - "duplexify>stream-shift": true, - "gulp>vinyl-fs>readable-stream": true, - "pumpify>inherits": true + "gulp-postcss>postcss-load-config>lilconfig": true, + "ts-node": true, + "gulp-postcss>postcss-load-config>yaml": true } }, - "gulp>vinyl-fs>pumpify>pump": { - "builtin": { - "fs": true - }, + "stylelint>postcss-reporter": { "packages": { - "@metamask/object-multiplex>once": true, - "duplexify>end-of-stream": true + "lodash": true } }, - "gulp>vinyl-fs>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, + "postcss-rtlcss": { "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "SuppressedError": true }, "packages": { - "gulp>vinyl-fs>readable-stream>isarray": true, - "gulp>vinyl-fs>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true + "postcss": true, + "postcss-rtlcss>rtlcss": true } }, - "gulp>vinyl-fs>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "stylelint>postcss-safe-parser": { + "packages": { + "stylelint>postcss-safe-parser>postcss": true } }, - "gulp>vinyl-fs>readable-stream>string_decoder": { + "stylelint>postcss-sass": { "packages": { - "gulp>vinyl-fs>readable-stream>safe-buffer": true + "stylelint>postcss-sass>gonzales-pe": true, + "stylelint>postcss-sass>postcss": true } }, - "gulp>vinyl-fs>remove-bom-buffer": { + "stylelint>postcss-scss": { "packages": { - "browserify>insert-module-globals>is-buffer": true, - "gulp>vinyl-fs>remove-bom-buffer>is-utf8": true + "stylelint>postcss-scss>postcss": true } }, - "gulp>vinyl-fs>remove-bom-stream": { + "stylelint>postcss-selector-parser": { "packages": { - "gulp>vinyl-fs>remove-bom-buffer": true, - "gulp>vinyl-fs>remove-bom-stream>through2": true, - "koa>content-disposition>safe-buffer": true + "stylelint>postcss-selector-parser>cssesc": true, + "readable-stream>util-deprecate": true } }, - "gulp>vinyl-fs>remove-bom-stream>through2": { + "stylelint>postcss-syntax": { "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true + "path.isAbsolute": true, + "path.resolve": true, + "path.sep": true }, "packages": { - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream": true, - "watchify>xtend": true + "stylelint>postcss": true } }, - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream": { + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "fs": true, + "path": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>isarray": true, - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder": { - "packages": { - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder>safe-buffer": true - } - }, - "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "gulp>vinyl-fs>resolve-options": { + "Buffer": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.NODE_ENV": true + }, "packages": { - "gulp>vinyl-fs>value-or-function": true + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>postcss>picocolors": true, + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>source-map": true } }, - "gulp>vinyl-fs>through2": { + "postcss-discard-font-face>postcss": { "builtin": { - "util.inherits": true + "fs": true, + "path": true }, "globals": { - "process.nextTick": true + "console": true }, "packages": { - "gulp>vinyl-fs>readable-stream": true, - "watchify>xtend": true - } - }, - "gulp>vinyl-fs>to-through": { - "packages": { - "gulp>vinyl-fs>to-through>through2": true + "postcss-discard-font-face>postcss>chalk": true, + "postcss-discard-font-face>postcss>js-base64": true, + "postcss-discard-font-face>postcss>source-map": true, + "postcss-discard-font-face>postcss>supports-color": true } }, - "gulp>vinyl-fs>to-through>through2": { + "stylelint>postcss-less>postcss": { "builtin": { - "util.inherits": true + "fs": true, + "path": true }, "globals": { - "process.nextTick": true + "Buffer": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.NODE_ENV": true }, "packages": { - "gulp>vinyl-fs>to-through>through2>readable-stream": true, - "watchify>xtend": true + "stylelint>postcss-less>postcss>picocolors": true, + "stylelint>postcss-less>postcss>source-map": true } }, - "gulp>vinyl-fs>to-through>through2>readable-stream": { + "stylelint>postcss-safe-parser>postcss": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "fs": true, + "path": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.NODE_ENV": true }, "packages": { - "gulp>vinyl-fs>to-through>through2>readable-stream>isarray": true, - "gulp>vinyl-fs>to-through>through2>readable-stream>safe-buffer": true, - "gulp>vinyl-fs>to-through>through2>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "gulp>vinyl-fs>to-through>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "gulp>vinyl-fs>to-through>through2>readable-stream>string_decoder": { - "packages": { - "gulp>vinyl-fs>to-through>through2>readable-stream>safe-buffer": true + "stylelint>postcss-safe-parser>postcss>picocolors": true, + "stylelint>postcss-safe-parser>postcss>source-map": true } }, - "gulp>vinyl-fs>vinyl-sourcemap": { + "stylelint>postcss-sass>postcss": { "builtin": { - "path.dirname": true, - "path.join": true, - "path.relative": true, - "path.resolve": true + "fs": true, + "path": true }, "globals": { - "Buffer": true + "Buffer": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.NODE_ENV": true }, "packages": { - "del>graceful-fs": true, - "gulp-watch>anymatch>normalize-path": true, - "gulp>vinyl-fs>remove-bom-buffer": true, - "gulp>vinyl-fs>vinyl-sourcemap>append-buffer": true, - "gulp>vinyl-fs>vinyl-sourcemap>now-and-later": true, - "nyc>convert-source-map": true, - "vinyl": true + "stylelint>postcss-sass>postcss>picocolors": true, + "stylelint>postcss-sass>postcss>source-map": true } }, - "gulp>vinyl-fs>vinyl-sourcemap>append-buffer": { + "stylelint>postcss-scss>postcss": { "builtin": { - "os.EOL": true + "fs": true, + "path": true }, "globals": { - "Buffer": true + "Buffer": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.NODE_ENV": true }, "packages": { - "gulp>vinyl-fs>vinyl-sourcemap>append-buffer>buffer-equal": true + "stylelint>postcss-scss>postcss>picocolors": true, + "stylelint>postcss-scss>postcss>source-map": true } }, - "gulp>vinyl-fs>vinyl-sourcemap>append-buffer>buffer-equal": { + "stylelint>postcss": { "builtin": { - "buffer.Buffer.isBuffer": true - } - }, - "gulp>vinyl-fs>vinyl-sourcemap>now-and-later": { - "packages": { - "@metamask/object-multiplex>once": true - } - }, - "ini": { - "globals": { - "process": true - } - }, - "jsdom>acorn": { + "fs": true, + "path": true + }, "globals": { + "Buffer": true, + "atob": true, + "btoa": true, "console": true, - "define": true - } - }, - "koa>content-disposition>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "koa>is-generator-function>has-tostringtag": { - "packages": { - "string.prototype.matchall>has-symbols": true - } - }, - "labeled-stream-splicer": { - "packages": { - "labeled-stream-splicer>stream-splicer": true, - "pumpify>inherits": true - } - }, - "labeled-stream-splicer>stream-splicer": { - "globals": { - "process.nextTick": true, - "setImmediate": true + "process.env.NODE_ENV": true }, "packages": { - "labeled-stream-splicer>stream-splicer>readable-stream": true, - "pumpify>inherits": true + "stylelint>postcss>picocolors": true, + "stylelint>postcss>source-map": true } }, - "labeled-stream-splicer>stream-splicer>readable-stream": { + "stylelint>sugarss>postcss": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "fs": true, + "path": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer": true, + "atob": true, + "btoa": true, + "console": true, + "process.env.NODE_ENV": true }, "packages": { - "labeled-stream-splicer>stream-splicer>readable-stream>isarray": true, - "labeled-stream-splicer>stream-splicer>readable-stream>safe-buffer": true, - "labeled-stream-splicer>stream-splicer>readable-stream>string_decoder": true, - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true - } - }, - "labeled-stream-splicer>stream-splicer>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "labeled-stream-splicer>stream-splicer>readable-stream>string_decoder": { - "packages": { - "labeled-stream-splicer>stream-splicer>readable-stream>safe-buffer": true + "stylelint>sugarss>postcss>picocolors": true, + "stylelint>sugarss>postcss>source-map": true } }, - "lavamoat-browserify": { + "prettier": { "builtin": { - "fs.existsSync": true, - "fs.mkdirSync": true, - "fs.readFileSync": true, - "fs.writeFileSync": true, - "path.dirname": true, - "path.extname": true, - "path.resolve": true, - "util.callbackify": true + "assert": true, + "events.EventEmitter": true, + "fs": true, + "module._nodeModulePaths": true, + "module._resolveFilename": true, + "os": true, + "path": true, + "stream.PassThrough": true, + "stream.Readable": true, + "util.inherits": true, + "util.inspect": true, + "util.promisify": true }, "globals": { - "console.warn": true, - "process.cwd": true, - "setTimeout": true - }, - "packages": { - "@lavamoat/lavapack": true, - "@lavamoat/lavapack>json-stable-stringify": true, - "browserify>browser-resolve": true, - "lavamoat-browserify>concat-stream": true, - "lavamoat-browserify>duplexify": true, - "lavamoat-viz>lavamoat-core": true, - "lavamoat>@lavamoat/aa": true, - "readable-stream": true, - "through2": true - } - }, - "lavamoat-browserify>concat-stream": { - "globals": { - "Buffer.concat": true, - "Buffer.isBuffer": true - }, - "packages": { - "browserify>concat-stream>typedarray": true, - "pumpify>inherits": true, - "readable-stream": true, - "terser>source-map-support>buffer-from": true - } - }, - "lavamoat-browserify>duplexify": { - "globals": { + "ANONYMOUS": true, "Buffer": true, - "process.nextTick": true - }, - "packages": { - "duplexify>end-of-stream": true, - "duplexify>stream-shift": true, - "pumpify>inherits": true, - "readable-stream": true - } - }, - "lavamoat-viz>lavamoat-core": { - "builtin": { - "node:events": true, - "node:fs.readFileSync": true, - "node:fs/promises.writeFile": true, - "node:path.extname": true, - "node:path.join": true - }, - "globals": { + "BuilderFileEmit": true, + "BuilderProgramKind": true, + "BuilderState": true, + "CheckMode": true, + "ClassificationType": true, + "ClassificationTypeNames": true, + "CompletionInfoFlags": true, + "CompletionTriggerKind": true, + "ConfigFileProgramReloadLevel": true, + "CoreServicesShimHostAdapter": true, + "DocumentHighlights": true, + "Element": true, + "EndOfLineState": true, + "ExportKind": true, + "FileSystemEntryKind": true, + "FileWatcherEventKind": true, + "FlattenLevel": true, + "ForegroundColorEscapeSequences": true, + "HTMLElement": true, + "HighlightSpanKind": true, + "ImportKind": true, + "IndentStyle": true, + "InlayHintKind": true, + "Intl": true, + "InvalidatedProjectKind": true, + "LanguageServiceMode": true, + "LanguageServiceShimHostAdapter": true, + "ModuleInstanceState": true, + "NodeResolutionFeatures": true, + "OrganizeImportsMode": true, + "OutliningSpanKind": true, + "OutputFileType": true, + "PackageJsonAutoImportPreference": true, + "PackageJsonDependencyGroup": true, + "PatternMatchKind": true, + "PollingInterval": true, + "PrivateIdentifierKind": true, + "ProcessLevel": true, + "QuotePreference": true, + "SVGElement": true, + "ScriptElementKind": true, + "ScriptElementKindModifier": true, + "ScriptSnapshot": true, + "SemanticClassificationFormat": true, + "SemanticMeaning": true, + "SemicolonPreference": true, + "SignatureCheckMode": true, + "SymbolDisplayPartKind": true, + "TokenClass": true, + "TypeFacts": true, + "TypeScriptServicesFactory": true, + "UpToDateStatusType": true, + "Version": true, + "VersionRange": true, + "WatchLogLevel": true, + "WatchType": true, + "WorkerGlobalScope": true, + "YAML_SILENCE_DEPRECATION_WARNINGS": true, + "YAML_SILENCE_WARNINGS": true, "__dirname": true, - "console.error": true, - "console.warn": true, - "define": true - }, - "packages": { - "@lavamoat/lavapack>json-stable-stringify": true, - "lavamoat-viz>lavamoat-core>lavamoat-tofu": true, - "lavamoat>lavamoat-core>merge-deep": true - } - }, - "lavamoat-viz>lavamoat-core>lavamoat-tofu": { - "globals": { - "console.log": true - }, - "packages": { - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/parser": true, - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/traverse": true - } - }, - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/traverse": { - "globals": { - "console.log": true - }, - "packages": { - "@babel/code-frame": true, - "@babel/core>@babel/generator": true, - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/traverse>@babel/parser": true, - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/traverse>@babel/types": true, - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/traverse>globals": true, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-environment-visitor": true, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-function-name": true, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-hoist-variables": true, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-split-export-declaration": true, - "nock>debug": true - } - }, - "lavamoat-viz>lavamoat-core>lavamoat-tofu>@babel/traverse>@babel/types": { - "globals": { - "console.warn": true, - "process.env": true - }, - "packages": { - "@babel/core>@babel/types>@babel/helper-string-parser": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true - } - }, - "lavamoat>@lavamoat/aa": { - "builtin": { - "node:fs.lstatSync": true, - "node:fs.readFileSync": true, - "node:fs.realpathSync": true, - "node:path.dirname": true, - "node:path.join": true, - "node:path.relative": true - }, - "packages": { - "depcheck>resolve": true - } - }, - "lavamoat>lavamoat-core>merge-deep": { - "packages": { - "gulp-zip>plugin-error>arr-union": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep": true, - "lavamoat>lavamoat-core>merge-deep>kind-of": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep": { - "packages": { - "@babel/register>clone-deep>is-plain-object": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>for-own": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>lazy-cache": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone": true, - "lavamoat>lavamoat-core>merge-deep>kind-of": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep>for-own": { - "packages": { - "gulp>undertaker>object.reduce>for-own>for-in": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep>lazy-cache": { - "globals": { - "process.env.TRAVIS": true, - "process.env.UNLAZY": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone": { - "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>kind-of": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>lazy-cache": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>kind-of": { - "globals": { - "Buffer": true - }, - "packages": { - "browserify>insert-module-globals>is-buffer": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>lazy-cache": { - "globals": { - "process.env.UNLAZY": true - } - }, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object": { - "packages": { - "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, - "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object>for-in": true - } - }, - "lavamoat>lavamoat-core>merge-deep>kind-of": { - "packages": { - "browserify>insert-module-globals>is-buffer": true - } - }, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-function-name": { - "packages": { - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true - } - }, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-hoist-variables": { - "packages": { - "@babel/core>@babel/types": true - } - }, - "lavamoat>lavamoat-tofu>@babel/traverse>@babel/helper-split-export-declaration": { - "packages": { - "@babel/core>@babel/types": true - } - }, - "lodash": { - "globals": { - "define": true - } - }, - "loose-envify": { - "builtin": { - "stream.PassThrough": true, - "stream.Transform": true, - "util.inherits": true - }, - "globals": { - "process.env": true - }, - "packages": { - "loose-envify>js-tokens": true - } - }, - "mocha>find-up": { - "builtin": { - "path.dirname": true, - "path.parse": true, - "path.resolve": true - }, - "packages": { - "mocha>find-up>locate-path": true, - "nyc>find-up>path-exists": true - } - }, - "mocha>find-up>locate-path": { - "builtin": { - "fs.lstat": true, - "fs.lstatSync": true, - "fs.stat": true, - "fs.statSync": true, - "path.resolve": true, - "util.promisify": true - }, - "globals": { - "process.cwd": true - }, - "packages": { - "mocha>find-up>locate-path>p-locate": true - } - }, - "mocha>find-up>locate-path>p-locate": { - "packages": { - "@storybook/test-runner>jest-circus>p-limit": true - } - }, - "mocha>log-symbols": { - "packages": { - "chalk": true, - "mocha>log-symbols>is-unicode-supported": true - } - }, - "mocha>log-symbols>is-unicode-supported": { - "globals": { - "process.env.CI": true, - "process.env.TERM": true, - "process.env.TERM_PROGRAM": true, - "process.env.WT_SESSION": true, - "process.platform": true - } - }, - "mocha>supports-color": { - "builtin": { - "os.release": true, - "tty.isatty": true - }, - "globals": { - "process.env": true, - "process.platform": true - }, - "packages": { - "mocha>supports-color>has-flag": true - } - }, - "mocha>supports-color>has-flag": { - "globals": { - "process.argv": true - } - }, - "mockttp>portfinder>mkdirp": { - "builtin": { - "fs": true, - "path.dirname": true, - "path.resolve": true - } - }, - "nock>debug": { - "builtin": { - "tty.isatty": true, - "util.deprecate": true, - "util.formatWithOptions": true, - "util.inspect": true - }, - "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, - "packages": { - "mocha>supports-color": true, - "nock>debug>ms": true - } - }, - "node-sass": { - "native": true - }, - "nyc>convert-source-map": { - "builtin": { - "fs.readFileSync": true, - "path.join": true - }, - "globals": { - "Buffer.from": true - } - }, - "nyc>find-up>path-exists": { - "builtin": { - "fs.access": true, - "fs.accessSync": true, - "util.promisify": true - } - }, - "nyc>glob": { - "builtin": { - "assert": true, - "events.EventEmitter": true, - "fs": true, - "path.join": true, - "path.resolve": true, - "util": true - }, - "globals": { - "console.error": true, - "process.cwd": true, - "process.nextTick": true, - "process.platform": true - }, - "packages": { - "@metamask/object-multiplex>once": true, - "eslint>minimatch": true, - "gulp-watch>path-is-absolute": true, - "nyc>glob>fs.realpath": true, - "nyc>glob>inflight": true, - "pumpify>inherits": true - } - }, - "nyc>glob>fs.realpath": { - "builtin": { - "fs.lstat": true, - "fs.lstatSync": true, - "fs.readlink": true, - "fs.readlinkSync": true, - "fs.realpath": true, - "fs.realpathSync": true, - "fs.stat": true, - "fs.statSync": true, - "path.normalize": true, - "path.resolve": true - }, - "globals": { - "console.error": true, - "console.trace": true, - "process.env.NODE_DEBUG": true, - "process.nextTick": true, - "process.noDeprecation": true, - "process.platform": true, - "process.throwDeprecation": true, - "process.traceDeprecation": true, - "process.version": true - } - }, - "nyc>glob>inflight": { - "globals": { - "process.nextTick": true - }, - "packages": { - "@metamask/object-multiplex>once": true, - "@metamask/object-multiplex>once>wrappy": true - } - }, - "nyc>resolve-from": { - "builtin": { - "fs.realpathSync": true, - "module._nodeModulePaths": true, - "module._resolveFilename": true, - "path.join": true, - "path.resolve": true - } - }, - "nyc>signal-exit": { - "builtin": { - "assert.equal": true, - "events": true - }, - "globals": { - "process": true - } - }, - "nyc>spawn-wrap>is-windows": { - "globals": { - "define": true, - "isWindows": "write", - "process": true - } - }, - "nyc>yargs>set-blocking": { - "globals": { - "process.stderr": true, - "process.stdout": true - } - }, - "postcss": { - "builtin": { - "fs.existsSync": true, - "fs.readFileSync": true, - "path.dirname": true, - "path.isAbsolute": true, - "path.join": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true, - "url.fileURLToPath": true, - "url.pathToFileURL": true - }, - "globals": { - "Buffer": true, - "URL": true, + "__filename": true, + "accessPrivateIdentifier": true, + "addEmitFlags": true, + "addEmitHelper": true, + "addEmitHelpers": true, + "addInternalEmitFlags": true, + "addSyntheticLeadingComment": true, + "addSyntheticTrailingComment": true, + "advancedAsyncSuperHelper": true, + "affectsDeclarationPathOptionDeclarations": true, + "affectsEmitOptionDeclarations": true, + "allKeysStartWithDot": true, + "assertDoc": true, + "assignHelper": true, + "asyncDelegator": true, + "asyncGeneratorHelper": true, + "asyncSuperHelper": true, + "asyncValues": true, "atob": true, + "awaitHelper": true, + "awaiterHelper": true, + "bindSourceFile": true, + "breakIntoCharacterSpans": true, + "breakIntoWordSpans": true, "btoa": true, - "console": true, - "process.env.LANG": true, - "process.env.NODE_ENV": true - }, - "packages": { - "postcss>nanoid": true, - "postcss>picocolors": true, - "postcss>source-map-js": true - } - }, - "postcss-discard-font-face": { - "packages": { - "postcss-discard-font-face>balanced-match": true, - "postcss-discard-font-face>postcss": true - } - }, - "postcss-discard-font-face>postcss": { - "builtin": { - "fs": true, - "path": true - }, - "globals": { - "console": true - }, - "packages": { - "postcss-discard-font-face>postcss>chalk": true, - "postcss-discard-font-face>postcss>js-base64": true, - "postcss-discard-font-face>postcss>source-map": true, - "postcss-discard-font-face>postcss>supports-color": true - } - }, - "postcss-discard-font-face>postcss>chalk": { - "globals": { - "process.env.TERM": true, - "process.platform": true - }, - "packages": { - "postcss-discard-font-face>postcss>chalk>ansi-styles": true, - "postcss-discard-font-face>postcss>chalk>escape-string-regexp": true, - "postcss-discard-font-face>postcss>chalk>strip-ansi": true, - "postcss-discard-font-face>postcss>chalk>supports-color": true, - "prettier-eslint>loglevel-colored-level-prefix>chalk>has-ansi": true - } - }, - "postcss-discard-font-face>postcss>chalk>strip-ansi": { - "packages": { - "postcss-discard-font-face>postcss>chalk>strip-ansi>ansi-regex": true - } - }, - "postcss-discard-font-face>postcss>chalk>supports-color": { - "globals": { - "process.argv": true, - "process.env": true, - "process.platform": true, - "process.stdout": true - } - }, - "postcss-discard-font-face>postcss>js-base64": { - "globals": { - "Base64": "write", - "define": true - } - }, - "postcss-discard-font-face>postcss>supports-color": { - "globals": { - "process": true - }, - "packages": { - "postcss-discard-font-face>postcss>supports-color>has-flag": true - } - }, - "postcss-discard-font-face>postcss>supports-color>has-flag": { - "globals": { - "process.argv": true - } - }, - "postcss-rtlcss": { - "globals": { - "SuppressedError": true - }, - "packages": { - "postcss": true, - "postcss-rtlcss>rtlcss": true - } - }, - "postcss-rtlcss>rtlcss": { - "packages": { - "postcss": true - } - }, - "postcss>picocolors": { - "globals": { - "process": true - } - }, - "postcss>source-map-js": { - "globals": { - "console": true - } - }, - "prettier": { - "builtin": { - "assert": true, - "events.EventEmitter": true, - "fs": true, - "module._nodeModulePaths": true, - "module._resolveFilename": true, - "os": true, - "path": true, - "stream.PassThrough": true, - "stream.Readable": true, - "util.inherits": true, - "util.inspect": true, - "util.promisify": true - }, - "globals": { - "ANONYMOUS": true, - "Buffer": true, - "BuilderFileEmit": true, - "BuilderProgramKind": true, - "BuilderState": true, - "CheckMode": true, - "ClassificationType": true, - "ClassificationTypeNames": true, - "CompletionInfoFlags": true, - "CompletionTriggerKind": true, - "ConfigFileProgramReloadLevel": true, - "CoreServicesShimHostAdapter": true, - "DocumentHighlights": true, - "Element": true, - "EndOfLineState": true, - "ExportKind": true, - "FileSystemEntryKind": true, - "FileWatcherEventKind": true, - "FlattenLevel": true, - "ForegroundColorEscapeSequences": true, - "HTMLElement": true, - "HighlightSpanKind": true, - "ImportKind": true, - "IndentStyle": true, - "InlayHintKind": true, - "Intl": true, - "InvalidatedProjectKind": true, - "LanguageServiceMode": true, - "LanguageServiceShimHostAdapter": true, - "ModuleInstanceState": true, - "NodeResolutionFeatures": true, - "OrganizeImportsMode": true, - "OutliningSpanKind": true, - "OutputFileType": true, - "PackageJsonAutoImportPreference": true, - "PackageJsonDependencyGroup": true, - "PatternMatchKind": true, - "PollingInterval": true, - "PrivateIdentifierKind": true, - "ProcessLevel": true, - "QuotePreference": true, - "SVGElement": true, - "ScriptElementKind": true, - "ScriptElementKindModifier": true, - "ScriptSnapshot": true, - "SemanticClassificationFormat": true, - "SemanticMeaning": true, - "SemicolonPreference": true, - "SignatureCheckMode": true, - "SymbolDisplayPartKind": true, - "TokenClass": true, - "TypeFacts": true, - "TypeScriptServicesFactory": true, - "UpToDateStatusType": true, - "Version": true, - "VersionRange": true, - "WatchLogLevel": true, - "WatchType": true, - "WorkerGlobalScope": true, - "YAML_SILENCE_DEPRECATION_WARNINGS": true, - "YAML_SILENCE_WARNINGS": true, - "__dirname": true, - "__filename": true, - "accessPrivateIdentifier": true, - "addEmitFlags": true, - "addEmitHelper": true, - "addEmitHelpers": true, - "addInternalEmitFlags": true, - "addSyntheticLeadingComment": true, - "addSyntheticTrailingComment": true, - "advancedAsyncSuperHelper": true, - "affectsDeclarationPathOptionDeclarations": true, - "affectsEmitOptionDeclarations": true, - "allKeysStartWithDot": true, - "assertDoc": true, - "assignHelper": true, - "asyncDelegator": true, - "asyncGeneratorHelper": true, - "asyncSuperHelper": true, - "asyncValues": true, - "atob": true, - "awaitHelper": true, - "awaiterHelper": true, - "bindSourceFile": true, - "breakIntoCharacterSpans": true, - "breakIntoWordSpans": true, - "btoa": true, - "buildLinkParts": true, - "buildOpts": true, - "buildOverload": true, - "bundlerModuleNameResolver": true, - "canBeConvertedToAsync": true, - "canJsonReportNoInputFiles": true, - "canProduceDiagnostics": true, - "canWatchDirectoryOrFile": true, - "chainBundle": true, - "changeCompilerHostLikeToUseCache": true, - "classPrivateFieldGetHelper": true, - "classPrivateFieldInHelper": true, - "classPrivateFieldSetHelper": true, - "classicNameResolver": true, - "cleanExtendedConfigCache": true, - "clearSharedExtendedConfigFileWatcher": true, - "clearTimeout": true, - "climbPastPropertyAccess": true, - "climbPastPropertyOrElementAccess": true, - "cloneCompilerOptions": true, - "closeFileWatcherOf": true, - "collectExternalModuleInfo": true, - "commonOptionsWithBuild": true, - "compareEmitHelpers": true, - "comparePatternKeys": true, - "compileOnSaveCommandLineOption": true, - "compilerOptionsDidYouMeanDiagnostics": true, - "compilerOptionsIndicateEsModules": true, - "computeCommonSourceDirectoryOfFilenames": true, - "computeSignature": true, - "computeSignatureWithDiagnostics": true, - "computeSuggestionDiagnostics": true, + "buildLinkParts": true, + "buildOpts": true, + "buildOverload": true, + "bundlerModuleNameResolver": true, + "canBeConvertedToAsync": true, + "canJsonReportNoInputFiles": true, + "canProduceDiagnostics": true, + "canWatchDirectoryOrFile": true, + "chainBundle": true, + "changeCompilerHostLikeToUseCache": true, + "classPrivateFieldGetHelper": true, + "classPrivateFieldInHelper": true, + "classPrivateFieldSetHelper": true, + "classicNameResolver": true, + "cleanExtendedConfigCache": true, + "clearSharedExtendedConfigFileWatcher": true, + "clearTimeout": true, + "climbPastPropertyAccess": true, + "climbPastPropertyOrElementAccess": true, + "cloneCompilerOptions": true, + "closeFileWatcherOf": true, + "collectExternalModuleInfo": true, + "commonOptionsWithBuild": true, + "compareEmitHelpers": true, + "comparePatternKeys": true, + "compileOnSaveCommandLineOption": true, + "compilerOptionsDidYouMeanDiagnostics": true, + "compilerOptionsIndicateEsModules": true, + "computeCommonSourceDirectoryOfFilenames": true, + "computeSignature": true, + "computeSignatureWithDiagnostics": true, + "computeSuggestionDiagnostics": true, "console": true, "consumesNodeCoreModules": true, "convertCompilerOptionsForTelemetry": true, @@ -7449,208 +6163,1361 @@ "zipToModeAwareCache": true } }, - "prettier-eslint>loglevel-colored-level-prefix>chalk>has-ansi": { + "eslint-plugin-prettier>prettier-linter-helpers": { + "packages": { + "eslint-plugin-prettier>prettier-linter-helpers>fast-diff": true + } + }, + "process": { + "globals": { + "process": true + } + }, + "vinyl>cloneable-readable>process-nextick-args": { + "globals": { + "process.nextTick": true, + "process.version": true + } + }, + "readable-stream-2>process-nextick-args": { + "globals": { + "process": true + } + }, + "vinyl>cloneable-readable>through2>readable-stream>process-nextick-args": { + "globals": { + "process": true + } + }, + "prop-types": { + "globals": { + "console": true, + "process.env.NODE_ENV": true + }, + "packages": { + "react>object-assign": true, + "prop-types>react-is": true + } + }, + "pumpify>pump": { + "builtin": { + "fs": true + }, + "globals": { + "process.version": true + }, + "packages": { + "duplexify>end-of-stream": true, + "@metamask/object-multiplex>once": true + } + }, + "gulp>vinyl-fs>glob-stream>pumpify>pump": { + "builtin": { + "fs": true + }, + "packages": { + "duplexify>end-of-stream": true, + "@metamask/object-multiplex>once": true + } + }, + "gulp>vinyl-fs>pumpify>pump": { + "builtin": { + "fs": true + }, + "packages": { + "duplexify>end-of-stream": true, + "@metamask/object-multiplex>once": true + } + }, + "pumpify": { + "packages": { + "duplexify": true, + "pumpify>inherits": true, + "pumpify>pump": true + } + }, + "gulp>vinyl-fs>glob-stream>pumpify": { + "packages": { + "gulp>vinyl-fs>glob-stream>pumpify>duplexify": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>glob-stream>pumpify>pump": true + } + }, + "gulp>vinyl-fs>pumpify": { + "packages": { + "gulp>vinyl-fs>pumpify>duplexify": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>pumpify>pump": true + } + }, + "@storybook/addon-knobs>qs": { + "packages": { + "string.prototype.matchall>side-channel": true + } + }, + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic": { + "packages": { + "gulp>undertaker>bach>array-last>is-number": true, + "@babel/register>clone-deep>kind-of": true, + "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic>math-random": true + } + }, + "randomcolor": { + "globals": { + "define": true + } + }, + "gulp-livereload>tiny-lr>body>raw-body": { + "globals": { + "Buffer.concat": true, + "process.nextTick": true + }, + "packages": { + "gulp-livereload>tiny-lr>body>raw-body>bytes": true, + "gulp-livereload>tiny-lr>body>raw-body>string_decoder": true + } + }, + "prop-types>react-is": { + "globals": { + "console": true, + "process.env.NODE_ENV": true + } + }, + "browserify>read-only-stream": { + "packages": { + "browserify>read-only-stream>readable-stream": true + } + }, + "readable-stream": { + "builtin": { + "buffer.Buffer": true, + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.env.READABLE_STREAM": true, + "process.nextTick": true, + "process.stderr": true, + "process.stdout": true + }, + "packages": { + "pumpify>inherits": true, + "browserify>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "@lavamoat/lavapack>readable-stream": { + "builtin": { + "buffer.Blob": true, + "buffer.Buffer": true, + "events.EventEmitter": true, + "events.addAbortListener": true, + "stream": true, + "string_decoder.StringDecoder": true + }, + "globals": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "ERR_INVALID_ARG_TYPE": true, + "process.env.READABLE_STREAM": true, + "queueMicrotask": true + }, + "packages": { + "@lavamoat/lavapack>readable-stream>abort-controller": true, + "process": true + } + }, + "vinyl-buffer>bl>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "vinyl-buffer>bl>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "vinyl-buffer>bl>readable-stream>safe-buffer": true, + "vinyl-buffer>bl>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>readable-stream>safe-buffer": true, + "browserify>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>concat-stream>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>concat-stream>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>concat-stream>readable-stream>safe-buffer": true, + "browserify>concat-stream>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "lavamoat-browserify>concat-stream>readable-stream": { + "builtin": { + "buffer.Buffer": true, + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.env.READABLE_STREAM": true, + "process.nextTick": true, + "process.stderr": true, + "process.stdout": true + }, + "packages": { + "pumpify>inherits": true, + "browserify>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>duplexer2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>duplexer2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>duplexer2>readable-stream>safe-buffer": true, + "browserify>duplexer2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>safe-buffer": true, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>glob-stream>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>glob-stream>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>glob-stream>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>glob-stream>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp-watch>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp-watch>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp-watch>readable-stream>safe-buffer": true, + "gulp-watch>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "lavamoat-browserify>readable-stream": { + "builtin": { + "buffer.Blob": true, + "buffer.Buffer": true, + "events.EventEmitter": true, + "events.addAbortListener": true, + "stream": true, + "string_decoder.StringDecoder": true + }, + "globals": { + "AbortController": true, + "AbortSignal": true, + "AggregateError": true, + "Blob": true, + "ERR_INVALID_ARG_TYPE": true, + "process.env.READABLE_STREAM": true, + "queueMicrotask": true + }, + "packages": { + "@lavamoat/lavapack>readable-stream>abort-controller": true, + "process": true + } + }, + "gulp>vinyl-fs>lazystream>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>lazystream>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>lazystream>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>lazystream>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>module-deps>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>module-deps>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>module-deps>readable-stream>safe-buffer": true, + "browserify>module-deps>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>read-only-stream>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>read-only-stream>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>read-only-stream>readable-stream>safe-buffer": true, + "browserify>read-only-stream>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>module-deps>stream-combiner2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>module-deps>stream-combiner2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>module-deps>stream-combiner2>readable-stream>safe-buffer": true, + "browserify>module-deps>stream-combiner2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "labeled-stream-splicer>stream-splicer>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "labeled-stream-splicer>stream-splicer>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "labeled-stream-splicer>stream-splicer>readable-stream>safe-buffer": true, + "labeled-stream-splicer>stream-splicer>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>safe-buffer": true, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>browser-pack>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>browser-pack>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>browser-pack>through2>readable-stream>safe-buffer": true, + "browserify>browser-pack>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "vinyl>cloneable-readable>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "vinyl>cloneable-readable>through2>readable-stream>isarray": true, + "vinyl>cloneable-readable>through2>readable-stream>process-nextick-args": true, + "vinyl>cloneable-readable>through2>readable-stream>safe-buffer": true, + "vinyl>cloneable-readable>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>deps-sort>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>deps-sort>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>deps-sort>through2>readable-stream>safe-buffer": true, + "browserify>deps-sort>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp-sort>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp-sort>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp-sort>through2>readable-stream>safe-buffer": true, + "gulp-sort>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp-sourcemaps>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp-sourcemaps>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp-sourcemaps>through2>readable-stream>safe-buffer": true, + "gulp-sourcemaps>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "browserify>insert-module-globals>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "browserify>insert-module-globals>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "browserify>insert-module-globals>through2>readable-stream>safe-buffer": true, + "browserify>insert-module-globals>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>to-through>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>to-through>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>to-through>through2>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>to-through>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "vinyl-source-stream>through2>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "vinyl-source-stream>through2>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "vinyl-source-stream>through2>readable-stream>safe-buffer": true, + "vinyl-source-stream>through2>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "gulp>vinyl-fs>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "readable-stream-2>core-util-is": true, + "pumpify>inherits": true, + "gulp>vinyl-fs>readable-stream>isarray": true, + "readable-stream-2>process-nextick-args": true, + "gulp>vinyl-fs>readable-stream>safe-buffer": true, + "gulp>vinyl-fs>readable-stream>string_decoder": true, + "readable-stream>util-deprecate": true + } + }, + "chokidar>readdirp": { + "builtin": { + "fs": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true, + "stream.Readable": true, + "util.promisify": true + }, + "globals": { + "process.platform": true, + "process.versions.node.split": true + }, + "packages": { + "chokidar>anymatch>picomatch": true + } + }, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regenerate": { + "globals": { + "define": true + } + }, + "@babel/preset-env>@babel/plugin-transform-regenerator>regenerator-transform": { + "builtin": { + "assert": true, + "util.inherits": true + }, + "packages": { + "@babel/runtime": true + } + }, + "gulp-watch>anymatch>micromatch>regex-cache": { + "packages": { + "gulp-watch>anymatch>micromatch>regex-cache>is-equal-shallow": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>regex-not": { + "packages": { + "gulp-zip>plugin-error>extend-shallow": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex": true + } + }, + "string.prototype.matchall>regexp.prototype.flags": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": true + } + }, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core": { + "globals": { + "characterClassItem.kind": true + }, + "packages": { + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regenerate": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsgen": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsparser": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-value-ecmascript": true + } + }, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsgen": { + "globals": { + "define": true + } + }, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>regjsparser": { + "globals": { + "regjsparser": "write" + } + }, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse": { + "packages": { + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>ccount": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>collapse-white-space": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-alphabetical": true, + "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-whitespace-character": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-word-character": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>markdown-escapes": true, + "react-syntax-highlighter>refractor>parse-entities": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>state-toggle": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>trim-trailing-lines": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>trim": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unherit": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unist-util-remove-position": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>vfile-location": true, + "watchify>xtend": true + } + }, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify": { + "packages": { + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>ccount": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>is-alphanumeric": true, + "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-whitespace-character": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>longest-streak": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>markdown-escapes": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>markdown-table": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>mdast-util-compact": true, + "react-syntax-highlighter>refractor>parse-entities": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>state-toggle": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>stringify-entities": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unherit": true, + "watchify>xtend": true + } + }, + "stylelint>@stylelint/postcss-markdown>remark": { + "packages": { + "stylelint>@stylelint/postcss-markdown>remark>remark-parse": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify": true, + "react-markdown>unified": true + } + }, + "gulp>vinyl-fs>remove-bom-buffer": { + "packages": { + "browserify>insert-module-globals>is-buffer": true, + "gulp>vinyl-fs>remove-bom-buffer>is-utf8": true + } + }, + "gulp>vinyl-fs>remove-bom-stream": { + "packages": { + "gulp>vinyl-fs>remove-bom-buffer": true, + "koa>content-disposition>safe-buffer": true, + "gulp>vinyl-fs>remove-bom-stream>through2": true + } + }, + "vinyl>remove-trailing-separator": { + "globals": { + "process.platform": true + } + }, + "gulp-sass>replace-ext": { + "builtin": { + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.sep": true + } + }, + "react-markdown>vfile>replace-ext": { + "builtin": { + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true + } + }, + "vinyl>replace-ext": { + "builtin": { + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.sep": true + } + }, + "gulp-watch>vinyl-file>vinyl>replace-ext": { + "builtin": { + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true + } + }, + "yargs>require-directory": { + "builtin": { + "fs.readdirSync": true, + "fs.statSync": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + } + }, + "eslint>@eslint/eslintrc>import-fresh>resolve-from": { + "builtin": { + "fs.realpathSync": true, + "module._nodeModulePaths": true, + "module._resolveFilename": true, + "path.join": true, + "path.resolve": true + } + }, + "nyc>resolve-from": { + "builtin": { + "fs.realpathSync": true, + "module._nodeModulePaths": true, + "module._resolveFilename": true, + "path.join": true, + "path.resolve": true + } + }, + "gulp>vinyl-fs>resolve-options": { "packages": { - "prettier-eslint>loglevel-colored-level-prefix>chalk>has-ansi>ansi-regex": true + "gulp>vinyl-fs>value-or-function": true } }, - "prop-types": { + "depcheck>resolve": { + "builtin": { + "fs.readFile": true, + "fs.readFileSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "os.homedir": true, + "path.dirname": true, + "path.join": true, + "path.parse": true, + "path.relative": true, + "path.resolve": true + }, "globals": { - "console": true, - "process.env.NODE_ENV": true + "process.env.HOME": true, + "process.env.HOMEDRIVE": true, + "process.env.HOMEPATH": true, + "process.env.LNAME": true, + "process.env.LOGNAME": true, + "process.env.USER": true, + "process.env.USERNAME": true, + "process.env.USERPROFILE": true, + "process.getuid": true, + "process.nextTick": true, + "process.platform": true, + "process.versions.pnp": true }, "packages": { - "prop-types>react-is": true, - "react>object-assign": true + "depcheck>is-core-module": true, + "depcheck>resolve>path-parse": true } }, - "prop-types>react-is": { + "eslint-plugin-react>resolve": { + "builtin": { + "fs.readFile": true, + "fs.readFileSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "os.homedir": true, + "path.dirname": true, + "path.join": true, + "path.parse": true, + "path.relative": true, + "path.resolve": true + }, "globals": { - "console": true, - "process.env.NODE_ENV": true + "process.env.HOME": true, + "process.env.HOMEDRIVE": true, + "process.env.HOMEPATH": true, + "process.env.LNAME": true, + "process.env.LOGNAME": true, + "process.env.USER": true, + "process.env.USERNAME": true, + "process.env.USERPROFILE": true, + "process.getuid": true, + "process.nextTick": true, + "process.platform": true, + "process.versions.pnp": true + }, + "packages": { + "depcheck>is-core-module": true, + "depcheck>resolve>path-parse": true } }, - "pumpify": { + "del>rimraf": { + "builtin": { + "assert": true, + "fs": true, + "path.join": true + }, + "globals": { + "process.platform": true, + "setTimeout": true + }, "packages": { - "duplexify": true, - "pumpify>inherits": true, - "pumpify>pump": true + "nyc>glob": true } }, - "pumpify>inherits": { + "stylelint>file-entry-cache>flat-cache>rimraf": { "builtin": { - "util.inherits": true + "assert": true, + "fs": true, + "path.join": true + }, + "globals": { + "process.platform": true, + "setTimeout": true + }, + "packages": { + "nyc>glob": true } }, - "pumpify>pump": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": { "builtin": { - "fs": true + "assert": true, + "fs": true, + "path.join": true }, "globals": { - "process.version": true + "process.platform": true, + "setTimeout": true }, "packages": { - "@metamask/object-multiplex>once": true, - "duplexify>end-of-stream": true + "nyc>glob": true } }, - "randomcolor": { + "postcss-rtlcss>rtlcss": { + "packages": { + "postcss": true + } + }, + "eslint>@nodelib/fs.walk>@nodelib/fs.scandir>run-parallel": { "globals": { - "define": true + "process.nextTick": true } }, - "react-markdown>unified": { - "packages": { - "mocha>yargs-unparser>is-plain-obj": true, - "react-markdown>unified>bail": true, - "react-markdown>unified>extend": true, - "react-markdown>unified>is-buffer": true, - "react-markdown>unified>trough": true, - "react-markdown>vfile": true + "wait-on>rxjs": { + "globals": { + "cancelAnimationFrame": true, + "clearInterval": true, + "clearTimeout": true, + "performance": true, + "requestAnimationFrame": true, + "setInterval.apply": true, + "setTimeout.apply": true } }, - "react-markdown>unist-util-visit": { - "packages": { - "react-markdown>unist-util-visit>unist-util-visit-parents": true + "koa>content-disposition>safe-buffer": { + "builtin": { + "buffer": true } }, - "react-markdown>unist-util-visit>unist-util-visit-parents": { - "packages": { - "react-markdown>unist-util-visit>unist-util-is": true + "vinyl-buffer>bl>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "react-markdown>vfile": { + "browserify>readable-stream>safe-buffer": { "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true, - "path.sep": true - }, - "globals": { - "process.cwd": true - }, - "packages": { - "react-markdown>vfile>is-buffer": true, - "react-markdown>vfile>replace-ext": true, - "react-markdown>vfile>vfile-message": true + "buffer": true } }, - "react-markdown>vfile>replace-ext": { + "browserify>concat-stream>readable-stream>safe-buffer": { "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true + "buffer": true } }, - "react-markdown>vfile>vfile-message": { - "packages": { - "react-markdown>vfile>unist-util-stringify-position": true + "browserify>duplexer2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "react-syntax-highlighter>refractor>parse-entities": { - "packages": { - "react-syntax-highlighter>refractor>parse-entities>character-entities": true, - "react-syntax-highlighter>refractor>parse-entities>character-entities-legacy": true, - "react-syntax-highlighter>refractor>parse-entities>character-reference-invalid": true, - "react-syntax-highlighter>refractor>parse-entities>is-alphanumerical": true, - "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, - "react-syntax-highlighter>refractor>parse-entities>is-hexadecimal": true + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp>vinyl-fs>glob-stream>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp-watch>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp>vinyl-fs>lazystream>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "browserify>module-deps>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "browserify>read-only-stream>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "browserify>module-deps>stream-combiner2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "labeled-stream-splicer>stream-splicer>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "browserify>browser-pack>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "vinyl>cloneable-readable>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "browserify>deps-sort>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "react-syntax-highlighter>refractor>parse-entities>is-alphanumerical": { - "packages": { - "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-alphabetical": true + "gulp-sort>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "readable-stream": { + "gulp-sourcemaps>through2>readable-stream>safe-buffer": { "builtin": { - "buffer.Buffer": true, - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.env.READABLE_STREAM": true, - "process.nextTick": true, - "process.stderr": true, - "process.stdout": true - }, - "packages": { - "browserify>string_decoder": true, - "pumpify>inherits": true, - "readable-stream>util-deprecate": true + "buffer": true } }, - "readable-stream-2>core-util-is": { - "globals": { - "Buffer.isBuffer": true + "browserify>insert-module-globals>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "readable-stream-2>process-nextick-args": { - "globals": { - "process": true + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "readable-stream>util-deprecate": { + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>safe-buffer": { "builtin": { - "util.deprecate": true + "buffer": true } }, - "resolve-url-loader>es6-iterator": { - "packages": { - "resolve-url-loader>es6-iterator>d": true, - "resolve-url-loader>es6-iterator>es5-ext": true, - "resolve-url-loader>es6-iterator>es6-symbol": true + "gulp>vinyl-fs>to-through>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "resolve-url-loader>es6-iterator>d": { - "packages": { - "resolve-url-loader>es6-iterator>d>type": true, - "resolve-url-loader>es6-iterator>es5-ext": true + "vinyl-source-stream>through2>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "resolve-url-loader>es6-iterator>es5-ext": { - "packages": { - "resolve-url-loader>es6-iterator>es6-symbol": true + "gulp>vinyl-fs>readable-stream>safe-buffer": { + "builtin": { + "buffer": true } }, - "resolve-url-loader>es6-iterator>es6-symbol": { - "packages": { - "resolve-url-loader>es6-iterator>d": true, - "resolve-url-loader>es6-iterator>es6-symbol>ext": true + "vinyl-buffer>bl>readable-stream>string_decoder>safe-buffer": { + "builtin": { + "buffer": true } }, - "resolve-url-loader>es6-iterator>es6-symbol>ext": { - "globals": { - "__global__": true + "browserify>browser-pack>through2>readable-stream>string_decoder>safe-buffer": { + "builtin": { + "buffer": true } }, - "resolve-url-loader>rework>css>source-map-resolve": { + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder>safe-buffer": { "builtin": { - "url.resolve": true - }, - "globals": { - "TextDecoder": true, - "setImmediate": true - }, - "packages": { - "gulp-sourcemaps>css>source-map-resolve>atob": true, - "gulp-sourcemaps>css>source-map-resolve>decode-uri-component": true, - "resolve-url-loader>rework>css>source-map-resolve>source-map-url": true, - "resolve-url-loader>rework>css>urix": true + "buffer": true } }, - "resolve-url-loader>rework>css>source-map-resolve>source-map-url": { - "globals": { - "define": true + "string.prototype.matchall>es-abstract>safe-regex-test": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>is-regex": true } }, - "resolve-url-loader>rework>css>urix": { - "builtin": { - "path.sep": true + "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex>ret": true } }, "sass": { @@ -7701,37 +7568,183 @@ "process.stderr.write": true }, "packages": { - "mocha>supports-color": true, "sass-embedded>@bufbuild/protobuf": true, "sass-embedded>buffer-builder": true, "sass-embedded>immutable": true, - "sass-embedded>varint": true, - "wait-on>rxjs": true + "wait-on>rxjs": true, + "mocha>supports-color": true, + "sass-embedded>varint": true } }, - "sass-embedded>@bufbuild/protobuf": { + "semver": { "globals": { - "TextDecoder": true, - "TextEncoder": true, - "__values": true, + "console.error": true, "process": true } }, - "sass-embedded>buffer-builder": { + "@babel/core>semver": { "globals": { - "Buffer": true + "console": true, + "process": true } }, - "sass-embedded>immutable": { + "@babel/eslint-parser>semver": { "globals": { "console": true, - "define": true + "process": true } }, - "semver": { + "@babel/core>@babel/helper-compilation-targets>semver": { + "globals": { + "console": true, + "process": true + } + }, + "@babel/preset-env>@babel/plugin-transform-private-methods>@babel/helper-create-class-features-plugin>semver": { + "globals": { + "console": true, + "process": true + } + }, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>semver": { + "globals": { + "console": true, + "process": true + } + }, + "@babel/preset-env>semver": { + "globals": { + "console": true, + "process": true + } + }, + "@babel/preset-env>babel-plugin-polyfill-corejs2>semver": { + "globals": { + "console": true, + "process": true + } + }, + "eslint-plugin-node>semver": { + "globals": { + "console": true, + "process": true + } + }, + "eslint-plugin-react>semver": { + "globals": { + "console": true, + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": { + "globals": { + "console": true, + "process": true + } + }, + "nyc>yargs>set-blocking": { + "globals": { + "process.stderr": true, + "process.stdout": true + } + }, + "string.prototype.matchall>call-bind>set-function-length": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>gopd": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true + } + }, + "string.prototype.matchall>regexp.prototype.flags>set-function-name": { + "packages": { + "string.prototype.matchall>define-properties>define-data-property": true, + "string.prototype.matchall>call-bind>es-errors": true, + "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, + "string.prototype.matchall>es-abstract>has-property-descriptors": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value>extend-shallow": true, + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, + "@babel/register>clone-deep>is-plain-object": true, + "gulp>gulp-cli>matchdep>micromatch>braces>split-string": true + } + }, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone": { + "packages": { + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>kind-of": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>lazy-cache": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object": true + } + }, + "browserify>shasum-object": { + "builtin": { + "crypto.createHash": true + }, + "globals": { + "Buffer.isBuffer": true + }, + "packages": { + "@metamask/rpc-errors>fast-safe-stringify": true + } + }, + "string.prototype.matchall>side-channel": { + "packages": { + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>get-intrinsic": true, + "string.prototype.matchall>es-abstract>object-inspect": true + } + }, + "nyc>signal-exit": { + "builtin": { + "assert.equal": true, + "events": true + }, + "globals": { + "process": true + } + }, + "stylelint>table>slice-ansi": { + "packages": { + "stylelint>table>slice-ansi>ansi-styles": true, + "stylelint>table>slice-ansi>astral-regex": true, + "stylelint>table>slice-ansi>is-fullwidth-code-point": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>define-property": true, + "gulp>gulp-cli>isobject": true, + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>braces>snapdragon-node>snapdragon-util>kind-of": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon": { + "builtin": { + "fs.readFileSync": true, + "path.dirname": true, + "util.inspect": true + }, "globals": { - "console.error": true, - "process": true + "__filename": true + }, + "packages": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>debug": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>extend-shallow": true, + "gulp>gulp-cli>liftoff>fined>parse-filepath>map-cache": true, + "resolve-url-loader>rework>css>source-map-resolve": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>source-map": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>use": true } }, "source-map": { @@ -7748,134 +7761,152 @@ "fetch": true } }, - "string.prototype.matchall": { - "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>es-abstract": true, - "string.prototype.matchall>has-symbols": true, - "string.prototype.matchall>regexp.prototype.flags": true + "postcss>source-map-js": { + "globals": { + "console": true } }, - "string.prototype.matchall>call-bind": { + "gulp-sourcemaps>css>source-map-resolve": { + "builtin": { + "path.sep": true, + "url.resolve": true + }, + "globals": { + "TextDecoder": true, + "setImmediate": true + }, "packages": { - "browserify>has>function-bind": true, - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>call-bind>set-function-length": true, - "string.prototype.matchall>get-intrinsic": true + "gulp-sourcemaps>css>source-map-resolve>atob": true, + "gulp-sourcemaps>css>source-map-resolve>decode-uri-component": true } }, - "string.prototype.matchall>call-bind>es-define-property": { + "resolve-url-loader>rework>css>source-map-resolve": { + "builtin": { + "url.resolve": true + }, + "globals": { + "TextDecoder": true, + "setImmediate": true + }, "packages": { - "string.prototype.matchall>get-intrinsic": true + "gulp-sourcemaps>css>source-map-resolve>atob": true, + "gulp-sourcemaps>css>source-map-resolve>decode-uri-component": true, + "resolve-url-loader>rework>css>source-map-resolve>source-map-url": true, + "resolve-url-loader>rework>css>urix": true } }, - "string.prototype.matchall>call-bind>set-function-length": { + "terser>source-map-support": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true + }, + "globals": { + "XMLHttpRequest": true, + "console.error": true, + "process": true + }, "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>gopd": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true, - "string.prototype.matchall>get-intrinsic": true + "terser>source-map-support>buffer-from": true, + "terser>source-map-support>source-map": true } }, - "string.prototype.matchall>define-properties": { - "packages": { - "@lavamoat/lavapack>json-stable-stringify>object-keys": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "resolve-url-loader>rework>css>source-map-resolve>source-map-url": { + "globals": { + "define": true } }, - "string.prototype.matchall>define-properties>define-data-property": { + "eslint-plugin-jsdoc>spdx-expression-parse": { "packages": { - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>gopd": true + "eslint-plugin-jsdoc>spdx-expression-parse>spdx-exceptions": true, + "eslint-plugin-jsdoc>spdx-expression-parse>spdx-license-ids": true } }, - "string.prototype.matchall>es-abstract": { - "packages": { - "depcheck>is-core-module>hasown": true, - "eslint-plugin-react>array-includes>is-string": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-define-property": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>es-object-atoms": true, - "string.prototype.matchall>es-abstract>es-set-tostringtag": true, - "string.prototype.matchall>es-abstract>es-to-primitive": true, - "string.prototype.matchall>es-abstract>gopd": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true, - "string.prototype.matchall>es-abstract>has-proto": true, - "string.prototype.matchall>es-abstract>is-callable": true, - "string.prototype.matchall>es-abstract>is-regex": true, - "string.prototype.matchall>es-abstract>object-inspect": true, - "string.prototype.matchall>es-abstract>safe-regex-test": true, - "string.prototype.matchall>es-abstract>string.prototype.trim": true, - "string.prototype.matchall>get-intrinsic": true, - "string.prototype.matchall>has-symbols": true, - "string.prototype.matchall>internal-slot": true + "stylelint>specificity": { + "globals": { + "define": true } }, - "string.prototype.matchall>es-abstract>es-object-atoms": { + "gulp>gulp-cli>matchdep>micromatch>braces>split-string": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true + "gulp-zip>plugin-error>extend-shallow": true } }, - "string.prototype.matchall>es-abstract>es-set-tostringtag": { + "gulp-livereload>event-stream>split": { + "builtin": { + "string_decoder.StringDecoder": true + }, "packages": { - "depcheck>is-core-module>hasown": true, - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>get-intrinsic": true + "debounce-stream>through": true } }, - "string.prototype.matchall>es-abstract>es-to-primitive": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend": { + "builtin": { + "util.inherits": true + }, "packages": { - "@metamask/eth-token-tracker>deep-equal>is-date-object": true, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": true, - "string.prototype.matchall>es-abstract>is-callable": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>define-property": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>class-utils>static-extend>object-copy": true } }, - "string.prototype.matchall>es-abstract>es-to-primitive>is-symbol": { + "browserify>module-deps>stream-combiner2": { "packages": { - "string.prototype.matchall>has-symbols": true + "browserify>duplexer2": true, + "browserify>module-deps>stream-combiner2>readable-stream": true } }, - "string.prototype.matchall>es-abstract>gopd": { + "gulp-livereload>event-stream>stream-combiner": { "packages": { - "string.prototype.matchall>get-intrinsic": true + "debounce-stream>duplexer": true } }, - "string.prototype.matchall>es-abstract>has-property-descriptors": { - "packages": { - "string.prototype.matchall>call-bind>es-define-property": true + "gulp>glob-watcher>async-done>stream-exhaust": { + "builtin": { + "stream.Writable": true, + "util.inherits": true + }, + "globals": { + "setImmediate": true } }, - "string.prototype.matchall>es-abstract>is-callable": { + "labeled-stream-splicer>stream-splicer": { "globals": { - "document": true + "process.nextTick": true, + "setImmediate": true + }, + "packages": { + "pumpify>inherits": true, + "labeled-stream-splicer>stream-splicer>readable-stream": true } }, - "string.prototype.matchall>es-abstract>is-regex": { + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width": { "packages": { - "koa>is-generator-function>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "gulp>gulp-cli>yargs>string-width>code-point-at": true, + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": true, + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": true } }, - "string.prototype.matchall>es-abstract>object-inspect": { - "builtin": { - "util.inspect": true - }, - "globals": { - "HTMLElement": true, - "WeakRef": true + "stylelint>table>string-width": { + "packages": { + "stylelint>table>string-width>emoji-regex": true, + "stylelint>table>slice-ansi>is-fullwidth-code-point": true, + "stylelint>table>string-width>strip-ansi": true } }, - "string.prototype.matchall>es-abstract>safe-regex-test": { + "yargs>string-width": { + "packages": { + "yargs>string-width>emoji-regex": true, + "yargs>string-width>is-fullwidth-code-point": true, + "eslint>strip-ansi": true + } + }, + "string.prototype.matchall": { "packages": { "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>is-regex": true + "string.prototype.matchall>define-properties": true, + "string.prototype.matchall>es-abstract": true, + "string.prototype.matchall>has-symbols": true, + "string.prototype.matchall>regexp.prototype.flags": true } }, "string.prototype.matchall>es-abstract>string.prototype.trim": { @@ -7886,821 +7917,684 @@ "string.prototype.matchall>es-abstract>es-object-atoms": true } }, - "string.prototype.matchall>get-intrinsic": { - "globals": { - "AggregateError": true, - "FinalizationRegistry": true, - "WeakRef": true - }, + "browserify>string_decoder": { "packages": { - "browserify>has>function-bind": true, - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>es-abstract>has-proto": true, - "string.prototype.matchall>has-symbols": true + "koa>content-disposition>safe-buffer": true } }, - "string.prototype.matchall>internal-slot": { + "gulp-livereload>tiny-lr>body>raw-body>string_decoder": { + "builtin": { + "buffer.Buffer": true + } + }, + "vinyl-buffer>bl>readable-stream>string_decoder": { "packages": { - "depcheck>is-core-module>hasown": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>side-channel": true + "vinyl-buffer>bl>readable-stream>string_decoder>safe-buffer": true } }, - "string.prototype.matchall>regexp.prototype.flags": { + "browserify>readable-stream>string_decoder": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties": true, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": true + "browserify>readable-stream>safe-buffer": true } }, - "string.prototype.matchall>regexp.prototype.flags>set-function-name": { + "browserify>concat-stream>readable-stream>string_decoder": { "packages": { - "string.prototype.matchall>call-bind>es-errors": true, - "string.prototype.matchall>define-properties>define-data-property": true, - "string.prototype.matchall>es-abstract>function.prototype.name>functions-have-names": true, - "string.prototype.matchall>es-abstract>has-property-descriptors": true + "browserify>concat-stream>readable-stream>safe-buffer": true } }, - "string.prototype.matchall>side-channel": { + "browserify>duplexer2>readable-stream>string_decoder": { "packages": { - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract>object-inspect": true, - "string.prototype.matchall>get-intrinsic": true + "browserify>duplexer2>readable-stream>safe-buffer": true } }, - "stylelint": { - "builtin": { - "fs.lstatSync": true, - "fs.readFile": true, - "fs.readFileSync": true, - "fs.stat": true, - "os.EOL": true, - "path.dirname": true, - "path.isAbsolute": true, - "path.join": true, - "path.normalize": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true, - "url.URL": true - }, - "globals": { - "__dirname": true, - "assert": true, - "console.warn": true, - "process.cwd": true, - "process.env.NODE_ENV": true, - "process.stdout.columns": true, - "process.stdout.isTTY": true - }, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>string_decoder": { + "packages": { + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream>readable-stream>safe-buffer": true + } + }, + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>string_decoder": { "packages": { - "chalk": true, - "del>slash": true, - "eslint>ignore": true, - "eslint>imurmurhash": true, - "fast-glob>micromatch": true, - "globby": true, - "lodash": true, - "mocha>log-symbols": true, - "nock>debug": true, - "nyc>resolve-from": true, - "stylelint>@stylelint/postcss-css-in-js": true, - "stylelint>@stylelint/postcss-markdown": true, - "stylelint>autoprefixer": true, - "stylelint>balanced-match": true, - "stylelint>cosmiconfig": true, - "stylelint>execall": true, - "stylelint>file-entry-cache": true, - "stylelint>global-modules": true, - "stylelint>globjoin": true, - "stylelint>html-tags": true, - "stylelint>import-lazy": true, - "stylelint>known-css-properties": true, - "stylelint>leven": true, - "stylelint>mathml-tag-names": true, - "stylelint>normalize-selector": true, - "stylelint>postcss": true, - "stylelint>postcss-html": true, - "stylelint>postcss-less": true, - "stylelint>postcss-media-query-parser": true, - "stylelint>postcss-reporter": true, - "stylelint>postcss-resolve-nested-selector": true, - "stylelint>postcss-safe-parser": true, - "stylelint>postcss-sass": true, - "stylelint>postcss-scss": true, - "stylelint>postcss-selector-parser": true, - "stylelint>postcss-syntax": true, - "stylelint>postcss-value-parser": true, - "stylelint>specificity": true, - "stylelint>style-search": true, - "stylelint>sugarss": true, - "stylelint>svg-tags": true, - "stylelint>table": true, - "stylelint>write-file-atomic": true, - "yargs>string-width": true + "gulp>vinyl-fs>lead>flush-write-stream>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-css-in-js": { - "globals": { - "__dirname": true - }, + "gulp>vinyl-fs>glob-stream>readable-stream>string_decoder": { "packages": { - "@babel/core": true, - "stylelint>postcss": true, - "stylelint>postcss-syntax": true + "gulp>vinyl-fs>glob-stream>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown": { + "gulp-watch>readable-stream>string_decoder": { "packages": { - "stylelint>@stylelint/postcss-markdown>remark": true, - "stylelint>@stylelint/postcss-markdown>unist-util-find-all-after": true, - "stylelint>postcss-html": true, - "stylelint>postcss-syntax": true + "gulp-watch>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark": { + "gulp>vinyl-fs>lazystream>readable-stream>string_decoder": { "packages": { - "react-markdown>unified": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify": true + "gulp>vinyl-fs>lazystream>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse": { + "browserify>module-deps>readable-stream>string_decoder": { "packages": { - "react-syntax-highlighter>refractor>parse-entities": true, - "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>ccount": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>collapse-white-space": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-alphabetical": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-whitespace-character": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-word-character": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>markdown-escapes": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>state-toggle": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>trim": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>trim-trailing-lines": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unherit": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unist-util-remove-position": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>vfile-location": true, - "watchify>xtend": true + "browserify>module-deps>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unherit": { + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>string_decoder": { "packages": { - "pumpify>inherits": true, - "watchify>xtend": true + "gulp>vinyl-fs>glob-stream>ordered-read-streams>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unist-util-remove-position": { + "browserify>read-only-stream>readable-stream>string_decoder": { "packages": { - "react-markdown>unist-util-visit": true + "browserify>read-only-stream>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify": { + "browserify>module-deps>stream-combiner2>readable-stream>string_decoder": { "packages": { - "react-syntax-highlighter>refractor>parse-entities": true, - "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>ccount": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>is-whitespace-character": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>markdown-escapes": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>state-toggle": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unherit": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>is-alphanumeric": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>longest-streak": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>markdown-table": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>mdast-util-compact": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>stringify-entities": true, - "watchify>xtend": true + "browserify>module-deps>stream-combiner2>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>markdown-table": { + "labeled-stream-splicer>stream-splicer>readable-stream>string_decoder": { "packages": { - "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true + "labeled-stream-splicer>stream-splicer>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>mdast-util-compact": { + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>string_decoder": { "packages": { - "react-markdown>unist-util-visit": true + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>stringify-entities": { + "browserify>browser-pack>through2>readable-stream>string_decoder": { "packages": { - "react-syntax-highlighter>refractor>parse-entities>character-entities-legacy": true, - "react-syntax-highlighter>refractor>parse-entities>is-alphanumerical": true, - "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, - "react-syntax-highlighter>refractor>parse-entities>is-hexadecimal": true, - "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>stringify-entities>character-entities-html4": true + "browserify>browser-pack>through2>readable-stream>string_decoder>safe-buffer": true } }, - "stylelint>@stylelint/postcss-markdown>unist-util-find-all-after": { + "vinyl>cloneable-readable>through2>readable-stream>string_decoder": { "packages": { - "stylelint>@stylelint/postcss-markdown>unist-util-find-all-after>unist-util-is": true + "vinyl>cloneable-readable>through2>readable-stream>safe-buffer": true } }, - "stylelint>autoprefixer": { - "globals": { - "console": true, - "process.cwd": true, - "process.env.AUTOPREFIXER_GRID": true - }, + "browserify>deps-sort>through2>readable-stream>string_decoder": { "packages": { - "autoprefixer>caniuse-lite": true, - "autoprefixer>normalize-range": true, - "browserslist": true, - "stylelint>autoprefixer>num2fraction": true, - "stylelint>postcss": true, - "stylelint>postcss-value-parser": true, - "stylelint>postcss>picocolors": true + "browserify>deps-sort>through2>readable-stream>safe-buffer": true } }, - "stylelint>cosmiconfig": { - "builtin": { - "fs": true, - "os": true, - "path": true - }, - "globals": { - "process.cwd": true - }, + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>string_decoder": { "packages": { - "depcheck>cosmiconfig>parse-json": true, - "eslint>@eslint/eslintrc>import-fresh": true, - "globby>dir-glob>path-type": true, - "stylelint>cosmiconfig>yaml": true + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream>safe-buffer": true } }, - "stylelint>cosmiconfig>yaml": { - "globals": { - "Buffer": true, - "YAML_SILENCE_DEPRECATION_WARNINGS": true, - "YAML_SILENCE_WARNINGS": true, - "atob": true, - "btoa": true, - "console.warn": true, - "process": true + "gulp-sort>through2>readable-stream>string_decoder": { + "packages": { + "gulp-sort>through2>readable-stream>safe-buffer": true } }, - "stylelint>execall": { + "gulp-sourcemaps>through2>readable-stream>string_decoder": { "packages": { - "stylelint>execall>clone-regexp": true + "gulp-sourcemaps>through2>readable-stream>safe-buffer": true } }, - "stylelint>execall>clone-regexp": { + "browserify>insert-module-globals>through2>readable-stream>string_decoder": { "packages": { - "stylelint>execall>clone-regexp>is-regexp": true + "browserify>insert-module-globals>through2>readable-stream>safe-buffer": true } }, - "stylelint>file-entry-cache": { - "builtin": { - "crypto.createHash": true, - "fs.readFileSync": true, - "fs.statSync": true, - "path.basename": true, - "path.dirname": true - }, + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder": { "packages": { - "stylelint>file-entry-cache>flat-cache": true + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream>string_decoder>safe-buffer": true } }, - "stylelint>file-entry-cache>flat-cache": { - "builtin": { - "fs.existsSync": true, - "fs.readFileSync": true, - "path.basename": true, - "path.dirname": true, - "path.resolve": true - }, - "globals": { - "__dirname": true - }, + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>string_decoder": { "packages": { - "stylelint>file-entry-cache>flat-cache>flatted": true, - "stylelint>file-entry-cache>flat-cache>rimraf": true, - "stylelint>file-entry-cache>flat-cache>write": true + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream>safe-buffer": true } }, - "stylelint>file-entry-cache>flat-cache>rimraf": { - "builtin": { - "assert": true, - "fs": true, - "path.join": true - }, - "globals": { - "process.platform": true, - "setTimeout": true - }, + "gulp>vinyl-fs>to-through>through2>readable-stream>string_decoder": { "packages": { - "nyc>glob": true + "gulp>vinyl-fs>to-through>through2>readable-stream>safe-buffer": true } }, - "stylelint>file-entry-cache>flat-cache>write": { - "builtin": { - "fs.createWriteStream": true, - "fs.writeFile": true, - "fs.writeFileSync": true, - "path.dirname": true - }, + "vinyl-source-stream>through2>readable-stream>string_decoder": { "packages": { - "mockttp>portfinder>mkdirp": true + "vinyl-source-stream>through2>readable-stream>safe-buffer": true } }, - "stylelint>global-modules": { - "builtin": { - "path.resolve": true - }, - "globals": { - "process.env.OSTYPE": true, - "process.platform": true - }, + "gulp>vinyl-fs>readable-stream>string_decoder": { "packages": { - "stylelint>global-modules>global-prefix": true + "gulp>vinyl-fs>readable-stream>safe-buffer": true } }, - "stylelint>global-modules>global-prefix": { - "builtin": { - "fs.readFileSync": true, - "fs.realpathSync": true, - "os.homedir": true, - "path.dirname": true, - "path.join": true, - "path.resolve": true - }, - "globals": { - "process.env.APPDATA": true, - "process.env.DESTDIR": true, - "process.env.OSTYPE": true, - "process.env.PREFIX": true, - "process.execPath": true, - "process.platform": true - }, + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>stringify-entities": { "packages": { - "stylelint>global-modules>global-prefix>ini": true, - "stylelint>global-modules>global-prefix>which": true + "stylelint>@stylelint/postcss-markdown>remark>remark-stringify>stringify-entities>character-entities-html4": true, + "react-syntax-highlighter>refractor>parse-entities>character-entities-legacy": true, + "react-syntax-highlighter>refractor>parse-entities>is-alphanumerical": true, + "react-syntax-highlighter>refractor>parse-entities>is-decimal": true, + "react-syntax-highlighter>refractor>parse-entities>is-hexadecimal": true } }, - "stylelint>global-modules>global-prefix>ini": { - "globals": { - "process": true + "postcss-discard-font-face>postcss>chalk>strip-ansi": { + "packages": { + "postcss-discard-font-face>postcss>chalk>strip-ansi>ansi-regex": true } }, - "stylelint>global-modules>global-prefix>which": { - "builtin": { - "path.join": true - }, - "globals": { - "process.cwd": true, - "process.env.OSTYPE": true, - "process.env.PATH": true, - "process.env.PATHEXT": true, - "process.platform": true - }, + "eslint>strip-ansi": { "packages": { - "@sentry/cli>which>isexe": true + "eslint>strip-ansi>ansi-regex": true } }, - "stylelint>globjoin": { - "builtin": { - "path.join": true + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": { + "packages": { + "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi>ansi-regex": true } }, - "stylelint>normalize-selector": { - "globals": { - "define": true + "stylelint>table>string-width>strip-ansi": { + "packages": { + "stylelint>table>string-width>strip-ansi>ansi-regex": true } }, - "stylelint>postcss": { - "builtin": { - "fs": true, - "path": true - }, - "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console": true, - "process.env.NODE_ENV": true - }, + "gulp-watch>vinyl-file>strip-bom-stream": { "packages": { - "stylelint>postcss>picocolors": true, - "stylelint>postcss>source-map": true + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": true, + "gulp-watch>vinyl-file>strip-bom": true } }, - "stylelint>postcss-html": { + "gulp-watch>vinyl-file>strip-bom": { "globals": { - "__dirname": true + "Buffer.isBuffer": true }, "packages": { - "stylelint>postcss-html>htmlparser2": true, - "stylelint>postcss-syntax": true + "gulp>vinyl-fs>remove-bom-buffer>is-utf8": true } }, - "stylelint>postcss-html>htmlparser2": { + "stylelint": { "builtin": { - "buffer.Buffer": true, - "events.EventEmitter": true, - "string_decoder.StringDecoder": true + "fs.lstatSync": true, + "fs.readFile": true, + "fs.readFileSync": true, + "fs.stat": true, + "os.EOL": true, + "path.dirname": true, + "path.isAbsolute": true, + "path.join": true, + "path.normalize": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true, + "url.URL": true + }, + "globals": { + "__dirname": true, + "assert": true, + "console.warn": true, + "process.cwd": true, + "process.env.NODE_ENV": true, + "process.stdout.columns": true, + "process.stdout.isTTY": true }, "packages": { - "pumpify>inherits": true, - "readable-stream": true, - "stylelint>postcss-html>htmlparser2>domelementtype": true, - "stylelint>postcss-html>htmlparser2>domhandler": true, - "stylelint>postcss-html>htmlparser2>domutils": true, - "stylelint>postcss-html>htmlparser2>entities": true - } - }, - "stylelint>postcss-html>htmlparser2>domhandler": { - "packages": { - "stylelint>postcss-html>htmlparser2>domelementtype": true + "stylelint>@stylelint/postcss-css-in-js": true, + "stylelint>@stylelint/postcss-markdown": true, + "stylelint>autoprefixer": true, + "stylelint>balanced-match": true, + "chalk": true, + "stylelint>cosmiconfig": true, + "nock>debug": true, + "stylelint>execall": true, + "stylelint>file-entry-cache": true, + "stylelint>global-modules": true, + "globby": true, + "stylelint>globjoin": true, + "stylelint>html-tags": true, + "eslint>ignore": true, + "stylelint>import-lazy": true, + "eslint>imurmurhash": true, + "stylelint>known-css-properties": true, + "stylelint>leven": true, + "lodash": true, + "mocha>log-symbols": true, + "stylelint>mathml-tag-names": true, + "fast-glob>micromatch": true, + "stylelint>normalize-selector": true, + "stylelint>postcss-html": true, + "stylelint>postcss-less": true, + "stylelint>postcss-media-query-parser": true, + "stylelint>postcss-reporter": true, + "stylelint>postcss-resolve-nested-selector": true, + "stylelint>postcss-safe-parser": true, + "stylelint>postcss-sass": true, + "stylelint>postcss-scss": true, + "stylelint>postcss-selector-parser": true, + "stylelint>postcss-syntax": true, + "stylelint>postcss-value-parser": true, + "stylelint>postcss": true, + "nyc>resolve-from": true, + "del>slash": true, + "stylelint>specificity": true, + "yargs>string-width": true, + "stylelint>style-search": true, + "stylelint>sugarss": true, + "stylelint>svg-tags": true, + "stylelint>table": true, + "stylelint>write-file-atomic": true } }, - "stylelint>postcss-html>htmlparser2>domutils": { + "stylelint>sugarss": { "packages": { - "stylelint>postcss-html>htmlparser2>domelementtype": true, - "stylelint>postcss-html>htmlparser2>domutils>dom-serializer": true + "stylelint>sugarss>postcss": true } }, - "stylelint>postcss-html>htmlparser2>domutils>dom-serializer": { - "packages": { - "stylelint>postcss-html>htmlparser2>domelementtype": true, - "stylelint>postcss-html>htmlparser2>entities": true + "superstruct": { + "globals": { + "console.warn": true, + "define": true } }, - "stylelint>postcss-less": { + "chalk>supports-color": { + "builtin": { + "os.release": true, + "tty.isatty": true + }, + "globals": { + "process.env": true, + "process.platform": true + }, "packages": { - "stylelint>postcss-less>postcss": true + "chalk>supports-color>has-flag": true } }, - "stylelint>postcss-less>postcss": { + "gulp-livereload>chalk>supports-color": { "builtin": { - "fs": true, - "path": true + "os.release": true }, "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console": true, - "process.env.NODE_ENV": true + "process.env": true, + "process.platform": true, + "process.stderr": true, + "process.stdout": true, + "process.versions.node.split": true }, "packages": { - "stylelint>postcss-less>postcss>picocolors": true, - "stylelint>postcss-less>postcss>source-map": true + "gulp-livereload>chalk>supports-color>has-flag": true } }, - "stylelint>postcss-less>postcss>picocolors": { + "postcss-discard-font-face>postcss>chalk>supports-color": { + "globals": { + "process.argv": true, + "process.env": true, + "process.platform": true, + "process.stdout": true + } + }, + "mocha>supports-color": { "builtin": { + "os.release": true, "tty.isatty": true }, "globals": { - "process.argv.includes": true, "process.env": true, "process.platform": true + }, + "packages": { + "chalk>supports-color>has-flag": true } }, - "stylelint>postcss-reporter": { + "postcss-discard-font-face>postcss>supports-color": { + "globals": { + "process": true + }, "packages": { - "lodash": true + "postcss-discard-font-face>postcss>supports-color>has-flag": true } }, - "stylelint>postcss-safe-parser": { + "browserify>syntax-error": { "packages": { - "stylelint>postcss-safe-parser>postcss": true + "browserify>syntax-error>acorn-node": true } }, - "stylelint>postcss-safe-parser>postcss": { - "builtin": { - "fs": true, - "path": true + "stylelint>table": { + "globals": { + "process.stdout.write": true }, + "packages": { + "eslint>ajv": true, + "lodash": true, + "stylelint>table>slice-ansi": true, + "stylelint>table>string-width": true + } + }, + "terser": { "globals": { "Buffer": true, "atob": true, "btoa": true, - "console": true, - "process.env.NODE_ENV": true + "console.log": true, + "console.warn": true, + "define": true, + "process": true }, "packages": { - "stylelint>postcss-safe-parser>postcss>picocolors": true, - "stylelint>postcss-safe-parser>postcss>source-map": true - } - }, - "stylelint>postcss-safe-parser>postcss>picocolors": { - "builtin": { - "tty.isatty": true - }, - "globals": { - "process.argv.includes": true, - "process.env": true, - "process.platform": true + "terser>@jridgewell/source-map": true, + "jsdom>acorn": true } }, - "stylelint>postcss-sass": { + "through2": { "packages": { - "stylelint>postcss-sass>gonzales-pe": true, - "stylelint>postcss-sass>postcss": true + "readable-stream": true } }, - "stylelint>postcss-sass>gonzales-pe": { - "globals": { - "console.error": true, - "define": true + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter": { + "packages": { + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2": true, + "watchify>xtend": true } }, - "stylelint>postcss-sass>postcss": { + "gulp-sourcemaps>@gulp-sourcemaps/identity-map>through2": { "builtin": { - "fs": true, - "path": true + "util.inherits": true }, "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console": true, - "process.env.NODE_ENV": true + "process.nextTick": true }, "packages": { - "stylelint>postcss-sass>postcss>picocolors": true, - "stylelint>postcss-sass>postcss>source-map": true + "readable-stream": true } }, - "stylelint>postcss-sass>postcss>picocolors": { + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2": { "builtin": { - "tty.isatty": true + "util.inherits": true }, "globals": { - "process.argv.includes": true, - "process.env": true, - "process.platform": true - } - }, - "stylelint>postcss-scss": { + "process.nextTick": true + }, "packages": { - "stylelint>postcss-scss>postcss": true + "gulp-sourcemaps>@gulp-sourcemaps/map-sources>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>postcss-scss>postcss": { + "bify-module-groups>through2": { "builtin": { - "fs": true, - "path": true + "util.inherits": true }, "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console": true, - "process.env.NODE_ENV": true + "process.nextTick": true }, "packages": { - "stylelint>postcss-scss>postcss>picocolors": true, - "stylelint>postcss-scss>postcss>source-map": true + "readable-stream": true } }, - "stylelint>postcss-scss>postcss>picocolors": { + "browserify>browser-pack>through2": { "builtin": { - "tty.isatty": true + "util.inherits": true }, "globals": { - "process.argv.includes": true, - "process.env": true, - "process.platform": true - } - }, - "stylelint>postcss-selector-parser": { + "process.nextTick": true + }, "packages": { - "readable-stream>util-deprecate": true, - "stylelint>postcss-selector-parser>cssesc": true + "browserify>browser-pack>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>postcss-syntax": { + "browserify>through2": { "builtin": { - "path.isAbsolute": true, - "path.resolve": true, - "path.sep": true + "util.inherits": true + }, + "globals": { + "process.nextTick": true }, "packages": { - "stylelint>postcss": true + "browserify>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>postcss>picocolors": { + "vinyl>cloneable-readable>through2": { "builtin": { - "tty.isatty": true + "util.inherits": true }, "globals": { - "process.argv.includes": true, - "process.env": true, - "process.platform": true + "process.nextTick": true + }, + "packages": { + "vinyl>cloneable-readable>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>specificity": { + "browserify>deps-sort>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "define": true - } - }, - "stylelint>sugarss": { + "process.nextTick": true + }, "packages": { - "stylelint>sugarss>postcss": true + "browserify>deps-sort>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>sugarss>postcss": { + "gulp>vinyl-fs>fs-mkdirp-stream>through2": { "builtin": { - "fs": true, - "path": true + "util.inherits": true }, "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console": true, - "process.env.NODE_ENV": true + "process.nextTick": true }, "packages": { - "stylelint>sugarss>postcss>picocolors": true, - "stylelint>sugarss>postcss>source-map": true + "gulp>vinyl-fs>fs-mkdirp-stream>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>sugarss>postcss>picocolors": { + "gulp-sort>through2": { "builtin": { - "tty.isatty": true + "util.inherits": true }, "globals": { - "process.argv.includes": true, - "process.env": true, - "process.platform": true + "process.nextTick": true + }, + "packages": { + "gulp-sort>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>table": { + "gulp-sourcemaps>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "process.stdout.write": true + "process.nextTick": true }, "packages": { - "eslint>ajv": true, - "lodash": true, - "stylelint>table>slice-ansi": true, - "stylelint>table>string-width": true + "gulp-sourcemaps>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>table>slice-ansi": { + "gulp-stylelint>through2": { + "builtin": { + "util.inherits": true + }, + "globals": { + "process.nextTick": true + }, "packages": { - "stylelint>table>slice-ansi>ansi-styles": true, - "stylelint>table>slice-ansi>astral-regex": true, - "stylelint>table>slice-ansi>is-fullwidth-code-point": true + "readable-stream": true } }, - "stylelint>table>slice-ansi>ansi-styles": { + "gulp-zip>through2": { + "builtin": { + "util.inherits": true + }, + "globals": { + "process.nextTick": true + }, "packages": { - "@metamask/jazzicon>color>color-convert": true + "readable-stream": true } }, - "stylelint>table>string-width": { + "browserify>insert-module-globals>through2": { + "builtin": { + "util.inherits": true + }, + "globals": { + "process.nextTick": true + }, "packages": { - "stylelint>table>slice-ansi>is-fullwidth-code-point": true, - "stylelint>table>string-width>emoji-regex": true, - "stylelint>table>string-width>strip-ansi": true + "browserify>insert-module-globals>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>table>string-width>strip-ansi": { + "browserify>module-deps>through2": { + "builtin": { + "util.inherits": true + }, + "globals": { + "process.nextTick": true + }, "packages": { - "stylelint>table>string-width>strip-ansi>ansi-regex": true + "browserify>module-deps>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>write-file-atomic": { + "gulp>vinyl-fs>remove-bom-stream>through2": { "builtin": { - "fs.chmod": true, - "fs.chmodSync": true, - "fs.chown": true, - "fs.chownSync": true, - "fs.close": true, - "fs.closeSync": true, - "fs.fsync": true, - "fs.fsyncSync": true, - "fs.open": true, - "fs.openSync": true, - "fs.realpath": true, - "fs.realpathSync": true, - "fs.rename": true, - "fs.renameSync": true, - "fs.stat": true, - "fs.statSync": true, - "fs.unlink": true, - "fs.unlinkSync": true, - "fs.write": true, - "fs.writeSync": true, - "path.resolve": true, - "util.promisify": true, - "worker_threads.threadId": true + "util.inherits": true }, "globals": { - "Buffer.isBuffer": true, - "__filename": true, - "process.getuid": true, - "process.pid": true + "process.nextTick": true }, "packages": { - "eslint>imurmurhash": true, - "nyc>signal-exit": true, - "stylelint>write-file-atomic>is-typedarray": true, - "stylelint>write-file-atomic>typedarray-to-buffer": true + "gulp>vinyl-fs>remove-bom-stream>through2>readable-stream": true, + "watchify>xtend": true } }, - "stylelint>write-file-atomic>typedarray-to-buffer": { + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "Buffer.from": true + "process.nextTick": true }, "packages": { - "stylelint>write-file-atomic>is-typedarray": true + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter>through2>readable-stream": true, + "watchify>xtend": true } }, - "superstruct": { + "gulp>vinyl-fs>to-through>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "console.warn": true, - "define": true + "process.nextTick": true + }, + "packages": { + "gulp>vinyl-fs>to-through>through2>readable-stream": true, + "watchify>xtend": true } }, - "terser": { + "vinyl-buffer>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "Buffer": true, - "atob": true, - "btoa": true, - "console.log": true, - "console.warn": true, - "define": true, - "process": true + "process.nextTick": true }, "packages": { - "jsdom>acorn": true, - "terser>@jridgewell/source-map": true + "vinyl-buffer>bl>readable-stream": true, + "watchify>xtend": true } }, - "terser-webpack-plugin>@jridgewell/trace-mapping": { + "gulp>vinyl-fs>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "define": true + "process.nextTick": true }, "packages": { - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/resolve-uri": true, - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": true + "gulp>vinyl-fs>readable-stream": true, + "watchify>xtend": true } }, - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/resolve-uri": { + "vinyl-source-stream>through2": { + "builtin": { + "util.inherits": true + }, "globals": { - "define": true + "process.nextTick": true + }, + "packages": { + "vinyl-source-stream>through2>readable-stream": true, + "watchify>xtend": true } }, - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": { + "debounce-stream>through": { + "builtin": { + "stream": true + }, "globals": { - "Buffer": true, - "TextDecoder": true, - "define": true + "process.nextTick": true } }, - "terser>@jridgewell/source-map": { + "gulp-sourcemaps>debug-fabulous>memoizee>timers-ext": { "packages": { - "terser-webpack-plugin>@jridgewell/trace-mapping": true, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true + "resolve-url-loader>es6-iterator>es5-ext": true } }, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping": { + "gulp-livereload>tiny-lr": { + "builtin": { + "events": true, + "fs": true, + "http": true, + "https": true, + "url.parse": true + }, "globals": { - "define": true + "console.error": true }, "packages": { - "terser-webpack-plugin>@jridgewell/trace-mapping": true, - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": true, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/set-array": true - } - }, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/set-array": { - "globals": { - "define": true + "gulp-livereload>tiny-lr>body": true, + "gulp-livereload>tiny-lr>debug": true, + "gulp-livereload>tiny-lr>faye-websocket": true, + "react>object-assign": true, + "@storybook/addon-knobs>qs": true } }, - "terser>source-map-support": { + "gulp>vinyl-fs>glob-stream>to-absolute-glob": { "builtin": { - "fs": true, - "path.dirname": true, "path.resolve": true }, "globals": { - "XMLHttpRequest": true, - "console.error": true, - "process": true + "process.cwd": true, + "process.platform": true }, "packages": { - "terser>source-map-support>buffer-from": true, - "terser>source-map-support>source-map": true + "gulp>gulp-cli>replace-homedir>is-absolute": true, + "gulp>glob-watcher>is-negated-glob": true } }, - "terser>source-map-support>buffer-from": { - "globals": { - "Buffer": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>to-object-path>kind-of": true } }, - "through2": { + "chokidar>braces>fill-range>to-regex-range": { "packages": { - "readable-stream": true + "chokidar>braces>fill-range>to-regex-range>is-number": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>to-regex-range": { + "packages": { + "gulp>glob-watcher>anymatch>micromatch>braces>fill-range>is-number": true, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>repeat-string": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>to-regex": { + "packages": { + "gulp>gulp-cli>matchdep>micromatch>to-regex>define-property": true, + "gulp-zip>plugin-error>extend-shallow": true, + "gulp>gulp-cli>matchdep>micromatch>regex-not": true, + "gulp>gulp-cli>matchdep>micromatch>to-regex>safe-regex": true + } + }, + "gulp>vinyl-fs>to-through": { + "packages": { + "gulp>vinyl-fs>to-through>through2": true } }, "ts-node": { @@ -8733,13 +8627,13 @@ "value": true }, "packages": { - "jsdom>acorn": true, "ts-node>@cspotcode/source-map-support": true, "ts-node>@tsconfig/node10": true, "ts-node>@tsconfig/node12": true, "ts-node>@tsconfig/node14": true, "ts-node>@tsconfig/node16": true, "ts-node>acorn-walk": true, + "jsdom>acorn": true, "ts-node>arg": true, "ts-node>create-require": true, "ts-node>diff": true, @@ -8748,63 +8642,195 @@ "ts-node>yn": true } }, - "ts-node>@cspotcode/source-map-support": { - "builtin": { - "fs": true, - "path.isAbsolute": true, - "path.join": true, - "path.normalize": true, - "path.resolve": true, - "url.fileURLToPath": true, - "url.pathToFileURL": true, - "util.inspect": true - }, - "globals": { - "Buffer.from": true, - "URL": true, - "XMLHttpRequest": true, - "console.error": true, - "process": true - }, + "eslint-plugin-import>tsconfig-paths": { + "builtin": { + "fs.existsSync": true, + "fs.lstatSync": true, + "fs.readFile": true, + "fs.readFileSync": true, + "fs.stat": true, + "fs.statSync": true, + "module._resolveFilename": true, + "module.builtinModules": true, + "path.dirname": true, + "path.isAbsolute": true, + "path.join": true, + "path.resolve": true + }, + "globals": { + "console.warn": true, + "process.argv.slice": true, + "process.cwd": true, + "process.env": true + }, + "packages": { + "eslint-plugin-import>tsconfig-paths>json5": true, + "wait-on>minimist": true, + "eslint-plugin-import>tsconfig-paths>strip-bom": true + } + }, + "tsutils": { + "packages": { + "tslib": true, + "typescript": true + } + }, + "eslint>levn>type-check": { + "packages": { + "eslint>levn>prelude-ls": true + } + }, + "stylelint>write-file-atomic>typedarray-to-buffer": { + "globals": { + "Buffer.from": true + }, + "packages": { + "stylelint>write-file-atomic>is-typedarray": true + } + }, + "typescript": { + "builtin": { + "buffer.Buffer": true, + "crypto": true, + "fs": true, + "inspector": true, + "module.findPnpApi": true, + "os.EOL": true, + "os.platform": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true, + "perf_hooks.PerformanceObserver": true, + "perf_hooks.performance": true + }, + "globals": { + "Intl.Collator": true, + "PerformanceObserver": true, + "__dirname": true, + "__filename": true, + "clearTimeout": true, + "console": true, + "gc": true, + "globalThis": true, + "onProfilerEvent": true, + "performance": true, + "process": true, + "setTimeout": true + }, + "packages": { + "terser>source-map-support": true + } + }, + "browserify>insert-module-globals>undeclared-identifiers": { + "packages": { + "browserify>syntax-error>acorn-node": true, + "browserify>insert-module-globals>undeclared-identifiers>get-assigned-identifiers": true, + "watchify>xtend": true + } + }, + "gulp>undertaker": { + "builtin": { + "assert": true, + "events.EventEmitter": true, + "util.inherits": true + }, + "globals": { + "process.env.UNDERTAKER_SETTLE": true, + "process.env.UNDERTAKER_TIME_RESOLUTION": true, + "process.hrtime": true + }, + "packages": { + "gulp>undertaker>arr-flatten": true, + "gulp>undertaker>arr-map": true, + "gulp>undertaker>bach": true, + "gulp>undertaker>collection-map": true, + "gulp>undertaker>es6-weak-map": true, + "gulp>undertaker>last-run": true, + "gulp>undertaker>object.defaults": true, + "gulp>undertaker>object.reduce": true, + "gulp>undertaker>undertaker-registry": true + } + }, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unherit": { + "packages": { + "pumpify>inherits": true, + "watchify>xtend": true + } + }, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript": { + "packages": { + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript>unicode-canonical-property-names-ecmascript": true, + "@babel/preset-env>@babel/plugin-transform-dotall-regex>@babel/helper-create-regexp-features-plugin>regexpu-core>unicode-match-property-ecmascript>unicode-property-aliases-ecmascript": true + } + }, + "react-markdown>unified": { + "packages": { + "react-markdown>unified>bail": true, + "react-markdown>unified>extend": true, + "react-markdown>unified>is-buffer": true, + "mocha>yargs-unparser>is-plain-obj": true, + "react-markdown>unified>trough": true, + "react-markdown>vfile": true + } + }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>union-value": { + "packages": { + "gulp-zip>plugin-error>arr-union": true, + "gulp>gulp-cli>array-sort>get-value": true, + "gulp-watch>anymatch>micromatch>object.omit>is-extendable": true, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>set-value": true + } + }, + "gulp>vinyl-fs>glob-stream>unique-stream": { + "packages": { + "@lavamoat/lavapack>json-stable-stringify": true, + "gulp>vinyl-fs>glob-stream>unique-stream>through2-filter": true + } + }, + "stylelint>@stylelint/postcss-markdown>unist-util-find-all-after": { + "packages": { + "stylelint>@stylelint/postcss-markdown>unist-util-find-all-after>unist-util-is": true + } + }, + "stylelint>@stylelint/postcss-markdown>remark>remark-parse>unist-util-remove-position": { + "packages": { + "react-markdown>unist-util-visit": true + } + }, + "react-markdown>unist-util-visit>unist-util-visit-parents": { + "packages": { + "react-markdown>unist-util-visit>unist-util-is": true + } + }, + "react-markdown>unist-util-visit": { "packages": { - "ts-node>@cspotcode/source-map-support>@jridgewell/trace-mapping": true + "react-markdown>unist-util-visit>unist-util-visit-parents": true } }, - "ts-node>@cspotcode/source-map-support>@jridgewell/trace-mapping": { - "globals": { - "define": true - }, + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value": { "packages": { - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/resolve-uri": true, - "terser-webpack-plugin>@jridgewell/trace-mapping>@jridgewell/sourcemap-codec": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>base>cache-base>unset-value>has-value": true, + "gulp>gulp-cli>isobject": true } }, - "ts-node>acorn-walk": { + "uri-js": { "globals": { "define": true } }, - "ts-node>arg": { - "globals": { - "process.argv.slice": true + "resolve-url-loader>rework>css>urix": { + "builtin": { + "path.sep": true } }, - "ts-node>create-require": { - "builtin": { - "fs.lstatSync": true, - "module.Module": true, - "module.createRequire": true, - "module.createRequireFromPath": true, - "path.dirname": true, - "path.join": true - }, - "globals": { - "process.cwd": true + "gulp>gulp-cli>matchdep>micromatch>snapdragon>use": { + "packages": { + "@babel/register>clone-deep>kind-of": true } }, - "ts-node>diff": { - "globals": { - "setTimeout": true + "readable-stream>util-deprecate": { + "builtin": { + "util.deprecate": true } }, "ts-node>v8-compile-cache-lib": { @@ -8832,48 +8858,26 @@ "process": true } }, - "tsutils": { + "react-markdown>vfile>vfile-message": { "packages": { - "tslib": true, - "typescript": true + "react-markdown>vfile>unist-util-stringify-position": true } }, - "typescript": { + "react-markdown>vfile": { "builtin": { - "buffer.Buffer": true, - "crypto": true, - "fs": true, - "inspector": true, - "module.findPnpApi": true, - "os.EOL": true, - "os.platform": true, + "path.basename": true, "path.dirname": true, + "path.extname": true, "path.join": true, - "path.resolve": true, - "perf_hooks.PerformanceObserver": true, - "perf_hooks.performance": true + "path.sep": true }, "globals": { - "Intl.Collator": true, - "PerformanceObserver": true, - "__dirname": true, - "__filename": true, - "clearTimeout": true, - "console": true, - "gc": true, - "globalThis": true, - "onProfilerEvent": true, - "performance": true, - "process": true, - "setTimeout": true + "process.cwd": true }, "packages": { - "terser>source-map-support": true - } - }, - "uri-js": { - "globals": { - "define": true + "react-markdown>vfile>is-buffer": true, + "react-markdown>vfile>replace-ext": true, + "react-markdown>vfile>vfile-message": true } }, "vinyl": { @@ -8891,9 +8895,9 @@ "process.cwd": true }, "packages": { - "vinyl>clone": true, "vinyl>clone-buffer": true, "vinyl>clone-stats": true, + "vinyl>clone": true, "vinyl>cloneable-readable": true, "vinyl>remove-trailing-separator": true, "vinyl>replace-ext": true @@ -8905,67 +8909,7 @@ "vinyl-buffer>through2": true } }, - "vinyl-buffer>bl": { - "builtin": { - "util.inherits": true - }, - "packages": { - "koa>content-disposition>safe-buffer": true, - "vinyl-buffer>bl>readable-stream": true - } - }, - "vinyl-buffer>bl>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true, - "vinyl-buffer>bl>readable-stream>isarray": true, - "vinyl-buffer>bl>readable-stream>safe-buffer": true, - "vinyl-buffer>bl>readable-stream>string_decoder": true - } - }, - "vinyl-buffer>bl>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "vinyl-buffer>bl>readable-stream>string_decoder": { - "packages": { - "vinyl-buffer>bl>readable-stream>string_decoder>safe-buffer": true - } - }, - "vinyl-buffer>bl>readable-stream>string_decoder>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "vinyl-buffer>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true - }, - "packages": { - "vinyl-buffer>bl>readable-stream": true, - "watchify>xtend": true - } - }, - "vinyl-source-stream": { + "gulp-watch>vinyl-file": { "builtin": { "path.resolve": true }, @@ -8973,163 +8917,103 @@ "process.cwd": true }, "packages": { - "vinyl": true, - "vinyl-source-stream>through2": true + "del>graceful-fs": true, + "gulp-watch>vinyl-file>pify": true, + "gh-pages>globby>pinkie-promise": true, + "gulp-watch>vinyl-file>strip-bom-stream": true, + "gulp-watch>vinyl-file>strip-bom": true, + "gulp-watch>vinyl-file>vinyl": true } }, - "vinyl-source-stream>through2": { + "gulp>vinyl-fs": { "builtin": { + "os.platform": true, + "path.relative": true, + "path.resolve": true, "util.inherits": true }, "globals": { + "Buffer.isBuffer": true, + "process.cwd": true, + "process.geteuid": true, + "process.getuid": true, "process.nextTick": true }, "packages": { - "vinyl-source-stream>through2>readable-stream": true, - "watchify>xtend": true - } - }, - "vinyl-source-stream>through2>readable-stream": { - "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true - }, - "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true - }, - "packages": { - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream-2>process-nextick-args": true, - "readable-stream>util-deprecate": true, - "vinyl-source-stream>through2>readable-stream>isarray": true, - "vinyl-source-stream>through2>readable-stream>safe-buffer": true, - "vinyl-source-stream>through2>readable-stream>string_decoder": true - } - }, - "vinyl-source-stream>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true - } - }, - "vinyl-source-stream>through2>readable-stream>string_decoder": { - "packages": { - "vinyl-source-stream>through2>readable-stream>safe-buffer": true - } - }, - "vinyl-sourcemaps-apply": { - "packages": { - "vinyl-sourcemaps-apply>source-map": true - } - }, - "vinyl>clone": { - "globals": { - "Buffer": true - } - }, - "vinyl>clone-buffer": { - "builtin": { - "buffer.Buffer": true - } - }, - "vinyl>clone-stats": { - "builtin": { - "fs.Stats": true - } - }, - "vinyl>cloneable-readable": { - "packages": { - "pumpify>inherits": true, - "vinyl>cloneable-readable>process-nextick-args": true, - "vinyl>cloneable-readable>through2": true - } - }, - "vinyl>cloneable-readable>process-nextick-args": { - "globals": { - "process.nextTick": true, - "process.version": true + "gulp>vinyl-fs>fs-mkdirp-stream": true, + "gulp>vinyl-fs>glob-stream": true, + "del>graceful-fs": true, + "gulp>vinyl-fs>is-valid-glob": true, + "gulp>vinyl-fs>lazystream": true, + "gulp>vinyl-fs>lead": true, + "gulp>vinyl-fs>object.assign": true, + "gulp>vinyl-fs>pumpify": true, + "gulp>vinyl-fs>readable-stream": true, + "gulp>vinyl-fs>remove-bom-buffer": true, + "gulp>vinyl-fs>remove-bom-stream": true, + "gulp>vinyl-fs>resolve-options": true, + "gulp>vinyl-fs>through2": true, + "gulp>vinyl-fs>to-through": true, + "gulp>vinyl-fs>value-or-function": true, + "vinyl": true, + "gulp>vinyl-fs>vinyl-sourcemap": true } }, - "vinyl>cloneable-readable>through2": { + "vinyl-source-stream": { "builtin": { - "util.inherits": true + "path.resolve": true }, "globals": { - "process.nextTick": true + "process.cwd": true }, "packages": { - "vinyl>cloneable-readable>through2>readable-stream": true, - "watchify>xtend": true + "vinyl-source-stream>through2": true, + "vinyl": true } }, - "vinyl>cloneable-readable>through2>readable-stream": { + "gulp>vinyl-fs>vinyl-sourcemap": { "builtin": { - "events.EventEmitter": true, - "stream": true, - "util": true + "path.dirname": true, + "path.join": true, + "path.relative": true, + "path.resolve": true }, "globals": { - "process.browser": true, - "process.env.READABLE_STREAM": true, - "process.stderr": true, - "process.stdout": true, - "process.version.slice": true, - "setImmediate": true + "Buffer": true }, "packages": { - "pumpify>inherits": true, - "readable-stream-2>core-util-is": true, - "readable-stream>util-deprecate": true, - "vinyl>cloneable-readable>through2>readable-stream>isarray": true, - "vinyl>cloneable-readable>through2>readable-stream>process-nextick-args": true, - "vinyl>cloneable-readable>through2>readable-stream>safe-buffer": true, - "vinyl>cloneable-readable>through2>readable-stream>string_decoder": true - } - }, - "vinyl>cloneable-readable>through2>readable-stream>process-nextick-args": { - "globals": { - "process": true - } - }, - "vinyl>cloneable-readable>through2>readable-stream>safe-buffer": { - "builtin": { - "buffer": true + "gulp>vinyl-fs>vinyl-sourcemap>append-buffer": true, + "nyc>convert-source-map": true, + "del>graceful-fs": true, + "gulp-watch>anymatch>normalize-path": true, + "gulp>vinyl-fs>vinyl-sourcemap>now-and-later": true, + "gulp>vinyl-fs>remove-bom-buffer": true, + "vinyl": true } }, - "vinyl>cloneable-readable>through2>readable-stream>string_decoder": { + "vinyl-sourcemaps-apply": { "packages": { - "vinyl>cloneable-readable>through2>readable-stream>safe-buffer": true - } - }, - "vinyl>remove-trailing-separator": { - "globals": { - "process.platform": true + "vinyl-sourcemaps-apply>source-map": true } }, - "vinyl>replace-ext": { + "gulp-watch>vinyl-file>vinyl": { "builtin": { + "buffer.Buffer": true, "path.basename": true, "path.dirname": true, "path.extname": true, "path.join": true, - "path.sep": true - } - }, - "wait-on>rxjs": { + "path.relative": true, + "stream.PassThrough": true, + "stream.Stream": true + }, "globals": { - "cancelAnimationFrame": true, - "clearInterval": true, - "clearTimeout": true, - "performance": true, - "requestAnimationFrame": true, - "setInterval.apply": true, - "setTimeout.apply": true + "process.cwd": true + }, + "packages": { + "gulp-watch>vinyl-file>vinyl>clone-stats": true, + "@metamask/jazzicon>color>clone": true, + "gulp-watch>vinyl-file>vinyl>replace-ext": true } }, "watchify": { @@ -9141,8 +9025,8 @@ "setTimeout": true }, "packages": { - "chokidar": true, "chokidar>anymatch": true, + "chokidar": true, "through2": true, "watchify>xtend": true } @@ -9160,20 +9044,93 @@ "process.version": true }, "packages": { - "koa>content-disposition>safe-buffer": true, "webpack-dev-server>sockjs>websocket-driver>http-parser-js": true, + "koa>content-disposition>safe-buffer": true, "webpack-dev-server>sockjs>websocket-driver>websocket-extensions": true } }, - "webpack-dev-server>sockjs>websocket-driver>http-parser-js": { + "stylelint>global-modules>global-prefix>which": { "builtin": { - "assert.equal": true, - "assert.ok": true + "path.join": true + }, + "globals": { + "process.cwd": true, + "process.env.OSTYPE": true, + "process.env.PATH": true, + "process.env.PATHEXT": true, + "process.platform": true + }, + "packages": { + "@sentry/cli>which>isexe": true } }, - "webpack>json-parse-even-better-errors": { + "@storybook/react>@storybook/node-logger>npmlog>gauge>wide-align": { + "packages": { + "yargs>string-width": true + } + }, + "yargs>cliui>wrap-ansi": { + "packages": { + "chalk>ansi-styles": true, + "yargs>string-width": true, + "eslint>strip-ansi": true + } + }, + "stylelint>write-file-atomic": { + "builtin": { + "fs.chmod": true, + "fs.chmodSync": true, + "fs.chown": true, + "fs.chownSync": true, + "fs.close": true, + "fs.closeSync": true, + "fs.fsync": true, + "fs.fsyncSync": true, + "fs.open": true, + "fs.openSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.rename": true, + "fs.renameSync": true, + "fs.stat": true, + "fs.statSync": true, + "fs.unlink": true, + "fs.unlinkSync": true, + "fs.write": true, + "fs.writeSync": true, + "path.resolve": true, + "util.promisify": true, + "worker_threads.threadId": true + }, "globals": { - "Buffer.isBuffer": true + "Buffer.isBuffer": true, + "__filename": true, + "process.getuid": true, + "process.pid": true + }, + "packages": { + "eslint>imurmurhash": true, + "stylelint>write-file-atomic>is-typedarray": true, + "nyc>signal-exit": true, + "stylelint>write-file-atomic>typedarray-to-buffer": true + } + }, + "stylelint>file-entry-cache>flat-cache>write": { + "builtin": { + "fs.createWriteStream": true, + "fs.writeFile": true, + "fs.writeFileSync": true, + "path.dirname": true + }, + "packages": { + "mockttp>portfinder>mkdirp": true + } + }, + "yargs>y18n": { + "builtin": { + "fs": true, + "path": true, + "util": true } }, "yaml": { @@ -9187,6 +9144,28 @@ "process": true } }, + "stylelint>cosmiconfig>yaml": { + "globals": { + "Buffer": true, + "YAML_SILENCE_DEPRECATION_WARNINGS": true, + "YAML_SILENCE_WARNINGS": true, + "atob": true, + "btoa": true, + "console.warn": true, + "process": true + } + }, + "gulp-postcss>postcss-load-config>yaml": { + "globals": { + "Buffer": true, + "YAML_SILENCE_DEPRECATION_WARNINGS": true, + "YAML_SILENCE_WARNINGS": true, + "atob": true, + "btoa": true, + "console.warn": true, + "process": true + } + }, "yargs": { "builtin": { "assert": true, @@ -9201,13 +9180,13 @@ "process": true }, "packages": { - "yargs-parser": true, "yargs>cliui": true, "yargs>escalade": true, "yargs>get-caller-file": true, "yargs>require-directory": true, "yargs>string-width": true, - "yargs>y18n": true + "yargs>y18n": true, + "yargs-parser": true } }, "yargs-parser": { @@ -9221,62 +9200,34 @@ "process": true } }, - "yargs>cliui": { - "globals": { - "process": true - }, - "packages": { - "eslint>strip-ansi": true, - "yargs>cliui>wrap-ansi": true, - "yargs>string-width": true - } - }, - "yargs>cliui>wrap-ansi": { - "packages": { - "chalk>ansi-styles": true, - "eslint>strip-ansi": true, - "yargs>string-width": true - } - }, - "yargs>escalade": { - "builtin": { - "fs.readdirSync": true, - "fs.statSync": true, - "path.dirname": true, - "path.resolve": true - } - }, - "yargs>require-directory": { - "builtin": { - "fs.readdirSync": true, - "fs.statSync": true, - "path.dirname": true, - "path.join": true, - "path.resolve": true - } - }, - "yargs>string-width": { - "packages": { - "eslint>strip-ansi": true, - "yargs>string-width>emoji-regex": true, - "yargs>string-width>is-fullwidth-code-point": true - } - }, - "yargs>y18n": { + "yargs>yargs-parser": { "builtin": { "fs": true, "path": true, "util": true + }, + "globals": { + "process": true } }, - "yargs>yargs-parser": { + "gulp-zip>yazl": { "builtin": { - "fs": true, - "path": true, - "util": true + "events.EventEmitter": true, + "fs.createReadStream": true, + "fs.stat": true, + "stream.PassThrough": true, + "stream.Transform": true, + "util.inherits": true, + "zlib.DeflateRaw": true, + "zlib.deflateRaw": true }, "globals": { - "process": true + "Buffer": true, + "setImmediate": true, + "utf8FileName.length": true + }, + "packages": { + "gulp-zip>yazl>buffer-crc32": true } } } diff --git a/package.json b/package.json index 446133b81a48..261ddd874484 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,8 @@ "update-mock-cdn": "node test/e2e/mock-cdn/update-mock-cdn-files.js", "attributions:check": "./development/attributions-check.sh", "attributions:generate": "./development/generate-attributions.sh", - "ci-rerun-from-failed": "tsx .circleci/scripts/rerun-ci-workflow-from-failed.ts" + "ci-rerun-from-failed": "tsx .circleci/scripts/rerun-ci-workflow-from-failed.ts", + "git-diff-default-branch": "tsx .circleci/scripts/git-diff-default-branch.ts" }, "resolutions": { "chokidar": "^3.6.0", @@ -224,7 +225,7 @@ "semver@7.3.8": "^7.5.4", "@trezor/schema-utils@npm:1.0.2": "patch:@trezor/schema-utils@npm%3A1.0.2#~/.yarn/patches/@trezor-schema-utils-npm-1.0.2-7dd48689b2.patch", "lavamoat-core@npm:^15.1.1": "patch:lavamoat-core@npm%3A15.1.1#~/.yarn/patches/lavamoat-core-npm-15.1.1-51fbe39988.patch", - "@metamask/snaps-sdk": "^6.12.0", + "@metamask/snaps-sdk": "^6.13.0", "@swc/types@0.1.5": "^0.1.6", "@babel/core": "patch:@babel/core@npm%3A7.25.9#~/.yarn/patches/@babel-core-npm-7.25.9-4ae3bff7f3.patch", "@babel/runtime": "patch:@babel/runtime@npm%3A7.25.9#~/.yarn/patches/@babel-runtime-npm-7.25.9-fe8c62510a.patch", @@ -236,9 +237,7 @@ "@expo/config-plugins/glob": "^10.3.10", "@solana/web3.js/rpc-websockets": "^8.0.1", "@metamask/nonce-tracker@npm:^5.0.0": "patch:@metamask/nonce-tracker@npm%3A5.0.0#~/.yarn/patches/@metamask-nonce-tracker-npm-5.0.0-d81478218e.patch", - "@metamask/network-controller@npm:^17.0.0": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", - "@metamask/network-controller@npm:^19.0.0": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", - "@metamask/network-controller@npm:^20.0.0": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", + "@metamask/network-controller@npm:^22.0.2": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", "path-to-regexp": "1.9.0", "@ledgerhq/cryptoassets-evm-signatures/axios": "^0.28.0", "@ledgerhq/domain-service/axios": "^0.28.0", @@ -246,11 +245,12 @@ "@ledgerhq/hw-app-eth/axios": "^0.28.0", "@ledgerhq/hw-app-eth@npm:^6.39.0": "patch:@ledgerhq/hw-app-eth@npm%3A6.39.0#~/.yarn/patches/@ledgerhq-hw-app-eth-npm-6.39.0-866309bbbe.patch", "@ledgerhq/evm-tools@npm:^1.2.3": "patch:@ledgerhq/evm-tools@npm%3A1.2.3#~/.yarn/patches/@ledgerhq-evm-tools-npm-1.2.3-414f44baa9.patch", + "cross-spawn@npm:^5.0.1": "^7.0.6", + "@solana/web3.js@npm:^1.95.0": "^1.95.8", "secp256k1@npm:^4.0.0": "4.0.4", "secp256k1@npm:^4.0.1": "4.0.4", "secp256k1@npm:4.0.2": "4.0.4", - "secp256k1@npm:4.0.3": "4.0.4", - "cross-spawn@npm:^5.0.1": "^7.0.5" + "secp256k1@npm:4.0.3": "4.0.4" }, "dependencies": { "@babel/runtime": "patch:@babel/runtime@npm%3A7.25.9#~/.yarn/patches/@babel-runtime-npm-7.25.9-fe8c62510a.patch", @@ -281,8 +281,8 @@ "@metamask-institutional/transaction-update": "^0.2.6", "@metamask-institutional/types": "^1.2.0", "@metamask/abi-utils": "^2.0.2", - "@metamask/account-watcher": "^4.1.1", - "@metamask/accounts-controller": "^20.0.0", + "@metamask/account-watcher": "^4.1.2", + "@metamask/accounts-controller": "^20.0.2", "@metamask/address-book-controller": "^6.0.0", "@metamask/announcement-controller": "^7.0.0", "@metamask/approval-controller": "^7.0.0", @@ -292,62 +292,65 @@ "@metamask/browser-passworder": "^4.3.0", "@metamask/contract-metadata": "^2.5.0", "@metamask/controller-utils": "^11.4.0", - "@metamask/design-tokens": "^4.0.0", - "@metamask/ens-controller": "^14.0.0", + "@metamask/design-tokens": "^4.2.0", + "@metamask/ens-controller": "^15.0.0", "@metamask/ens-resolver-snap": "^0.1.2", "@metamask/eth-json-rpc-filters": "^9.0.0", - "@metamask/eth-json-rpc-middleware": "^15.0.0", + "@metamask/eth-json-rpc-middleware": "^15.0.1", "@metamask/eth-ledger-bridge-keyring": "^5.0.1", "@metamask/eth-query": "^4.0.0", "@metamask/eth-sig-util": "^7.0.1", - "@metamask/eth-snap-keyring": "^5.0.1", + "@metamask/eth-snap-keyring": "^7.0.0", "@metamask/eth-token-tracker": "^9.0.0", "@metamask/eth-trezor-keyring": "^3.1.3", "@metamask/etherscan-link": "^3.0.0", "@metamask/ethjs": "^0.6.0", "@metamask/ethjs-contract": "^0.4.1", "@metamask/ethjs-query": "^0.7.1", - "@metamask/gas-fee-controller": "^21.0.0", + "@metamask/gas-fee-controller": "^22.0.1", "@metamask/jazzicon": "^2.0.0", "@metamask/json-rpc-engine": "^10.0.0", "@metamask/json-rpc-middleware-stream": "^8.0.4", - "@metamask/keyring-api": "^10.1.0", - "@metamask/keyring-controller": "^19.0.0", + "@metamask/keyring-api": "^12.0.0", + "@metamask/keyring-controller": "^19.0.2", + "@metamask/keyring-internal-api": "^1.0.0", + "@metamask/keyring-snap-client": "^1.0.0", "@metamask/logging-controller": "^6.0.0", "@metamask/logo": "^3.1.2", "@metamask/message-manager": "^11.0.0", - "@metamask/message-signing-snap": "^0.4.0", + "@metamask/message-signing-snap": "^0.6.0", "@metamask/metamask-eth-abis": "^3.1.1", "@metamask/name-controller": "^8.0.0", - "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", - "@metamask/notification-services-controller": "^0.14.0", + "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A22.1.1#~/.yarn/patches/@metamask-network-controller-npm-22.1.1-09b6510f1e.patch", + "@metamask/notification-services-controller": "^0.15.0", "@metamask/object-multiplex": "^2.0.0", "@metamask/obs-store": "^9.0.0", "@metamask/permission-controller": "^11.0.0", "@metamask/permission-log-controller": "^3.0.1", "@metamask/phishing-controller": "^12.3.0", - "@metamask/polling-controller": "^11.0.0", + "@metamask/polling-controller": "^12.0.1", "@metamask/post-message-stream": "^8.0.0", - "@metamask/ppom-validator": "0.35.1", + "@metamask/ppom-validator": "0.36.0", "@metamask/preinstalled-example-snap": "^0.2.0", - "@metamask/profile-sync-controller": "^2.0.0", + "@metamask/profile-sync-controller": "^3.1.1", "@metamask/providers": "^18.2.0", "@metamask/queued-request-controller": "^7.0.1", "@metamask/rate-limit-controller": "^6.0.0", + "@metamask/remote-feature-flag-controller": "^1.1.0", "@metamask/rpc-errors": "^7.0.0", "@metamask/safe-event-emitter": "^3.1.1", "@metamask/scure-bip39": "^2.0.3", - "@metamask/selected-network-controller": "^18.0.2", + "@metamask/selected-network-controller": "^19.0.0", "@metamask/signature-controller": "^23.1.0", "@metamask/smart-transactions-controller": "^15.0.0", - "@metamask/snaps-controllers": "^9.14.0", + "@metamask/snaps-controllers": "^9.15.0", "@metamask/snaps-execution-environments": "^6.10.0", - "@metamask/snaps-rpc-methods": "^11.6.0", - "@metamask/snaps-sdk": "^6.12.0", - "@metamask/snaps-utils": "^8.6.0", - "@metamask/solana-wallet-snap": "^0.1.9", - "@metamask/transaction-controller": "^40.1.0", - "@metamask/user-operation-controller": "^16.0.0", + "@metamask/snaps-rpc-methods": "^11.7.0", + "@metamask/snaps-sdk": "^6.13.0", + "@metamask/snaps-utils": "^8.6.1", + "@metamask/solana-wallet-snap": "^1.0.3", + "@metamask/transaction-controller": "^42.0.0", + "@metamask/user-operation-controller": "^19.0.0", "@metamask/utils": "^10.0.1", "@ngraveio/bc-ur": "^1.1.12", "@noble/hashes": "^1.3.3", @@ -397,7 +400,7 @@ "loglevel": "^1.8.1", "lottie-web": "^5.12.2", "luxon": "^3.2.1", - "nanoid": "^2.1.6", + "nanoid": "^3.3.8", "pify": "^5.0.0", "promise-to-callback": "^1.0.0", "prop-types": "^15.6.1", @@ -425,7 +428,7 @@ "redux": "^4.0.5", "redux-thunk": "^2.3.0", "remove-trailing-slash": "^0.1.1", - "reselect": "^3.0.1", + "reselect": "^5.1.1", "ses": "^1.1.0", "simple-git": "^3.20.0", "single-call-balance-checker-abi": "^1.0.0", @@ -449,9 +452,9 @@ "@babel/preset-typescript": "^7.25.9", "@babel/register": "^7.25.9", "@jest/globals": "^29.7.0", - "@lavamoat/allow-scripts": "^3.0.4", + "@lavamoat/allow-scripts": "^3.3.1", "@lavamoat/lavadome-core": "0.0.10", - "@lavamoat/lavapack": "^6.1.0", + "@lavamoat/lavapack": "^7.0.5", "@lgbot/madge": "^6.2.0", "@lydell/node-pty": "^1.0.1", "@metamask/api-specs": "^0.9.3", @@ -466,7 +469,7 @@ "@metamask/eth-json-rpc-provider": "^4.1.6", "@metamask/forwarder": "^1.1.0", "@metamask/phishing-warning": "^4.1.0", - "@metamask/preferences-controller": "^14.0.0", + "@metamask/preferences-controller": "^15.0.1", "@metamask/test-bundler": "^1.0.0", "@metamask/test-dapp": "8.13.0", "@octokit/core": "^3.6.0", @@ -554,7 +557,6 @@ "concurrently": "^8.2.2", "copy-webpack-plugin": "^12.0.2", "core-js-pure": "^3.38.0", - "cross-spawn": "^7.0.5", "crypto-browserify": "^3.12.0", "css-loader": "^6.10.0", "css-to-xpath": "^0.1.0", @@ -609,8 +611,8 @@ "jsdom": "^16.7.0", "json-schema-to-ts": "^3.0.1", "koa": "^2.7.0", - "lavamoat": "^8.0.2", - "lavamoat-browserify": "^17.0.4", + "lavamoat": "^9.0.5", + "lavamoat-browserify": "^18.1.2", "lavamoat-viz": "^7.0.5", "level": "^8.0.1", "lockfile-lint": "^4.10.6", @@ -760,7 +762,8 @@ "resolve-url-loader>es6-iterator>d>es5-ext>esniff>es5-ext": false, "level>classic-level": false, "jest-preview": false, - "@metamask/solana-wallet-snap>@solana/web3.js>bigint-buffer": false + "@metamask/solana-wallet-snap>@solana/web3.js>bigint-buffer": false, + "@lavamoat/allow-scripts>@lavamoat/preinstall-always-fail": false } }, "packageManager": "yarn@4.5.1" diff --git a/privacy-snapshot.json b/privacy-snapshot.json index 8ae10de304df..fc5dafb7333c 100644 --- a/privacy-snapshot.json +++ b/privacy-snapshot.json @@ -16,6 +16,7 @@ "cdn.segment.io", "cdnjs.cloudflare.com", "chainid.network", + "client-config.api.cx.metamask.io", "client-side-detection.api.cx.metamask.io", "configuration.dev.metamask-institutional.io", "configuration.metamask-institutional.io", @@ -45,10 +46,10 @@ "on-ramp-content.uat-api.cx.metamask.io", "phishing-detection.api.cx.metamask.io", "portfolio.metamask.io", + "price-api.metamask-institutional.io", "price.api.cx.metamask.io", "proxy.api.cx.metamask.io", "proxy.dev-api.cx.metamask.io", - "signature-insights.api.cx.metamask.io", "raw.githubusercontent.com", "registry.npmjs.org", "responsive-rpc.test", @@ -56,6 +57,7 @@ "security-alerts.dev-api.cx.metamask.io", "sentry.io", "sepolia.infura.io", + "signature-insights.api.cx.metamask.io", "snaps.metamask.io", "sourcify.dev", "start.metamask.io", @@ -71,6 +73,6 @@ "unresponsive-rpc.test", "unresponsive-rpc.url", "user-storage.api.cx.metamask.io", - "www.4byte.directory", - "verify.walletconnect.com" + "verify.walletconnect.com", + "www.4byte.directory" ] diff --git a/shared/constants/app-state.ts b/shared/constants/app-state.ts index 82424edfe57f..b66dd153cb54 100644 --- a/shared/constants/app-state.ts +++ b/shared/constants/app-state.ts @@ -18,3 +18,13 @@ export const ACCOUNT_OVERVIEW_TAB_KEY_TO_TRACE_NAME_MAP = { [AccountOverviewTabKey.Nfts]: TraceName.AccountOverviewNftsTab, [AccountOverviewTabKey.Activity]: TraceName.AccountOverviewActivityTab, } as const; + +export type CarouselSlide = { + id: string; + title: string; + description: string; + image: string; + dismissed?: boolean; + href?: string; + undismissable?: boolean; +}; diff --git a/shared/constants/bridge.ts b/shared/constants/bridge.ts index 8ad27dce4944..ef7cb7f8a785 100644 --- a/shared/constants/bridge.ts +++ b/shared/constants/bridge.ts @@ -1,4 +1,4 @@ -import { CHAIN_IDS } from './network'; +import { CHAIN_IDS, NETWORK_TO_NAME_MAP } from './network'; // TODO read from feature flags export const ALLOWED_BRIDGE_CHAIN_IDS = [ @@ -29,4 +29,21 @@ export const METABRIDGE_ETHEREUM_ADDRESS = export const BRIDGE_QUOTE_MAX_ETA_SECONDS = 60 * 60; // 1 hour export const BRIDGE_QUOTE_MAX_RETURN_DIFFERENCE_PERCENTAGE = 0.8; // if a quote returns in x times less return than the best quote, ignore it -export const BRIDGE_PREFERRED_GAS_ESTIMATE = 'medium'; +export const BRIDGE_PREFERRED_GAS_ESTIMATE = 'high'; +export const BRIDGE_DEFAULT_SLIPPAGE = 0.5; + +export const NETWORK_TO_SHORT_NETWORK_NAME_MAP: Record< + AllowedBridgeChainIds, + string +> = { + [CHAIN_IDS.MAINNET]: 'Ethereum', + [CHAIN_IDS.LINEA_MAINNET]: 'Linea', + [CHAIN_IDS.POLYGON]: NETWORK_TO_NAME_MAP[CHAIN_IDS.POLYGON], + [CHAIN_IDS.AVALANCHE]: 'Avalanche', + [CHAIN_IDS.BSC]: NETWORK_TO_NAME_MAP[CHAIN_IDS.BSC], + [CHAIN_IDS.ARBITRUM]: NETWORK_TO_NAME_MAP[CHAIN_IDS.ARBITRUM], + [CHAIN_IDS.OPTIMISM]: NETWORK_TO_NAME_MAP[CHAIN_IDS.OPTIMISM], + [CHAIN_IDS.ZKSYNC_ERA]: 'ZkSync Era', + [CHAIN_IDS.BASE]: 'Base', +}; +export const BRIDGE_MM_FEE_RATE = 0.875; diff --git a/shared/constants/metametrics.ts b/shared/constants/metametrics.ts index c87af10544c3..9b99140b7d24 100644 --- a/shared/constants/metametrics.ts +++ b/shared/constants/metametrics.ts @@ -640,6 +640,7 @@ export enum MetaMetricsEventName { ActivityDetailsClosed = 'Activity Details Closed', AnalyticsPreferenceSelected = 'Analytics Preference Selected', AppInstalled = 'App Installed', + AppOpened = 'App Opened', AppUnlocked = 'App Unlocked', AppUnlockedFailed = 'App Unlocked Failed', AppLocked = 'App Locked', @@ -765,6 +766,7 @@ export enum MetaMetricsEventName { TokenAdded = 'Token Added', TokenRemoved = 'Token Removed', TokenSortPreference = 'Token Sort Preference', + TokenListRefreshed = 'Token List Refreshed', NFTRemoved = 'NFT Removed', TokenDetected = 'Token Detected', TokenHidden = 'Token Hidden', @@ -861,7 +863,6 @@ export enum MetaMetricsEventName { NotificationsActivated = 'Notifications Activated', PushNotificationReceived = 'Push Notification Received', PushNotificationClicked = 'Push Notification Clicked', - // Send sendAssetSelected = 'Send Asset Selected', sendFlowExited = 'Send Flow Exited', @@ -870,6 +871,19 @@ export enum MetaMetricsEventName { sendSwapQuoteRequested = 'Send Swap Quote Requested', sendSwapQuoteReceived = 'Send Swap Quote Received', sendTokenModalOpened = 'Send Token Modal Opened', + // Cross Chain Swaps + ActionCompleted = 'Action Completed', + ActionFailed = 'Action Failed', + ActionOpened = 'Action Opened', + ActionSubmitted = 'Action Submitted', + AllQuotesOpened = 'All Quotes Opened', + AllQuotesSorted = 'All Quotes Sorted', + InputChanged = 'Input Changed', + InputSourceDestinationFlipped = 'Source and Destination Flipped', + CrossChainSwapsQuoteError = 'Cross-chain Quote Error', + QuoteSelected = 'Quote Selected', + CrossChainSwapsQuotesReceived = 'Cross-chain Quotes Received', + CrossChainSwapsQuotesRequested = 'Cross-chain Quotes Requested', } export enum MetaMetricsEventAccountType { @@ -931,6 +945,7 @@ export enum MetaMetricsEventCategory { ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) MMI = 'Institutional', ///: END:ONLY_INCLUDE_IF + CrossChainSwaps = 'Cross Chain Swaps', } export enum MetaMetricsEventLinkType { @@ -1020,3 +1035,8 @@ export enum DeleteRegulationStatus { Running = 'RUNNING', Unknown = 'UNKNOWN', } + +export enum MetaMetricsEventTransactionEstimateType { + DappProposed = 'dapp_proposed', + DefaultEstimate = 'default_estimate', +} diff --git a/shared/constants/network.ts b/shared/constants/network.ts index b7efd379b08c..787322d79dac 100644 --- a/shared/constants/network.ts +++ b/shared/constants/network.ts @@ -165,6 +165,8 @@ export const CHAIN_IDS = { ARBITRUM_SEPOLIA: '0x66eee', NEAR: '0x18d', NEAR_TESTNET: '0x18e', + B3: '0x208d', + B3_TESTNET: '0x7c9', GRAVITY_ALPHA_MAINNET: '0x659', GRAVITY_ALPHA_TESTNET_SEPOLIA: '0x34c1', } as const; @@ -222,6 +224,8 @@ export const CHAINLIST_CHAIN_IDS_MAP = { ZORA_MAINNET: '0x76adf1', FILECOIN: '0x13a', NUMBERS: '0x290b', + B3: '0x208d', + B3_TESTNET: '0x7c9', APE: '0x8173', GRAVITY_ALPHA_MAINNET: '0x659', GRAVITY_ALPHA_TESTNET_SEPOLIA: '0x34c1', @@ -475,6 +479,7 @@ export const NUMBERS_MAINNET_IMAGE_URL = './images/numbers-mainnet.svg'; export const NUMBERS_TOKEN_IMAGE_URL = './images/numbers-token.png'; export const SEI_IMAGE_URL = './images/sei.svg'; export const NEAR_IMAGE_URL = './images/near.svg'; +export const B3_IMAGE_URL = './images/b3.svg'; export const APE_IMAGE_URL = './images/ape.svg'; export const GRAVITY_ALPHA_MAINNET_IMAGE_URL = './images/gravity.svg'; export const GRAVITY_ALPHA_TESTNET_SEPOLIA_IMAGE_URL = './images/gravity.svg'; @@ -816,6 +821,8 @@ export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP = { [CHAINLIST_CHAIN_IDS_MAP.BASE]: BASE_TOKEN_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.NUMBERS]: NUMBERS_MAINNET_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.SEI]: SEI_IMAGE_URL, + [CHAINLIST_CHAIN_IDS_MAP.B3]: B3_IMAGE_URL, + [CHAINLIST_CHAIN_IDS_MAP.B3_TESTNET]: B3_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.GRAVITY_ALPHA_MAINNET]: GRAVITY_ALPHA_MAINNET_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.GRAVITY_ALPHA_TESTNET_SEPOLIA]: @@ -854,10 +861,13 @@ export const CHAIN_ID_TOKEN_IMAGE_MAP = { [CHAIN_IDS.MOONRIVER]: MOONRIVER_TOKEN_IMAGE_URL, [CHAIN_IDS.MOONBEAM]: MOONBEAM_TOKEN_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.IOTEX_MAINNET]: IOTEX_TOKEN_IMAGE_URL, + [CHAIN_IDS.B3]: B3_IMAGE_URL, + [CHAIN_IDS.B3_TESTNET]: B3_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.APE_MAINNET]: APE_TOKEN_IMAGE_URL, [CHAIN_IDS.GRAVITY_ALPHA_MAINNET]: GRAVITY_ALPHA_MAINNET_IMAGE_URL, [CHAIN_IDS.GRAVITY_ALPHA_TESTNET_SEPOLIA]: GRAVITY_ALPHA_TESTNET_SEPOLIA_IMAGE_URL, + [CHAINLIST_CHAIN_IDS_MAP.ZORA_MAINNET]: ETH_TOKEN_IMAGE_URL, } as const; export const INFURA_BLOCKED_KEY = 'countryBlocked'; diff --git a/shared/lib/multichain.ts b/shared/lib/multichain.ts index 26111a0970a2..49dc1add445b 100644 --- a/shared/lib/multichain.ts +++ b/shared/lib/multichain.ts @@ -6,7 +6,8 @@ import { } from '@metamask/utils'; import { validate, Network } from 'bitcoin-address-validation'; import { isAddress } from '@solana/addresses'; -import { InternalAccount, isEvmAccountType } from '@metamask/keyring-api'; +import { isEvmAccountType } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; /** * Returns whether an address is on the Bitcoin mainnet. diff --git a/shared/modules/selectors/smart-transactions.ts b/shared/modules/selectors/smart-transactions.ts index c9a696ba9b9e..9367c24853c6 100644 --- a/shared/modules/selectors/smart-transactions.ts +++ b/shared/modules/selectors/smart-transactions.ts @@ -84,6 +84,7 @@ export const getSmartTransactionsOptInStatusInternal = createSelector( * @returns true if the user has explicitly opted in, false if they have opted out, * or null if they have not explicitly opted in or out. */ +// @ts-expect-error TODO: Fix types for `getSmartTransactionsOptInStatusInternal` once `getPreferences is converted to TypeScript export const getSmartTransactionsOptInStatusForMetrics = createSelector( getSmartTransactionsOptInStatusInternal, (optInStatus: boolean): boolean => optInStatus, @@ -96,6 +97,7 @@ export const getSmartTransactionsOptInStatusForMetrics = createSelector( * @param state * @returns */ +// @ts-expect-error TODO: Fix types for `getSmartTransactionsOptInStatusInternal` once `getPreferences is converted to TypeScript export const getSmartTransactionsPreferenceEnabled = createSelector( getSmartTransactionsOptInStatusInternal, (optInStatus: boolean): boolean => { diff --git a/shared/modules/selectors/util.js b/shared/modules/selectors/util.js index d44b7d905087..35153a82bc4d 100644 --- a/shared/modules/selectors/util.js +++ b/shared/modules/selectors/util.js @@ -1,9 +1,9 @@ import { TransactionStatus } from '@metamask/transaction-controller'; import { isEqual } from 'lodash'; -import { createSelectorCreator, defaultMemoize } from 'reselect'; +import { createSelectorCreator, lruMemoize } from 'reselect'; export const createDeepEqualSelector = createSelectorCreator( - defaultMemoize, + lruMemoize, isEqual, ); diff --git a/shared/types/bridge-status.ts b/shared/types/bridge-status.ts index 601a2209aaf9..fc9357ef968a 100644 --- a/shared/types/bridge-status.ts +++ b/shared/types/bridge-status.ts @@ -1,5 +1,12 @@ -// eslint-disable-next-line import/no-restricted-paths -import { ChainId, Quote, QuoteResponse } from '../../ui/pages/bridge/types'; +import { TransactionMeta } from '@metamask/transaction-controller'; +// TODO fix this +import { + ChainId, + Quote, + QuoteMetadata, + QuoteResponse, + // eslint-disable-next-line import/no-restricted-paths +} from '../../ui/pages/bridge/types'; // All fields need to be types not interfaces, same with their children fields // o/w you get a type error @@ -13,7 +20,7 @@ export enum StatusTypes { export type StatusRequest = { bridgeId: string; // lifi, socket, squid - srcTxHash: string; // lifi, socket, squid + srcTxHash?: string; // lifi, socket, squid, might be undefined for STX bridge: string; // lifi, socket, squid srcChainId: ChainId; // lifi, socket, squid destChainId: ChainId; // lifi, socket, squid @@ -21,18 +28,32 @@ export type StatusRequest = { refuel?: boolean; // lifi }; +export type StatusRequestDto = Omit< + StatusRequest, + 'quote' | 'srcChainId' | 'destChainId' | 'refuel' +> & { + srcChainId: string; // lifi, socket, squid + destChainId: string; // lifi, socket, squid + requestId?: string; + refuel?: string; // lifi +}; + +export type StatusRequestWithSrcTxHash = StatusRequest & { + srcTxHash: string; +}; + export type Asset = { chainId: ChainId; address: string; symbol: string; name: string; decimals: number; - icon?: string; + icon?: string | null; }; export type SrcChainStatus = { chainId: ChainId; - txHash: string; + txHash?: string; // might be undefined if this is a smart transaction (STX) amount?: string; token?: Asset; }; @@ -105,20 +126,23 @@ export type RefuelStatusResponse = object & StatusResponse; export type RefuelData = object & Step; export type BridgeHistoryItem = { + txMetaId: string; // Need this to handle STX that might not have a txHash immediately quote: Quote; status: StatusResponse; - startTime?: number; + startTime?: number; // timestamp in ms estimatedProcessingTimeInSeconds: number; slippagePercentage: number; completionTime?: number; pricingData?: { - quotedGasInUsd: number; - quotedReturnInUsd: number; - amountSentInUsd: number; - quotedRefuelSrcAmountInUsd?: number; - quotedRefuelDestAmountInUsd?: number; + amountSent: string; // This is from QuoteMetadata.sentAmount.amount, the actual amount sent by user in non-atomic decimal form + + quotedGasInUsd?: string; + quotedReturnInUsd?: string; + amountSentInUsd?: string; + quotedRefuelSrcAmountInUsd?: string; + quotedRefuelDestAmountInUsd?: string; }; - initialDestAssetBalance?: number; + initialDestAssetBalance?: string; targetContractAddress?: string; account: string; }; @@ -129,18 +153,30 @@ export enum BridgeStatusAction { GET_STATE = 'getState', } +// The BigNumber values are serialized to strings +export type QuoteMetadataSerialized = { + sentAmount: { amount: string; fiat: string | null }; +}; + export type StartPollingForBridgeTxStatusArgs = { + bridgeTxMeta: TransactionMeta; statusRequest: StatusRequest; - quoteResponse: QuoteResponse; + quoteResponse: QuoteResponse & QuoteMetadata; startTime?: BridgeHistoryItem['startTime']; slippagePercentage: BridgeHistoryItem['slippagePercentage']; - pricingData?: BridgeHistoryItem['pricingData']; initialDestAssetBalance?: BridgeHistoryItem['initialDestAssetBalance']; targetContractAddress?: BridgeHistoryItem['targetContractAddress']; }; -export type SourceChainTxHash = string; +export type StartPollingForBridgeTxStatusArgsSerialized = Omit< + StartPollingForBridgeTxStatusArgs, + 'quoteResponse' +> & { + quoteResponse: QuoteResponse & QuoteMetadataSerialized; +}; + +export type SourceChainTxMetaId = string; export type BridgeStatusControllerState = { - txHistory: Record; + txHistory: Record; }; diff --git a/shared/types/bridge.ts b/shared/types/bridge.ts new file mode 100644 index 000000000000..6cfab93f47ed --- /dev/null +++ b/shared/types/bridge.ts @@ -0,0 +1,4 @@ +export type ChainConfiguration = { + isActiveSrc: boolean; + isActiveDest: boolean; +}; diff --git a/test/data/bridge/mock-token-data.ts b/test/data/bridge/mock-token-data.ts new file mode 100644 index 000000000000..0eafa4802ea5 --- /dev/null +++ b/test/data/bridge/mock-token-data.ts @@ -0,0 +1,102 @@ +import { CHAIN_IDS } from '@metamask/transaction-controller'; + +export const mockTokenData = { + allTokens: { + [CHAIN_IDS.MAINNET]: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': [ + { + address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', + balance: 'a', + decimals: 6, + }, + { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + balance: 'e', + }, + ], + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': [ + { + address: '0x6b3595068778dd592e39a122f4f5a5cf09c90fe2', + balance: 'e', + }, + ], + }, + [CHAIN_IDS.LINEA_MAINNET]: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': [ + { + address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', + balance: 'e', + }, + ], + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': [ + { + address: '0x6b3595068778dd592e39a122f4f5a5cf09c90fe2', + balance: 'e', + }, + ], + }, + }, + accountsByChainId: { + [CHAIN_IDS.MAINNET]: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + balance: '0xa', + }, + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': { + address: '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b', + balance: '0xe', + }, + }, + [CHAIN_IDS.LINEA_MAINNET]: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + balance: '0xe', + }, + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': { + address: '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b', + balance: '0xe', + }, + }, + }, + tokensChainsCache: { + [CHAIN_IDS.MAINNET]: { + timestamp: 111111, + data: [ + { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + ], + }, + [CHAIN_IDS.LINEA_MAINNET]: { + timestamp: 111111, + data: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + '0xc00e94cb662c3520282e6f5717214004a7f26888': { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + }, + tokenBalances: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + '0x5': {}, + '0x1': { + '0x514910771af9ca656af840dff83e8264ecf986ca': '0x1', + '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984': '0x738', + }, + }, + }, +}; diff --git a/test/data/mock-accounts.ts b/test/data/mock-accounts.ts index b956dbadd6bb..eab4cd4aa74d 100644 --- a/test/data/mock-accounts.ts +++ b/test/data/mock-accounts.ts @@ -1,6 +1,6 @@ import { KeyringTypes } from '@metamask/keyring-controller'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { - InternalAccount, EthAccountType, BtcMethod, BtcAccountType, diff --git a/test/data/mock-send-state.json b/test/data/mock-send-state.json index 73468aca6171..0b7cc237547f 100644 --- a/test/data/mock-send-state.json +++ b/test/data/mock-send-state.json @@ -64,6 +64,11 @@ }, "metamask": { "accountsByChainId": {}, + "tokenBalances": { + "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { + "0x5": {} + } + }, "ipfsGateway": "", "dismissSeedBackUpReminder": false, "usePhishDetect": true, @@ -140,11 +145,6 @@ "isAccountMenuOpen": false, "isUnlocked": true, "completedOnboarding": true, - "usedNetworks": { - "0x1": true, - "0x5": true, - "0x539": true - }, "showTestnetMessageInDropdown": true, "alertEnabledness": { "unconnectedAccount": true diff --git a/test/e2e/constants.ts b/test/e2e/constants.ts index 7123d3e4114a..8296cdc3e3d1 100644 --- a/test/e2e/constants.ts +++ b/test/e2e/constants.ts @@ -70,3 +70,6 @@ export const DEFAULT_SOLANA_ACCOUNT = /* Default (mocked) SOLANA balance used by the Solana RPC provider */ export const DEFAULT_SOLANA_BALANCE = 1; // SOL + +/* Title of the mocked E2E test empty HTML page */ +export const EMPTY_E2E_TEST_PAGE_TITLE = 'E2E Test Page'; diff --git a/test/e2e/default-fixture.js b/test/e2e/default-fixture.js index c2fba9d63424..5bb2a24d0c5c 100644 --- a/test/e2e/default-fixture.js +++ b/test/e2e/default-fixture.js @@ -115,20 +115,28 @@ function defaultFixture(inputChainId = CHAIN_IDS.LOCALHOST) { trezorModel: null, newPrivacyPolicyToastClickedOrClosed: true, newPrivacyPolicyToastShownDate: Date.now(), - usedNetworks: { - [CHAIN_IDS.MAINNET]: true, - [CHAIN_IDS.LINEA_MAINNET]: true, - [CHAIN_IDS.GOERLI]: true, - [CHAIN_IDS.LOCALHOST]: true, - }, snapsInstallPrivacyWarningShown: true, }, BridgeController: { bridgeState: { bridgeFeatureFlags: { - extensionSupport: false, - srcNetworkAllowlist: ['0x1', '0xa', '0xe708'], - destNetworkAllowlist: ['0x1', '0xa', '0xe708'], + extensionConfig: { + support: false, + chains: { + '0x1': { + isActiveSrc: true, + isActiveDest: true, + }, + '0xa': { + isActiveSrc: true, + isActiveDest: true, + }, + '0xe708': { + isActiveSrc: true, + isActiveDest: true, + }, + }, + }, }, destTokens: {}, destTopAssets: [], diff --git a/test/e2e/fixture-builder.js b/test/e2e/fixture-builder.js index 0a397acb6c97..020c4db1c64b 100644 --- a/test/e2e/fixture-builder.js +++ b/test/e2e/fixture-builder.js @@ -40,12 +40,6 @@ function onboardingFixture() { '__FIXTURE_SUBSTITUTION__currentDateInMilliseconds', showTestnetMessageInDropdown: true, trezorModel: null, - usedNetworks: { - [CHAIN_IDS.MAINNET]: true, - [CHAIN_IDS.LINEA_MAINNET]: true, - [CHAIN_IDS.GOERLI]: true, - [CHAIN_IDS.LOCALHOST]: true, - }, }, NetworkController: { ...mockNetworkStateOld({ @@ -241,6 +235,12 @@ class FixtureBuilder { }); } + withUseBasicFunctionalityDisabled() { + return this.withPreferencesController({ + useExternalServices: false, + }); + } + withGasFeeController(data) { merge(this.fixture.data.GasFeeController, data); return this; @@ -452,9 +452,10 @@ class FixtureBuilder { this.fixture.data.BridgeController = { bridgeState: { bridgeFeatureFlags: { - destNetworkAllowlist: [], - extensionSupport: false, - srcNetworkAllowlist: [], + extensionConfig: { + support: false, + chains: {}, + }, }, destTokens: {}, destTopAssets: [], @@ -687,6 +688,15 @@ class FixtureBuilder { }); } + withPreferencesControllerSmartTransactionsOptedOut() { + return this.withPreferencesController({ + preferences: { + smartTransactionsOptInStatus: false, + tokenNetworkFilter: {}, + }, + }); + } + withPreferencesControllerAndFeatureFlag(flags) { merge(this.fixture.data.PreferencesController, flags); return this; @@ -1481,6 +1491,24 @@ class FixtureBuilder { }); } + withIncomingTransactionsPreferences(incomingTransactionsPreferences) { + return this.withPreferencesController({ + featureFlags: { + showIncomingTransactions: incomingTransactionsPreferences, + }, + }); + } + + withIncomingTransactionsCache(cache) { + return this.withTransactionController({ lastFetchedBlockNumbers: cache }); + } + + withTransactions(transactions) { + return this.withTransactionController({ + transactions, + }); + } + build() { this.fixture.meta = { version: FIXTURE_STATE_METADATA_VERSION, diff --git a/test/e2e/flask/README.md b/test/e2e/flask/README.md index abb07a11e910..42d0e6a28236 100644 --- a/test/e2e/flask/README.md +++ b/test/e2e/flask/README.md @@ -3,4 +3,4 @@ Add `.spec.js` or `.spec.ts` files to run only in flask here. > [!IMPORTANT] > Ensure to update your files in `FLASK_ONLY_TESTS` in -> [`run-all.js`](https://github.com/MetaMask/metamask-extension/blob/develop/test/e2e/run-all.js) \ No newline at end of file +> [`run-all.js`](https://github.com/MetaMask/metamask-extension/blob/main/test/e2e/run-all.js) diff --git a/test/e2e/flask/btc/btc-account-overview.spec.ts b/test/e2e/flask/btc/btc-account-overview.spec.ts index 418c9d736078..93ff6ef07ad3 100644 --- a/test/e2e/flask/btc/btc-account-overview.spec.ts +++ b/test/e2e/flask/btc/btc-account-overview.spec.ts @@ -1,63 +1,24 @@ +import { strict as assert } from 'assert'; import { Suite } from 'mocha'; import { DEFAULT_BTC_BALANCE } from '../../constants'; +import BitcoinHomepage from '../../page-objects/pages/home/bitcoin-homepage'; import { withBtcAccountSnap } from './common-btc'; describe('BTC Account - Overview', function (this: Suite) { - it('has portfolio button enabled for BTC accounts', async function () { + it('has balance displayed and has portfolio button enabled for BTC accounts', async function () { await withBtcAccountSnap( { title: this.test?.fullTitle() }, async (driver) => { - await driver.findElement({ - css: '[data-testid="account-menu-icon"]', - text: 'Bitcoin Account', - }); - - await driver.waitForSelector({ - text: 'Send', - tag: 'button', - css: '[data-testid="coin-overview-send"]', - }); - - await driver.waitForSelector({ - text: 'Swap', - tag: 'button', - css: '[disabled]', - }); - - await driver.waitForSelector({ - text: 'Bridge', - tag: 'button', - css: '[disabled]', - }); - - // buy sell button - await driver.findClickableElement('[data-testid="coin-overview-buy"]'); - - // receive button - await driver.findClickableElement( - '[data-testid="coin-overview-receive"]', + const homePage = new BitcoinHomepage(driver); + await homePage.check_pageIsLoaded(); + await homePage.headerNavbar.check_accountLabel('Bitcoin Account'); + await homePage.check_isExpectedBitcoinBalanceDisplayed( + DEFAULT_BTC_BALANCE, ); - }, - ); - }); - - it('has balance', async function () { - await withBtcAccountSnap( - { title: this.test?.fullTitle() }, - async (driver) => { - await driver.waitForSelector({ - testId: 'account-value-and-suffix', - text: `${DEFAULT_BTC_BALANCE}`, - }); - await driver.waitForSelector({ - css: '.currency-display-component__suffix', - text: 'BTC', - }); - - await driver.waitForSelector({ - tag: 'p', - text: `${DEFAULT_BTC_BALANCE} BTC`, - }); + assert.equal(await homePage.check_isBridgeButtonEnabled(), false); + assert.equal(await homePage.check_isSwapButtonEnabled(), false); + assert.equal(await homePage.check_isBuySellButtonEnabled(), true); + assert.equal(await homePage.check_isReceiveButtonEnabled(), true); }, ); }); diff --git a/test/e2e/flask/btc/btc-dapp-connection.spec.ts b/test/e2e/flask/btc/btc-dapp-connection.spec.ts index 2eb33a4b7d74..2a9b413f60b0 100644 --- a/test/e2e/flask/btc/btc-dapp-connection.spec.ts +++ b/test/e2e/flask/btc/btc-dapp-connection.spec.ts @@ -1,5 +1,6 @@ import { Suite } from 'mocha'; -import { openDapp, WINDOW_TITLES } from '../../helpers'; +import BitcoinHomepage from '../../page-objects/pages/home/bitcoin-homepage'; +import TestDapp from '../../page-objects/pages/test-dapp'; import { withBtcAccountSnap } from './common-btc'; describe('BTC Account - Dapp Connection', function (this: Suite) { @@ -7,14 +8,16 @@ describe('BTC Account - Dapp Connection', function (this: Suite) { await withBtcAccountSnap( { title: this.test?.fullTitle() }, async (driver) => { - await openDapp(driver); - await driver.clickElement('#connectButton'); - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + const homePage = new BitcoinHomepage(driver); + await homePage.check_pageIsLoaded(); + await homePage.headerNavbar.check_accountLabel('Bitcoin Account'); - await driver.assertElementNotPresent( - '[data-testid="choose-account-list-1"]', - ); + const testDapp = new TestDapp(driver); + await testDapp.openTestDappPage(); + await testDapp.check_pageIsLoaded(); + await testDapp.connectAccount({ + connectAccountButtonEnabled: false, + }); }, ); }); diff --git a/test/e2e/flask/btc/btc-experimental-settings.spec.ts b/test/e2e/flask/btc/btc-experimental-settings.spec.ts index 45bc7d0d1701..10a183bf87bb 100644 --- a/test/e2e/flask/btc/btc-experimental-settings.spec.ts +++ b/test/e2e/flask/btc/btc-experimental-settings.spec.ts @@ -1,47 +1,45 @@ import { Suite } from 'mocha'; - -import messages from '../../../../app/_locales/en/messages.json'; import FixtureBuilder from '../../fixture-builder'; -import { - defaultGanacheOptions, - unlockWallet, - withFixtures, -} from '../../helpers'; +import { withFixtures } from '../../helpers'; import { Driver } from '../../webdriver/driver'; +import AccountListPage from '../../page-objects/pages/account-list-page'; +import ExperimentalSettings from '../../page-objects/pages/settings/experimental-settings'; +import HomePage from '../../page-objects/pages/home/homepage'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import SettingsPage from '../../page-objects/pages/settings/settings-page'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; describe('BTC Experimental Settings', function (this: Suite) { it('will show `Add a new Bitcoin account (Beta)` option when setting is enabled', async function () { await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - await driver.clickElement( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement({ text: 'Settings', tag: 'div' }); - await driver.clickElement({ text: 'Experimental', tag: 'div' }); + await loginWithBalanceValidation(driver); - await driver.waitForSelector({ - text: messages.bitcoinSupportToggleTitle.message, - tag: 'span', - }); + // go to experimental settings page and enable add new Bitcoin account toggle + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + await homePage.check_expectedBalanceIsDisplayed(); - await driver.clickElement('[data-testid="bitcoin-support-toggle-div"]'); + await new HeaderNavbar(driver).openSettingsPage(); + const settingsPage = new SettingsPage(driver); + await settingsPage.check_pageIsLoaded(); + await settingsPage.goToExperimentalSettings(); - await driver.clickElement('button[aria-label="Close"]'); + const experimentalSettings = new ExperimentalSettings(driver); + await experimentalSettings.check_pageIsLoaded(); + await experimentalSettings.toggleBitcoinAccount(); + await settingsPage.closeSettingsPage(); - await driver.clickElement('[data-testid="account-menu-icon"]'); - await driver.clickElement( - '[data-testid="multichain-account-menu-popover-action-button"]', - ); - await driver.waitForSelector({ - text: messages.addNewBitcoinAccount.message, - tag: 'button', - }); + // check add new Bitcoin account button is displayed + await homePage.check_pageIsLoaded(); + await new HeaderNavbar(driver).openAccountMenu(); + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.check_addBitcoinAccountAvailable(true); }, ); }); diff --git a/test/e2e/flask/create-watch-account.spec.ts b/test/e2e/flask/create-watch-account.spec.ts index 71d47327536c..f25f38f0b2ce 100644 --- a/test/e2e/flask/create-watch-account.spec.ts +++ b/test/e2e/flask/create-watch-account.spec.ts @@ -374,7 +374,9 @@ describe('Account-watcher snap', function (this: Suite) { const toggleWatchAccountOptionAndCloseSettings = async (driver: Driver) => { await driver.clickElement('[data-testid="watch-account-toggle-div"]'); - await driver.clickElement('button[aria-label="Close"]'); + await driver.clickElement( + '.settings-page__header__title-container__close-button', + ); }; const verifyWatchAccountOptionAndCloseMenu = async ( @@ -396,7 +398,7 @@ describe('Account-watcher snap', function (this: Suite) { tag: 'button', }); } - await driver.clickElement('button[aria-label="Close"]'); + await driver.clickElement('header button[aria-label="Close"]'); }; it("will show the 'Watch an Ethereum account (Beta)' option when setting is enabled", async function () { diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js index 6900ac243629..3b69d55fc122 100644 --- a/test/e2e/helpers.js +++ b/test/e2e/helpers.js @@ -185,7 +185,7 @@ async function withFixtures(options, testSuite) { } await mockServer.start(8000); - setManifestFlags(manifestFlags); + await setManifestFlags(manifestFlags); driver = (await buildWebDriver(driverOptions)).driver; webDriver = driver.driver; @@ -728,6 +728,29 @@ async function clickSignOnSignatureConfirmation({ await driver.clickElement({ text: 'Sign', tag: 'button' }); } +/** + * This method handles clicking the sign button on signature confirmation + * screen. + * + * @param {object} options - Options for the function. + * @param {WebDriver} options.driver - The WebDriver instance controlling the browser. + * @param {boolean} [options.snapSigInsights] - Whether to wait for the insights snap to be ready before clicking the sign button. + */ +async function clickSignOnRedesignedSignatureConfirmation({ + driver, + snapSigInsights = false, +}) { + await driver.clickElementSafe('.confirm-scroll-to-bottom__button'); + + if (snapSigInsights) { + // there is no condition we can wait for to know the snap is ready, + // so we have to add a small delay as the last alternative to avoid flakiness. + await driver.delay(regularDelayMs); + } + + await driver.clickElement({ text: 'Confirm', tag: 'button' }); +} + /** * Some signing methods have extra security that requires the user to click a * button to validate that they have verified the details. This method handles @@ -1000,6 +1023,7 @@ module.exports = { roundToXDecimalPlaces, generateRandNumBetween, clickSignOnSignatureConfirmation, + clickSignOnRedesignedSignatureConfirmation, validateContractDetails, switchToNotificationWindow, getEventPayloads, diff --git a/test/e2e/helpers/user-storage/userStorageMockttpController.test.ts b/test/e2e/helpers/identity/user-storage/userStorageMockttpController.test.ts similarity index 100% rename from test/e2e/helpers/user-storage/userStorageMockttpController.test.ts rename to test/e2e/helpers/identity/user-storage/userStorageMockttpController.test.ts diff --git a/test/e2e/helpers/user-storage/userStorageMockttpController.ts b/test/e2e/helpers/identity/user-storage/userStorageMockttpController.ts similarity index 100% rename from test/e2e/helpers/user-storage/userStorageMockttpController.ts rename to test/e2e/helpers/identity/user-storage/userStorageMockttpController.ts diff --git a/test/e2e/json-rpc/eth_sendTransaction.spec.js b/test/e2e/json-rpc/eth_sendTransaction.spec.js index ed740d17bfc1..2167fe6586c5 100644 --- a/test/e2e/json-rpc/eth_sendTransaction.spec.js +++ b/test/e2e/json-rpc/eth_sendTransaction.spec.js @@ -11,105 +11,166 @@ const FixtureBuilder = require('../fixture-builder'); describe('eth_sendTransaction', function () { const expectedHash = '0x855951a65dcf5949dc54beb032adfb604c52a0a548a0f616799d6873a9521470'; - it('confirms a new transaction', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - // eth_sendTransaction - await driver.openNewPage(`http://127.0.0.1:8080`); - const request = JSON.stringify({ - jsonrpc: '2.0', - method: 'eth_sendTransaction', - params: [ - { - to: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', - from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', - value: '0x0', - maxPriorityFeePerGas: '0x3b9aca00', - maxFeePerGas: '0x2540be400', - }, - ], - id: 0, - }); - await driver.executeScript( - `window.transactionHash = window.ethereum.request(${request})`, - ); + describe('Old confirmation screens', function () { + it('rejects a new transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); - // confirm transaction in mm popup - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.switchToWindowWithTitle('E2E Test Dapp'); - const actualHash = await driver.executeScript( - `return window.transactionHash;`, - ); - assert.equal(actualHash, expectedHash); - }, - ); + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // eth_sendTransaction + await driver.openNewPage(`http://127.0.0.1:8080`); + const request = JSON.stringify({ + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [ + { + to: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + value: '0x0', + maxPriorityFeePerGas: '0x3b9aca00', + maxFeePerGas: '0x2540be400', + }, + ], + id: 0, + }); + await driver.executeScript( + `window.transactionHash = window.ethereum.request(${request})`, + ); + + // reject transaction in mm popup + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.clickElement({ text: 'Reject', tag: 'button' }); + await driver.switchToWindowWithTitle('E2E Test Dapp'); + const result = await driver + .executeScript(`return window.transactionHash;`) + .then((data) => { + return data; + }) + .catch((err) => { + return err; + }); + assert.ok( + result.message.includes( + 'MetaMask Tx Signature: User denied transaction signature.', + ), + ); + }, + ); + }); }); - it('rejects a new transaction', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedTransactionConfirmations(driver); + describe('Redesigned confirmation screens', function () { + it('confirms a new transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); - // eth_sendTransaction - await driver.openNewPage(`http://127.0.0.1:8080`); - const request = JSON.stringify({ - jsonrpc: '2.0', - method: 'eth_sendTransaction', - params: [ - { - to: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', - from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', - value: '0x0', - maxPriorityFeePerGas: '0x3b9aca00', - maxFeePerGas: '0x2540be400', - }, - ], - id: 0, - }); - await driver.executeScript( - `window.transactionHash = window.ethereum.request(${request})`, - ); + // eth_sendTransaction + await driver.openNewPage(`http://127.0.0.1:8080`); + const request = JSON.stringify({ + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [ + { + to: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + value: '0x0', + maxPriorityFeePerGas: '0x3b9aca00', + maxFeePerGas: '0x2540be400', + }, + ], + id: 0, + }); + await driver.executeScript( + `window.transactionHash = window.ethereum.request(${request})`, + ); - // reject transaction in mm popup - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.clickElement({ text: 'Reject', tag: 'button' }); - await driver.switchToWindowWithTitle('E2E Test Dapp'); - const result = await driver - .executeScript(`return window.transactionHash;`) - .then((data) => { - return data; - }) - .catch((err) => { - return err; + // confirm transaction in mm popup + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.switchToWindowWithTitle('E2E Test Dapp'); + const actualHash = await driver.executeScript( + `return window.transactionHash;`, + ); + assert.equal(actualHash, expectedHash); + }, + ); + }); + + it('rejects a new transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // eth_sendTransaction + await driver.openNewPage(`http://127.0.0.1:8080`); + const request = JSON.stringify({ + jsonrpc: '2.0', + method: 'eth_sendTransaction', + params: [ + { + to: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + value: '0x0', + maxPriorityFeePerGas: '0x3b9aca00', + maxFeePerGas: '0x2540be400', + }, + ], + id: 0, }); - assert.ok( - result.message.includes( - 'MetaMask Tx Signature: User denied transaction signature.', - ), - ); - }, - ); + await driver.executeScript( + `window.transactionHash = window.ethereum.request(${request})`, + ); + + // reject transaction in mm popup + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.clickElement({ text: 'Cancel', tag: 'button' }); + await driver.switchToWindowWithTitle('E2E Test Dapp'); + const result = await driver + .executeScript(`return window.transactionHash;`) + .then((data) => { + return data; + }) + .catch((err) => { + return err; + }); + assert.ok( + result.message.includes( + 'MetaMask Tx Signature: User denied transaction signature.', + ), + ); + }, + ); + }); }); }); diff --git a/test/e2e/json-rpc/switchEthereumChain.spec.js b/test/e2e/json-rpc/switchEthereumChain.spec.js index 6a8576b3f136..e55dfc622865 100644 --- a/test/e2e/json-rpc/switchEthereumChain.spec.js +++ b/test/e2e/json-rpc/switchEthereumChain.spec.js @@ -262,6 +262,7 @@ describe('Switch Ethereum Chain for two dapps', function () { dapp: true, fixtures: new FixtureBuilder() .withNetworkControllerDoubleGanache() + .withPreferencesControllerSmartTransactionsOptedOut() .build(), dappOptions: { numberOfDapps: 2 }, ganacheOptions: { diff --git a/test/e2e/json-rpc/wallet_requestPermissions.spec.js b/test/e2e/json-rpc/wallet_requestPermissions.spec.ts similarity index 51% rename from test/e2e/json-rpc/wallet_requestPermissions.spec.js rename to test/e2e/json-rpc/wallet_requestPermissions.spec.ts index 5484fdf73d80..d2a033dcf3c5 100644 --- a/test/e2e/json-rpc/wallet_requestPermissions.spec.js +++ b/test/e2e/json-rpc/wallet_requestPermissions.spec.ts @@ -1,58 +1,42 @@ -const { strict: assert } = require('assert'); -const { - defaultGanacheOptions, - withFixtures, - switchToNotificationWindow, - switchToOrOpenDapp, - unlockWallet, -} = require('../helpers'); -const FixtureBuilder = require('../fixture-builder'); +import { strict as assert } from 'assert'; +import { withFixtures } from '../helpers'; +import FixtureBuilder from '../fixture-builder'; +import { loginWithBalanceValidation } from '../page-objects/flows/login.flow'; +import TestDapp from '../page-objects/pages/test-dapp'; describe('wallet_requestPermissions', function () { it('executes a request permissions on eth_accounts event', async function () { await withFixtures( { dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.title, + fixtures: new FixtureBuilder().build(), + title: this.test?.title, }, async ({ driver }) => { - await unlockWallet(driver); + await loginWithBalanceValidation(driver); + const testDapp = new TestDapp(driver); + await testDapp.openTestDappPage(); // wallet_requestPermissions - await driver.openNewPage(`http://127.0.0.1:8080`); - const requestPermissionsRequest = JSON.stringify({ jsonrpc: '2.0', method: 'wallet_requestPermissions', params: [{ eth_accounts: {} }], }); - await driver.executeScript( `window.ethereum.request(${requestPermissionsRequest})`, ); - await switchToNotificationWindow(driver); - - await driver.clickElement({ - text: 'Connect', - tag: 'button', - }); - - await switchToOrOpenDapp(driver); + // confirm connect account + await testDapp.confirmConnectAccountModal(); const getPermissionsRequest = JSON.stringify({ method: 'wallet_getPermissions', }); - const getPermissions = await driver.executeScript( `return window.ethereum.request(${getPermissionsRequest})`, ); - - assert.strictEqual(getPermissions[0].parentCapability, 'eth_accounts'); + assert.strictEqual(getPermissions[1].parentCapability, 'eth_accounts'); }, ); }); diff --git a/test/e2e/json-rpc/wallet_revokePermissions.spec.js b/test/e2e/json-rpc/wallet_revokePermissions.spec.ts similarity index 52% rename from test/e2e/json-rpc/wallet_revokePermissions.spec.js rename to test/e2e/json-rpc/wallet_revokePermissions.spec.ts index 70d2fd3ba572..5c444b5ecf01 100644 --- a/test/e2e/json-rpc/wallet_revokePermissions.spec.js +++ b/test/e2e/json-rpc/wallet_revokePermissions.spec.ts @@ -1,12 +1,8 @@ -const { strict: assert } = require('assert'); - -const { - withFixtures, - defaultGanacheOptions, - unlockWallet, - openDapp, -} = require('../helpers'); -const FixtureBuilder = require('../fixture-builder'); +import { strict as assert } from 'assert'; +import { ACCOUNT_1, withFixtures } from '../helpers'; +import FixtureBuilder from '../fixture-builder'; +import TestDapp from '../page-objects/pages/test-dapp'; +import { loginWithBalanceValidation } from '../page-objects/flows/login.flow'; describe('Revoke Dapp Permissions', function () { it('should revoke dapp permissions ', async function () { @@ -16,18 +12,13 @@ describe('Revoke Dapp Permissions', function () { fixtures: new FixtureBuilder() .withPermissionControllerConnectedToTestDapp() .build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, async ({ driver }) => { - await unlockWallet(driver); - - await openDapp(driver); - - await driver.findElement({ - text: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', - css: '#accounts', - }); + await loginWithBalanceValidation(driver); + const testDapp = new TestDapp(driver); + await testDapp.openTestDappPage(); + await testDapp.check_connectedAccounts(ACCOUNT_1); // wallet_revokePermissions request const revokePermissionsRequest = JSON.stringify({ @@ -43,15 +34,10 @@ describe('Revoke Dapp Permissions', function () { const result = await driver.executeScript( `return window.ethereum.request(${revokePermissionsRequest})`, ); - // Response of method call assert.deepEqual(result, null); - // TODO: Fix having to reload dapp as it is not the proper behavior in production, issue with test setup. - await driver.executeScript(`window.location.reload()`); - - // You cannot use driver.findElement() with an empty string, so use xpath - await driver.findElement({ xpath: '//span[@id="accounts"][.=""]' }); + await testDapp.check_connectedAccounts(ACCOUNT_1, false); }, ); }); diff --git a/test/e2e/mock-e2e.js b/test/e2e/mock-e2e.js index fc6b1ea4397a..c7d8b02d4c7d 100644 --- a/test/e2e/mock-e2e.js +++ b/test/e2e/mock-e2e.js @@ -50,6 +50,7 @@ const { mockEmptyStalelistAndHotlist, } = require('./tests/phishing-controller/mocks'); const { mockNotificationServices } = require('./tests/notifications/mocks'); +const { mockIdentityServices } = require('./tests/identity/mocks'); const emptyHtmlPage = () => ` @@ -125,7 +126,6 @@ async function setupMocking( }); const mockedEndpoint = await testSpecificMock(server); - // Mocks below this line can be overridden by test-specific mocks // Account link @@ -732,12 +732,31 @@ async function setupMocking( // Notification APIs await mockNotificationServices(server); + // Identity APIs + await mockIdentityServices(server); + await server.forGet(/^https:\/\/sourcify.dev\/(.*)/u).thenCallback(() => { return { statusCode: 404, }; }); + // remote feature flags + await server + .forGet('https://client-config.api.cx.metamask.io/v1/flags') + .withQuery({ + client: 'extension', + distribution: 'main', + environment: 'dev', + }) + .thenCallback(() => { + return { + ok: true, + statusCode: 200, + json: [{ feature1: true }, { feature2: false }], + }; + }); + /** * Returns an array of alphanumerically sorted hostnames that were requested * during the current test suite. diff --git a/test/e2e/page-objects/common.ts b/test/e2e/page-objects/common.ts index b1f678b80cca..5bf1a91e1859 100644 --- a/test/e2e/page-objects/common.ts +++ b/test/e2e/page-objects/common.ts @@ -1 +1,4 @@ -export type RawLocator = string | { css: string; text: string }; +export type RawLocator = + | string + | { css?: string; text?: string } + | { tag: string; text: string }; diff --git a/test/e2e/page-objects/flows/login.flow.ts b/test/e2e/page-objects/flows/login.flow.ts index f5ed61946ce8..0e5f2dd6281c 100644 --- a/test/e2e/page-objects/flows/login.flow.ts +++ b/test/e2e/page-objects/flows/login.flow.ts @@ -1,5 +1,5 @@ import LoginPage from '../pages/login-page'; -import HomePage from '../pages/homepage'; +import HomePage from '../pages/home/homepage'; import { Driver } from '../../webdriver/driver'; import { Ganache } from '../../seeder/ganache'; diff --git a/test/e2e/page-objects/flows/send-transaction.flow.ts b/test/e2e/page-objects/flows/send-transaction.flow.ts index 8af88f01aca6..d33302f25510 100644 --- a/test/e2e/page-objects/flows/send-transaction.flow.ts +++ b/test/e2e/page-objects/flows/send-transaction.flow.ts @@ -1,4 +1,4 @@ -import HomePage from '../pages/homepage'; +import HomePage from '../pages/home/homepage'; import ConfirmTxPage from '../pages/send/confirm-tx-page'; import SendTokenPage from '../pages/send/send-token-page'; import { Driver } from '../../webdriver/driver'; @@ -84,6 +84,42 @@ export const sendRedesignedTransactionToAddress = async ({ await transactionConfirmationPage.clickFooterConfirmButton(); }; +/** + * This function initiates the steps required to send a transaction from the homepage to final confirmation. + * + * @param params - An object containing the parameters. + * @param params.driver - The webdriver instance. + * @param params.recipientAccount - The recipient account. + * @param params.amount - The amount of the asset to be sent in the transaction. + */ +export const sendRedesignedTransactionToAccount = async ({ + driver, + recipientAccount, + amount, +}: { + driver: Driver; + recipientAccount: string; + amount: string; +}): Promise => { + console.log( + `Start flow to send amount ${amount} to recipient account ${recipientAccount} on home screen`, + ); + // click send button on homepage to start flow + const homePage = new HomePage(driver); + await homePage.startSendFlow(); + + // user should land on send token screen to fill recipient and amount + const sendToPage = new SendTokenPage(driver); + await sendToPage.check_pageIsLoaded(); + await sendToPage.selectRecipientAccount(recipientAccount); + await sendToPage.fillAmount(amount); + await sendToPage.goToNextScreen(); + + // confirm transaction when user lands on confirm transaction screen + const transactionConfirmationPage = new TransactionConfirmation(driver); + await transactionConfirmationPage.clickFooterConfirmButton(); +}; + /** * This function initiates the steps required to send a transaction from the homepage to final confirmation. * diff --git a/test/e2e/page-objects/flows/transaction.ts b/test/e2e/page-objects/flows/transaction.ts index e2fdbd652034..c75bf3601572 100644 --- a/test/e2e/page-objects/flows/transaction.ts +++ b/test/e2e/page-objects/flows/transaction.ts @@ -1,7 +1,7 @@ import { TransactionParams } from '@metamask/transaction-controller'; import { DEFAULT_FIXTURE_ACCOUNT } from '../../constants'; import { Driver } from '../../webdriver/driver'; -import HomePage from '../pages/homepage'; +import HomePage from '../pages/home/homepage'; import SendTokenPage from '../pages/send/send-token-page'; import TestDapp from '../pages/test-dapp'; diff --git a/test/e2e/page-objects/pages/account-list-page.ts b/test/e2e/page-objects/pages/account-list-page.ts index 5660dc616279..50eb70ce553c 100644 --- a/test/e2e/page-objects/pages/account-list-page.ts +++ b/test/e2e/page-objects/pages/account-list-page.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { Driver } from '../../webdriver/driver'; -import { largeDelayMs } from '../../helpers'; +import { largeDelayMs, regularDelayMs } from '../../helpers'; import messages from '../../../../app/_locales/en/messages.json'; class AccountListPage { @@ -8,6 +8,9 @@ class AccountListPage { private readonly accountAddressText = '.qr-code__address-segments'; + private readonly accountListAddressItem = + '[data-testid="account-list-address"]'; + private readonly accountListBalance = '[data-testid="second-currency-display"]'; @@ -40,6 +43,11 @@ class AccountListPage { private readonly addEthereumAccountButton = '[data-testid="multichain-account-menu-popover-add-account"]'; + private readonly addHardwareWalletButton = { + text: 'Add hardware wallet', + tag: 'button', + }; + private readonly addImportedAccountButton = '[data-testid="multichain-account-menu-popover-add-imported-account"]'; @@ -48,7 +56,8 @@ class AccountListPage { tag: 'button', }; - private readonly closeAccountModalButton = 'button[aria-label="Close"]'; + private readonly closeAccountModalButton = + 'header button[aria-label="Close"]'; private readonly createAccountButton = '[data-testid="multichain-account-menu-popover-action-button"]'; @@ -365,6 +374,22 @@ class AccountListPage { }); } + async check_addBitcoinAccountAvailable( + expectedAvailability: boolean, + ): Promise { + console.log( + `Check add bitcoin account button is ${ + expectedAvailability ? 'displayed ' : 'not displayed' + }`, + ); + await this.openAddAccountModal(); + if (expectedAvailability) { + await this.driver.waitForSelector(this.addBtcAccountButton); + } else { + await this.driver.assertElementNotPresent(this.addBtcAccountButton); + } + } + async openAccountOptionsMenu(): Promise { console.log(`Open account option menu`); await this.driver.waitForSelector(this.accountListItem); @@ -377,6 +402,15 @@ class AccountListPage { await this.driver.waitForSelector(this.addEthereumAccountButton); } + async openConnectHardwareWalletModal(): Promise { + console.log(`Open connect hardware wallet modal`); + await this.driver.clickElement(this.createAccountButton); + await this.driver.clickElement(this.addHardwareWalletButton); + // This delay is needed to mitigate an existing bug in FF + // See https://github.com/metamask/metamask-extension/issues/25851 + await this.driver.delay(regularDelayMs); + } + async openHiddenAccountOptions(): Promise { console.log(`Open hidden accounts options menu`); await this.driver.clickElement(this.hiddenAccountOptionsMenuButton); @@ -435,6 +469,18 @@ class AccountListPage { await this.driver.clickElement(this.pinUnpinAccountButton); } + async check_accountAddressDisplayedInAccountList( + expectedAddress: string, + ): Promise { + console.log( + `Check that account address ${expectedAddress} is displayed in account list`, + ); + await this.driver.waitForSelector({ + css: this.accountListAddressItem, + text: expectedAddress, + }); + } + /** * Checks that the account balance is displayed in the account list. * @@ -517,6 +563,19 @@ class AccountListPage { }); } + /** + * Verifies that all occurrences of the account balance value and symbol are displayed as private. + * + */ + async check_balanceIsPrivateEverywhere(): Promise { + console.log(`Verify all account balance occurrences are private`); + const balanceSelectors = { + tag: 'span', + text: '••••••', + }; + await this.driver.elementCountBecomesN(balanceSelectors, 6); + } + async check_currentAccountIsImported(): Promise { console.log(`Check that current account is an imported account`); await this.driver.waitForSelector({ diff --git a/test/e2e/page-objects/pages/asset-list.ts b/test/e2e/page-objects/pages/asset-list.ts deleted file mode 100644 index 6d6d8af391bd..000000000000 --- a/test/e2e/page-objects/pages/asset-list.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { Driver } from '../../webdriver/driver'; - -class AssetListPage { - private readonly driver: Driver; - - private readonly allNetworksOption = - '[data-testid="network-filter-all__button"]'; - - private readonly currentNetworkOption = - '[data-testid="network-filter-current__button"]'; - - private readonly networksToggle = '[data-testid="sort-by-networks"]'; - - private readonly allNetworksTotal = - '[data-testid="network-filter-all__total"]'; - - private readonly currentNetworksTotal = `${this.currentNetworkOption} [data-testid="account-value-and-suffix"]`; - - constructor(driver: Driver) { - this.driver = driver; - } - - async checkNetworkFilterText(expectedText: string): Promise { - console.log( - `Verify the displayed account label in header is: ${expectedText}`, - ); - await this.driver.waitForSelector({ - css: this.networksToggle, - text: expectedText, - }); - } - - async openNetworksFilter(): Promise { - console.log(`Opening the network filter`); - await this.driver.clickElement(this.networksToggle); - await this.driver.waitUntil( - async () => { - return await this.driver.findElement(this.allNetworksOption); - }, - { - timeout: 5000, - interval: 100, - }, - ); - } - - async getNetworksFilterLabel(): Promise { - console.log(`Retrieving the network filter label`); - const toggle = await this.driver.findElement(this.networksToggle); - const text = await toggle.getText(); - return text; - } - - async clickCurrentNetworkOption(): Promise { - console.log(`Clicking on the current network option`); - await this.driver.clickElement(this.currentNetworkOption); - - await this.driver.waitUntil( - async () => { - const label = await this.getNetworksFilterLabel(); - return label !== 'All networks'; - }, - { timeout: 5000, interval: 100 }, - ); - } - - async waitUntilAssetListHasItems(expectedItemsCount: number): Promise { - console.log(`Waiting until the asset list has ${expectedItemsCount} items`); - await this.driver.waitUntil( - async () => { - const items = await this.getNumberOfAssets(); - return items === expectedItemsCount; - }, - { timeout: 5000, interval: 100 }, - ); - } - - async waitUntilFilterLabelIs(label: string): Promise { - console.log(`Waiting until the filter label is ${label}`); - await this.driver.waitUntil( - async () => { - const currentLabel = await this.getNetworksFilterLabel(); - return currentLabel === label; - }, - { timeout: 5000, interval: 100 }, - ); - } - - async getAllNetworksOptionTotal(): Promise { - console.log(`Retrieving the "All networks" option fiat value`); - const allNetworksValueElement = await this.driver.findElement( - this.allNetworksTotal, - ); - const value = await allNetworksValueElement.getText(); - return value; - } - - async clickOnAsset(assetName: string): Promise { - const buttons = await this.driver.findElements( - '[data-testid="multichain-token-list-button"]', - ); - - for (const button of buttons) { - const text = await button.getText(); - if (text.includes(assetName)) { - await button.click(); - return; - } - } - - throw new Error(`${assetName} button not found`); - } - - async getCurrentNetworksOptionTotal(): Promise { - console.log(`Retrieving the "Current network" option fiat value`); - const allNetworksValueElement = await this.driver.findElement( - this.currentNetworksTotal, - ); - const value = await allNetworksValueElement.getText(); - return value; - } - - async selectNetworkFilterAllNetworks(): Promise { - console.log(`Selecting "All networks" from the network filter`); - await this.driver.clickElement(this.allNetworksOption); - - await this.driver.waitUntil( - async () => { - const label = await this.getNetworksFilterLabel(); - return label === 'All networks'; - }, - { timeout: 5000, interval: 100 }, - ); - } - - async selectNetworkFilterCurrentNetwork(): Promise { - console.log(`Selecting "Current network" from the network filter`); - await this.driver.clickElement(this.currentNetworkOption); - - await this.driver.waitUntil( - async () => { - const label = await this.getNetworksFilterLabel(); - return label !== 'All networks'; - }, - { timeout: 5000, interval: 100 }, - ); - } - - async getNumberOfAssets(): Promise { - console.log(`Returning the total number of asset items in the token list`); - const assets = await this.driver.findElements( - '.multichain-token-list-item', - ); - return assets.length; - } - - // Added method to check if an asset is visible - async isAssetVisible(assetName: string): Promise { - const assets = await this.driver.findElements( - '[data-testid="multichain-token-list-button"]', - ); - for (const asset of assets) { - const text = await asset.getText(); - if (text.includes(assetName)) { - return true; - } - } - return false; - } -} - -export default AssetListPage; diff --git a/test/e2e/page-objects/pages/confirmations/redesign/confirmation.ts b/test/e2e/page-objects/pages/confirmations/redesign/confirmation.ts index 1ebaf95b7dcf..9ad3e4f81007 100644 --- a/test/e2e/page-objects/pages/confirmations/redesign/confirmation.ts +++ b/test/e2e/page-objects/pages/confirmations/redesign/confirmation.ts @@ -20,6 +20,12 @@ class Confirmation { text: 'Alert', }; + private nextPageButton: RawLocator; + + private previousPageButton: RawLocator; + + private navigationTitle: RawLocator; + constructor(driver: Driver) { this.driver = driver; @@ -28,6 +34,10 @@ class Confirmation { this.headerAccountDetailsButton = '[data-testid="header-info__account-details-button"]'; this.footerCancelButton = '[data-testid="confirm-footer-cancel-button"]'; + this.nextPageButton = '[data-testid="confirm-nav__next-confirmation"]'; + this.previousPageButton = + '[data-testid="confirm-nav__previous-confirmation"]'; + this.navigationTitle = '[data-testid="confirm-page-nav-position"]'; } async clickScrollToBottomButton() { @@ -58,6 +68,29 @@ class Confirmation { async clickInlineAlert() { await this.driver.clickElement(this.inlineAlertButton); } + + async clickNextPage(): Promise { + await this.driver.clickElement(this.nextPageButton); + } + + async clickPreviousPage(): Promise { + await this.driver.clickElement(this.previousPageButton); + } + + async check_pageNumbers( + currentPage: number, + totalPages: number, + ): Promise { + try { + await this.driver.findElement({ + css: this.navigationTitle, + text: `${currentPage} of ${totalPages}`, + }); + } catch (e) { + console.log('Timeout while waiting for navigation page numbers', e); + throw e; + } + } } export default Confirmation; diff --git a/test/e2e/page-objects/pages/dialog/add-tokens.ts b/test/e2e/page-objects/pages/dialog/add-tokens.ts new file mode 100644 index 000000000000..e587113ab7f5 --- /dev/null +++ b/test/e2e/page-objects/pages/dialog/add-tokens.ts @@ -0,0 +1,50 @@ +import { strict as assert } from 'assert'; +import { Driver } from '../../../webdriver/driver'; + +class AddTokensModal { + protected driver: Driver; + + private addTokenButton = { text: 'Add token', tag: 'button' }; + + private tokenListItem = '.confirm-add-suggested-token__token-list-item'; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.tokenListItem, + this.addTokenButton, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for Add tokens dialog to be loaded', + e, + ); + throw e; + } + console.log('Add tokens dialog was loaded'); + } + + /** + * Checks the count of suggested tokens. + * + * @param expectedTokenCount - The expected count of suggested tokens. + */ + async check_SuggestedTokensCount(expectedTokenCount: number) { + const multipleSuggestedTokens = await this.driver.findElements( + this.tokenListItem, + ); + + // Confirm the expected number of tokens are present as suggested token list + assert.equal(multipleSuggestedTokens.length, expectedTokenCount); + } + + async confirmAddTokens() { + await this.driver.clickElementAndWaitForWindowToClose(this.addTokenButton); + } +} + +export default AddTokensModal; diff --git a/test/e2e/page-objects/pages/dialog/create-contract.ts b/test/e2e/page-objects/pages/dialog/create-contract.ts new file mode 100644 index 000000000000..44c101271ffe --- /dev/null +++ b/test/e2e/page-objects/pages/dialog/create-contract.ts @@ -0,0 +1,39 @@ +import { Driver } from '../../../webdriver/driver'; + +class CreateContractModal { + protected driver: Driver; + + private readonly confirmButtton = { text: 'Confirm', tag: 'button' }; + + private readonly cancelButton = { text: 'Cancel', tag: 'button' }; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.confirmButtton, + this.cancelButton, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for create contract dialog to be loaded', + e, + ); + throw e; + } + console.log('Create contract dialog was loaded'); + } + + async clickConfirm() { + await this.driver.clickElementAndWaitForWindowToClose(this.confirmButtton); + } + + async clickCancel() { + await this.driver.clickElementAndWaitForWindowToClose(this.cancelButton); + } +} + +export default CreateContractModal; diff --git a/test/e2e/page-objects/pages/dialog/select-network.ts b/test/e2e/page-objects/pages/dialog/select-network.ts index bc20c42855ae..914684c6a240 100644 --- a/test/e2e/page-objects/pages/dialog/select-network.ts +++ b/test/e2e/page-objects/pages/dialog/select-network.ts @@ -86,6 +86,7 @@ class SelectNetwork { console.log(`Click ${networkName}`); const networkNameItem = `[data-testid="${networkName}"]`; await this.driver.clickElementAndWaitToDisappear(networkNameItem); + await this.driver.assertElementNotPresent('.loading-overlay'); } async selectRPC(rpcName: string): Promise { diff --git a/test/e2e/page-objects/pages/hardware-wallet/connect-hardware-wallet-page.ts b/test/e2e/page-objects/pages/hardware-wallet/connect-hardware-wallet-page.ts new file mode 100644 index 000000000000..e3b4de3fb522 --- /dev/null +++ b/test/e2e/page-objects/pages/hardware-wallet/connect-hardware-wallet-page.ts @@ -0,0 +1,54 @@ +import { Driver } from '../../../webdriver/driver'; + +/** + * Represents the page for connecting hardware wallets. + * This page allows users to initiate connections with various hardware wallet types. + */ +class ConnectHardwareWalletPage { + private driver: Driver; + + private readonly connectHardwareWalletPageTitle = { + text: 'Connect a hardware wallet', + tag: 'h3', + }; + + private readonly connectLatticeButton = '[data-testid="connect-lattice-btn"]'; + + private readonly connectTrezorButton = '[data-testid="connect-trezor-btn"]'; + + private readonly continueButton = { text: 'Continue', tag: 'button' }; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.connectHardwareWalletPageTitle, + this.connectLatticeButton, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for connect hardware wallet page to be loaded', + e, + ); + throw e; + } + console.log('Connect hardware wallet page is loaded'); + } + + async openConnectLatticePage(): Promise { + console.log(`Open connect lattice page`); + await this.driver.clickElement(this.connectLatticeButton); + await this.driver.clickElement(this.continueButton); + } + + async openConnectTrezorPage(): Promise { + console.log(`Open connect trezor page`); + await this.driver.clickElement(this.connectTrezorButton); + await this.driver.clickElement(this.continueButton); + } +} + +export default ConnectHardwareWalletPage; diff --git a/test/e2e/page-objects/pages/hardware-wallet/select-trezor-account-page.ts b/test/e2e/page-objects/pages/hardware-wallet/select-trezor-account-page.ts new file mode 100644 index 000000000000..65a00808c0bb --- /dev/null +++ b/test/e2e/page-objects/pages/hardware-wallet/select-trezor-account-page.ts @@ -0,0 +1,94 @@ +import { Driver } from '../../../webdriver/driver'; + +/** + * Represents the select trezor hardware wallet account page. + * This page allows users to select Trezor accounts to connect. + */ +class SelectTrezorAccountPage { + private driver: Driver; + + private readonly cancelButton = { text: 'Cancel', tag: 'button' }; + + private readonly selectTrezorAccountPageTitle = { + text: 'Select an account', + tag: 'h3', + }; + + private readonly trezorAccountCheckbox = '.hw-account-list__item__checkbox'; + + private readonly unlockButton = { text: 'Unlock', tag: 'button' }; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.selectTrezorAccountPageTitle, + this.cancelButton, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for select trezor account page to be loaded', + e, + ); + throw e; + } + console.log('Select trezor account page is loaded'); + } + + async clickUnlockButton(): Promise { + console.log(`Click unlock button on select trezor account page`); + await this.driver.clickElement(this.unlockButton); + } + + async selectTrezorAccount(accountIndex: number): Promise { + console.log(`Select trezor account ${accountIndex}`); + const accountCheckboxes = await this.driver.findElements( + this.trezorAccountCheckbox, + ); + await accountCheckboxes[accountIndex - 1].click(); + } + + async unlockAccount(accountIndex: number): Promise { + console.log(`Unlock trezor account ${accountIndex}`); + await this.selectTrezorAccount(accountIndex); + await this.clickUnlockButton(); + } + + /** + * Check that the specified address is displayed in the list of accounts. + * + * @param address - The address to check for. + */ + async check_addressIsDisplayed(address: string): Promise { + console.log( + `Check that account address ${address} is displayed on select trezor account page`, + ); + await this.driver.waitForSelector({ text: address }); + } + + /** + * This function checks if the specified number of trezor account items is displayed in the trezor account list. + * + * @param expectedNumber - The number of trezor account items expected to be displayed. Defaults to 5. + * @returns A promise that resolves if the expected number of trezor account items is displayed. + */ + async check_trezorAccountNumber(expectedNumber: number = 5): Promise { + console.log( + `Waiting for ${expectedNumber} trezor account items to be displayed`, + ); + await this.driver.wait(async () => { + const trezorAccountItems = await this.driver.findElements( + this.trezorAccountCheckbox, + ); + return trezorAccountItems.length === expectedNumber; + }, 10000); + console.log( + `Expected number of trezor account items ${expectedNumber} is displayed.`, + ); + } +} + +export default SelectTrezorAccountPage; diff --git a/test/e2e/page-objects/pages/header-navbar.ts b/test/e2e/page-objects/pages/header-navbar.ts index 100c23b851e4..df45ecd0277d 100644 --- a/test/e2e/page-objects/pages/header-navbar.ts +++ b/test/e2e/page-objects/pages/header-navbar.ts @@ -1,10 +1,13 @@ import { Driver } from '../../webdriver/driver'; class HeaderNavbar { - private driver: Driver; + protected driver: Driver; private readonly accountMenuButton = '[data-testid="account-menu-icon"]'; + private readonly allPermissionsButton = + '[data-testid="global-menu-connected-sites"]'; + private readonly threeDotMenuButton = '[data-testid="account-options-menu-button"]'; @@ -54,6 +57,12 @@ class HeaderNavbar { } } + async openPermissionsPage(): Promise { + console.log('Open permissions page in header navbar'); + await this.openThreeDotMenu(); + await this.driver.clickElement(this.allPermissionsButton); + } + async openSnapListPage(): Promise { console.log('Open account snap page'); await this.openThreeDotMenu(); @@ -71,13 +80,6 @@ class HeaderNavbar { await this.driver.clickElement(this.switchNetworkDropDown); } - async check_currentSelectedNetwork(networkName: string): Promise { - console.log(`Validate the Switch network to ${networkName}`); - await this.driver.waitForSelector( - `button[data-testid="network-display"][aria-label="Network Menu ${networkName}"]`, - ); - } - /** * Verifies that the displayed account label in header matches the expected label. * @@ -92,6 +94,18 @@ class HeaderNavbar { text: expectedLabel, }); } + + /** + * Validates that the currently selected network matches the expected network name. + * + * @param networkName - The expected name of the currently selected network. + */ + async check_currentSelectedNetwork(networkName: string): Promise { + console.log(`Validate the Switch network to ${networkName}`); + await this.driver.waitForSelector( + `button[data-testid="network-display"][aria-label="Network Menu ${networkName}"]`, + ); + } } export default HeaderNavbar; diff --git a/test/e2e/page-objects/pages/home/activity-list.ts b/test/e2e/page-objects/pages/home/activity-list.ts new file mode 100644 index 000000000000..efec4bf2aa0a --- /dev/null +++ b/test/e2e/page-objects/pages/home/activity-list.ts @@ -0,0 +1,156 @@ +import { strict as assert } from 'assert'; +import { Driver } from '../../../webdriver/driver'; + +class ActivityListPage { + private readonly driver: Driver; + + private readonly completedTransactions = '[data-testid="activity-list-item"]'; + + private readonly confirmedTransactions = { + text: 'Confirmed', + css: '.transaction-status-label--confirmed', + }; + + private readonly failedTransactions = { + text: 'Failed', + css: '.transaction-status-label--failed', + }; + + private readonly transactionAmountsInActivity = + '[data-testid="transaction-list-item-primary-currency"]'; + + private readonly activityListAction = + '[data-testid="activity-list-item-action"]'; + + constructor(driver: Driver) { + this.driver = driver; + } + + /** + * This function checks the specified number of completed transactions are displayed in the activity list on the homepage. + * It waits up to 10 seconds for the expected number of completed transactions to be visible. + * + * @param expectedNumber - The number of completed transactions expected to be displayed in the activity list. Defaults to 1. + * @returns A promise that resolves if the expected number of completed transactions is displayed within the timeout period. + */ + async check_completedTxNumberDisplayedInActivity( + expectedNumber: number = 1, + ): Promise { + console.log( + `Wait for ${expectedNumber} completed transactions to be displayed in activity list`, + ); + await this.driver.wait(async () => { + const completedTxs = await this.driver.findElements( + this.completedTransactions, + ); + return completedTxs.length === expectedNumber; + }, 10000); + console.log( + `${expectedNumber} completed transactions found in activity list on homepage`, + ); + } + + /** + * This function checks if the specified number of confirmed transactions are displayed in the activity list on homepage. + * It waits up to 10 seconds for the expected number of confirmed transactions to be visible. + * + * @param expectedNumber - The number of confirmed transactions expected to be displayed in activity list. Defaults to 1. + * @returns A promise that resolves if the expected number of confirmed transactions is displayed within the timeout period. + */ + async check_confirmedTxNumberDisplayedInActivity( + expectedNumber: number = 1, + ): Promise { + console.log( + `Wait for ${expectedNumber} confirmed transactions to be displayed in activity list`, + ); + await this.driver.wait(async () => { + const confirmedTxs = await this.driver.findElements( + this.confirmedTransactions, + ); + return confirmedTxs.length === expectedNumber; + }, 10000); + console.log( + `${expectedNumber} confirmed transactions found in activity list on homepage`, + ); + } + + /** + * This function checks if the specified number of failed transactions are displayed in the activity list on homepage. + * It waits up to 10 seconds for the expected number of failed transactions to be visible. + * + * @param expectedNumber - The number of failed transactions expected to be displayed in activity list. Defaults to 1. + * @returns A promise that resolves if the expected number of failed transactions is displayed within the timeout period. + */ + async check_failedTxNumberDisplayedInActivity( + expectedNumber: number = 1, + ): Promise { + console.log( + `Wait for ${expectedNumber} failed transactions to be displayed in activity list`, + ); + await this.driver.wait(async () => { + const failedTxs = await this.driver.findElements(this.failedTransactions); + return failedTxs.length === expectedNumber; + }, 10000); + console.log( + `${expectedNumber} failed transactions found in activity list on homepage`, + ); + } + + /** + * This function checks if a specified transaction amount at the specified index matches the expected one. + * + * @param expectedAmount - The expected transaction amount to be displayed. Defaults to '-1 ETH'. + * @param expectedNumber - The 1-based index of the transaction in the activity list whose amount is to be checked. + * Defaults to 1, indicating the first transaction in the list. + * @returns A promise that resolves if the transaction amount at the specified index matches the expected amount. + * The promise is rejected if the amounts do not match or if an error occurs during the process. + * @example + * // To check if the third transaction in the activity list displays an amount of '2 ETH' + * await check_txAmountInActivity('2 ETH', 3); + */ + async check_txAmountInActivity( + expectedAmount: string = '-1 ETH', + expectedNumber: number = 1, + ): Promise { + const transactionAmounts = await this.driver.findElements( + this.transactionAmountsInActivity, + ); + const transactionAmountsText = await transactionAmounts[ + expectedNumber - 1 + ].getText(); + assert.equal( + transactionAmountsText, + expectedAmount, + `${transactionAmountsText} is displayed as transaction amount instead of ${expectedAmount} for transaction ${expectedNumber}`, + ); + console.log( + `Amount for transaction ${expectedNumber} is displayed as ${expectedAmount}`, + ); + } + + async check_txAction(expectedAction: string, expectedNumber: number = 1) { + const transactionActions = await this.driver.findElements( + this.activityListAction, + ); + + const transactionActionText = await transactionActions[ + expectedNumber - 1 + ].getText(); + + assert.equal( + transactionActionText, + expectedAction, + `${transactionActionText} is displayed as transaction action instead of ${expectedAction} for transaction ${expectedNumber}`, + ); + + console.log( + `Action for transaction ${expectedNumber} is displayed as ${expectedAction}`, + ); + } + + async check_noTxInActivity(): Promise { + await this.driver.assertElementNotPresent(this.completedTransactions); + } +} + +export default ActivityListPage; diff --git a/test/e2e/page-objects/pages/home/asset-list.ts b/test/e2e/page-objects/pages/home/asset-list.ts new file mode 100644 index 000000000000..9db896e3a035 --- /dev/null +++ b/test/e2e/page-objects/pages/home/asset-list.ts @@ -0,0 +1,240 @@ +import { Driver } from '../../../webdriver/driver'; + +class AssetListPage { + private readonly driver: Driver; + + private readonly allNetworksOption = + '[data-testid="network-filter-all__button"]'; + + private readonly allNetworksTotal = + '[data-testid="network-filter-all__total"]'; + + private readonly assetOptionsButton = '[data-testid="asset-options__button"]'; + + private readonly confirmImportTokenButton = + '[data-testid="import-tokens-modal-import-button"]'; + + private readonly confirmImportTokenMessage = { + text: 'Would you like to import this token?', + tag: 'p', + }; + + private readonly currentNetworkOption = + '[data-testid="network-filter-current__button"]'; + + private readonly currentNetworksTotal = `${this.currentNetworkOption} [data-testid="account-value-and-suffix"]`; + + private readonly hideTokenButton = '[data-testid="asset-options__hide"]'; + + private readonly hideTokenConfirmationButton = + '[data-testid="hide-token-confirmation__hide"]'; + + private readonly hideTokenConfirmationModalTitle = { + text: 'Hide token', + css: '.hide-token-confirmation__title', + }; + + private readonly importTokenModalTitle = { text: 'Import tokens', tag: 'h4' }; + + private readonly importTokensButton = '[data-testid="importTokens"]'; + + private readonly importTokensNextButton = + '[data-testid="import-tokens-button-next"]'; + + private readonly networksToggle = '[data-testid="sort-by-networks"]'; + + private readonly tokenAmountValue = + '[data-testid="multichain-token-list-item-value"]'; + + private readonly tokenListItem = + '[data-testid="multichain-token-list-button"]'; + + private readonly tokenOptionsButton = '[data-testid="import-token-button"]'; + + private readonly tokenSearchInput = 'input[placeholder="Search tokens"]'; + + constructor(driver: Driver) { + this.driver = driver; + } + + async clickCurrentNetworkOption(): Promise { + console.log(`Clicking on the current network option`); + await this.driver.clickElement(this.currentNetworkOption); + await this.driver.waitUntil( + async () => { + const label = await this.getNetworksFilterLabel(); + return label !== 'All networks'; + }, + { timeout: 5000, interval: 100 }, + ); + } + + async clickOnAsset(assetName: string): Promise { + const buttons = await this.driver.findElements(this.tokenListItem); + for (const button of buttons) { + const text = await button.getText(); + if (text.includes(assetName)) { + await button.click(); + return; + } + } + throw new Error(`${assetName} button not found`); + } + + async getCurrentNetworksOptionTotal(): Promise { + console.log(`Retrieving the "Current network" option fiat value`); + const allNetworksValueElement = await this.driver.findElement( + this.currentNetworksTotal, + ); + const value = await allNetworksValueElement.getText(); + return value; + } + + async getNetworksFilterLabel(): Promise { + console.log(`Retrieving the network filter label`); + const toggle = await this.driver.findElement(this.networksToggle); + const text = await toggle.getText(); + return text; + } + + async getNumberOfAssets(): Promise { + console.log(`Returning the total number of asset items in the token list`); + const assets = await this.driver.findElements(this.tokenListItem); + return assets.length; + } + + /** + * Hides a token by clicking on the token name, and confirming the hide modal. + * + * @param tokenName - The name of the token to hide. + */ + async hideToken(tokenName: string): Promise { + console.log(`Hide token ${tokenName} on homepage`); + await this.driver.clickElement({ text: tokenName, tag: 'p' }); + await this.driver.clickElement(this.assetOptionsButton); + await this.driver.clickElement(this.hideTokenButton); + await this.driver.waitForSelector(this.hideTokenConfirmationModalTitle); + await this.driver.clickElementAndWaitToDisappear( + this.hideTokenConfirmationButton, + ); + } + + async importTokenBySearch(tokenName: string) { + console.log(`Import token ${tokenName} on homepage by search`); + await this.driver.clickElement(this.tokenOptionsButton); + await this.driver.clickElement(this.importTokensButton); + await this.driver.waitForSelector(this.importTokenModalTitle); + await this.driver.fill(this.tokenSearchInput, tokenName); + await this.driver.clickElement({ text: tokenName, tag: 'p' }); + await this.driver.clickElement(this.importTokensNextButton); + await this.driver.waitForSelector(this.confirmImportTokenMessage); + await this.driver.clickElementAndWaitToDisappear( + this.confirmImportTokenButton, + ); + } + + async openNetworksFilter(): Promise { + console.log(`Opening the network filter`); + await this.driver.clickElement(this.networksToggle); + await this.driver.waitUntil( + async () => { + return await this.driver.findElement(this.allNetworksOption); + }, + { + timeout: 5000, + interval: 100, + }, + ); + } + + async waitUntilFilterLabelIs(label: string): Promise { + console.log(`Waiting until the filter label is ${label}`); + await this.driver.waitUntil( + async () => { + const currentLabel = await this.getNetworksFilterLabel(); + return currentLabel === label; + }, + { timeout: 5000, interval: 100 }, + ); + } + + async check_networkFilterText(expectedText: string): Promise { + console.log( + `Verify the displayed account label in header is: ${expectedText}`, + ); + await this.driver.waitForSelector({ + css: this.networksToggle, + text: expectedText, + }); + } + + /** + * Checks if the specified token amount is displayed in the token list. + * + * @param tokenAmount - The token amount to be checked for. + */ + async check_tokenAmountIsDisplayed(tokenAmount: string): Promise { + console.log(`Waiting for token amount ${tokenAmount} to be displayed`); + await this.driver.waitForSelector({ + css: this.tokenAmountValue, + text: tokenAmount, + }); + } + + /** + * Checks if the specified token amount is displayed in the token details modal. + * + * @param tokenName - The name of the token to check for. + * @param tokenAmount - The token amount to be checked for. + */ + async check_tokenAmountInTokenDetailsModal( + tokenName: string, + tokenAmount: string, + ): Promise { + console.log( + `Check that token amount ${tokenAmount} is displayed in token details modal for token ${tokenName}`, + ); + await this.driver.clickElement({ + tag: 'span', + text: tokenName, + }); + await this.driver.waitForSelector({ + css: this.tokenAmountValue, + text: tokenAmount, + }); + } + + /** + * This function checks if the specified token is displayed in the token list by its name. + * + * @param tokenName - The name of the token to check for. + * @returns A promise that resolves if the specified token is displayed. + */ + async check_tokenIsDisplayed(tokenName: string): Promise { + console.log(`Waiting for token ${tokenName} to be displayed`); + await this.driver.waitForSelector({ + text: tokenName, + tag: 'p', + }); + console.log(`Token ${tokenName} is displayed.`); + } + + /** + * This function checks if the specified number of token items is displayed in the token list. + * + * @param expectedNumber - The number of token items expected to be displayed. Defaults to 1. + * @returns A promise that resolves if the expected number of token items is displayed. + */ + async check_tokenItemNumber(expectedNumber: number = 1): Promise { + console.log(`Waiting for ${expectedNumber} token items to be displayed`); + await this.driver.wait(async () => { + const tokenItemsNumber = await this.getNumberOfAssets(); + return tokenItemsNumber === expectedNumber; + }, 10000); + console.log( + `Expected number of token items ${expectedNumber} is displayed.`, + ); + } +} + +export default AssetListPage; diff --git a/test/e2e/page-objects/pages/home/bitcoin-homepage.ts b/test/e2e/page-objects/pages/home/bitcoin-homepage.ts new file mode 100644 index 000000000000..19b235636405 --- /dev/null +++ b/test/e2e/page-objects/pages/home/bitcoin-homepage.ts @@ -0,0 +1,112 @@ +import HomePage from './homepage'; + +class BitcoinHomepage extends HomePage { + protected readonly balance = + '[data-testid="coin-overview__primary-currency"]'; + + private readonly bridgeButton = { + text: 'Bridge', + tag: 'button', + }; + + private readonly buySellButton = '[data-testid="coin-overview-buy"]'; + + private readonly receiveButton = '[data-testid="coin-overview-receive"]'; + + protected readonly sendButton = '[data-testid="coin-overview-send"]'; + + private readonly swapButton = { + text: 'Swap', + tag: 'button', + }; + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.sendButton, + this.buySellButton, + this.receiveButton, + ]); + } catch (e) { + console.log('Timeout while waiting for bitcoin homepage to be loaded', e); + throw e; + } + console.log('Bitcoin homepage is loaded'); + } + + /** + * Checks if the bridge button is enabled on bitcoin account homepage. + * + */ + async check_isBridgeButtonEnabled(): Promise { + try { + await this.driver.findClickableElement(this.bridgeButton, 1000); + } catch (e) { + console.log('Bridge button not enabled', e); + return false; + } + console.log('Bridge button is enabled'); + return true; + } + + /** + * Checks if the buy/sell button is enabled on bitcoin account homepage. + */ + async check_isBuySellButtonEnabled(): Promise { + try { + await this.driver.findClickableElement(this.buySellButton, 1000); + } catch (e) { + console.log('Buy/Sell button not enabled', e); + return false; + } + console.log('Buy/Sell button is enabled'); + return true; + } + + /** + * Checks if the expected bitcoin balance is displayed on homepage. + * + * @param expectedBalance - The expected bitcoin balance to be displayed. Defaults to '0'. + */ + async check_isExpectedBitcoinBalanceDisplayed( + expectedBalance: number = 0, + ): Promise { + console.log( + `Check if expected bitcoin balance is displayed: ${expectedBalance} BTC`, + ); + await this.driver.waitForSelector({ + css: this.balance, + text: `${expectedBalance}BTC`, + }); + } + + /** + * Checks if the receive button is enabled on bitcoin account homepage. + */ + async check_isReceiveButtonEnabled(): Promise { + try { + await this.driver.findClickableElement(this.receiveButton, 1000); + } catch (e) { + console.log('Receive button not enabled', e); + return false; + } + console.log('Receive button is enabled'); + return true; + } + + /** + * Checks if the swap button is enabled on bitcoin account homepage. + */ + async check_isSwapButtonEnabled(): Promise { + try { + await this.driver.findClickableElement(this.swapButton, 1000); + } catch (e) { + console.log('Swap button not enabled', e); + return false; + } + console.log('Swap button is enabled'); + return true; + } +} + +export default BitcoinHomepage; diff --git a/test/e2e/page-objects/pages/home/homepage.ts b/test/e2e/page-objects/pages/home/homepage.ts new file mode 100644 index 000000000000..b4b79846fb06 --- /dev/null +++ b/test/e2e/page-objects/pages/home/homepage.ts @@ -0,0 +1,216 @@ +import { Driver } from '../../../webdriver/driver'; +import { Ganache } from '../../../seeder/ganache'; +import { getCleanAppState } from '../../../helpers'; +import HeaderNavbar from '../header-navbar'; + +class HomePage { + protected driver: Driver; + + public headerNavbar: HeaderNavbar; + + private readonly activityTab = { + testId: 'account-overview__activity-tab', + }; + + protected readonly balance: string = + '[data-testid="eth-overview__primary-currency"]'; + + private readonly basicFunctionalityOffWarningMessage = { + text: 'Basic functionality is off', + css: '.mm-banner-alert', + }; + + private readonly closeUseNetworkNotificationModalButton = { + text: 'Got it', + tag: 'h6', + }; + + private readonly erc20TokenDropdown = { + testId: 'import-token-button', + }; + + private readonly nftTab = { + testId: 'account-overview__nfts-tab', + }; + + private readonly popoverBackground = '.popover-bg'; + + private readonly popoverCloseButton = { + testId: 'popover-close', + }; + + private readonly portfolioLink = '[data-testid="portfolio-link"]'; + + private readonly privacyBalanceToggle = { + testId: 'sensitive-toggle', + }; + + private readonly refreshErc20Tokens = { + testId: 'refreshList', + }; + + protected readonly sendButton: string = '[data-testid="eth-overview-send"]'; + + private readonly tokensTab = { + testId: 'account-overview__asset-tab', + }; + + constructor(driver: Driver) { + this.driver = driver; + this.headerNavbar = new HeaderNavbar(driver); + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.sendButton, + this.activityTab, + this.tokensTab, + ]); + } catch (e) { + console.log('Timeout while waiting for home page to be loaded', e); + throw e; + } + console.log('Home page is loaded'); + } + + async closePopover(): Promise { + console.log('Closing popover'); + await this.driver.clickElement(this.popoverCloseButton); + } + + async closeUseNetworkNotificationModal(): Promise { + // We need to use clickElementSafe + assertElementNotPresent as sometimes the network dialog doesn't appear, as per this issue (#25788) + // TODO: change the 2 actions for clickElementAndWaitToDisappear, once the issue is fixed + await this.driver.assertElementNotPresent(this.popoverBackground); + await this.driver.clickElementSafe( + this.closeUseNetworkNotificationModalButton, + ); + await this.driver.assertElementNotPresent( + this.closeUseNetworkNotificationModalButton, + ); + } + + async goToActivityList(): Promise { + console.log(`Open activity tab on homepage`); + await this.driver.clickElement(this.activityTab); + } + + async goToNftTab(): Promise { + console.log(`Go to NFT tab on homepage`); + await this.driver.clickElement(this.nftTab); + } + + async openPortfolioPage(): Promise { + console.log(`Open portfolio page on homepage`); + await this.driver.clickElement(this.portfolioLink); + } + + async refreshErc20TokenList(): Promise { + console.log(`Refresh the ERC20 token list`); + await this.driver.clickElement(this.erc20TokenDropdown); + await this.driver.clickElement(this.refreshErc20Tokens); + } + + async startSendFlow(): Promise { + await this.driver.clickElement(this.sendButton); + } + + async togglePrivacyBalance(): Promise { + await this.driver.clickElement(this.privacyBalanceToggle); + } + + /** + * Checks if the toaster message for adding a network is displayed on the homepage. + * + * @param networkName - The name of the network that was added. + */ + async check_addNetworkMessageIsDisplayed(networkName: string): Promise { + console.log( + `Check the toaster message for adding network ${networkName} is displayed on homepage`, + ); + await this.driver.waitForSelector({ + tag: 'h6', + text: `“${networkName}” was successfully added!`, + }); + } + + async check_basicFunctionalityOffWarnigMessageIsDisplayed(): Promise { + console.log( + 'Check if basic functionality off warning message is displayed on homepage', + ); + await this.driver.waitForSelector(this.basicFunctionalityOffWarningMessage); + } + + /** + * Checks if the toaster message for editing a network is displayed on the homepage. + * + * @param networkName - The name of the network that was edited. + */ + async check_editNetworkMessageIsDisplayed( + networkName: string, + ): Promise { + console.log( + `Check the toaster message for editing network ${networkName} is displayed on homepage`, + ); + await this.driver.waitForSelector({ + tag: 'h6', + text: `“${networkName}” was successfully edited!`, + }); + } + + /** + * Checks if the expected balance is displayed on homepage. + * + * @param expectedBalance - The expected balance to be displayed. Defaults to '0'. + * @param symbol - The symbol of the currency or token. Defaults to 'ETH'. + */ + async check_expectedBalanceIsDisplayed( + expectedBalance: string = '0', + symbol: string = 'ETH', + ): Promise { + try { + await this.driver.waitForSelector({ + css: this.balance, + text: expectedBalance, + }); + } catch (e) { + const balance = await this.driver.waitForSelector(this.balance); + const currentBalance = parseFloat(await balance.getText()); + const errorMessage = `Expected balance ${expectedBalance} ${symbol}, got balance ${currentBalance} ${symbol}`; + console.log(errorMessage, e); + throw e; + } + console.log( + `Expected balance ${expectedBalance} ${symbol} is displayed on homepage`, + ); + } + + /** + * This function checks if account syncing has been successfully completed at least once. + */ + async check_hasAccountSyncingSyncedAtLeastOnce(): Promise { + console.log('Check if account syncing has synced at least once'); + await this.driver.wait(async () => { + const uiState = await getCleanAppState(this.driver); + return uiState.metamask.hasAccountSyncingSyncedAtLeastOnce === true; + }, 10000); + } + + async check_localBlockchainBalanceIsDisplayed( + localBlockchainServer?: Ganache, + address = null, + ): Promise { + let expectedBalance: string; + if (localBlockchainServer) { + expectedBalance = ( + await localBlockchainServer.getBalance(address) + ).toString(); + } else { + expectedBalance = '0'; + } + await this.check_expectedBalanceIsDisplayed(expectedBalance); + } +} + +export default HomePage; diff --git a/test/e2e/page-objects/pages/home/nft-list.ts b/test/e2e/page-objects/pages/home/nft-list.ts new file mode 100644 index 000000000000..e26a98e44a92 --- /dev/null +++ b/test/e2e/page-objects/pages/home/nft-list.ts @@ -0,0 +1,89 @@ +import { Driver } from '../../../webdriver/driver'; + +class NftListPage { + private readonly driver: Driver; + + private readonly confirmImportNftButton = + '[data-testid="import-nfts-modal-import-button"]'; + + private readonly importNftAddressInput = '#address'; + + private readonly importNftButton = '[data-testid="import-nft-button"]'; + + private readonly importNftModalTitle = { text: 'Import NFT', tag: 'header' }; + + private readonly importNftTokenIdInput = '#token-id'; + + private readonly nftIconOnActivityList = '[data-testid="nft-item"]'; + + private readonly successImportNftMessage = { + text: 'NFT was successfully added!', + tag: 'h6', + }; + + constructor(driver: Driver) { + this.driver = driver; + } + + async clickNFTIconOnActivityList() { + await this.driver.clickElement(this.nftIconOnActivityList); + } + + /** + * Imports an NFT by entering the NFT contract address and token ID + * + * @param nftContractAddress - The address of the NFT contract to import + * @param id - The ID of the NFT to import + * @param expectedErrorMessage - Expected error message if the import should fail + */ + async importNft( + nftContractAddress: string, + id: string, + expectedErrorMessage?: string, + ) { + await this.driver.clickElement(this.importNftButton); + await this.driver.waitForSelector(this.importNftModalTitle); + await this.driver.fill(this.importNftAddressInput, nftContractAddress); + await this.driver.fill(this.importNftTokenIdInput, id); + if (expectedErrorMessage) { + await this.driver.clickElement(this.confirmImportNftButton); + await this.driver.waitForSelector({ + tag: 'p', + text: expectedErrorMessage, + }); + } else { + await this.driver.clickElementAndWaitToDisappear( + this.confirmImportNftButton, + ); + } + } + + async check_nftImageIsDisplayed(): Promise { + console.log('Check that NFT image is displayed in NFT tab on homepage'); + await this.driver.waitForSelector(this.nftIconOnActivityList); + } + + /** + * Checks if the NFT item with the specified name is displayed in the homepage nft tab. + * + * @param nftName - The name of the NFT to check for. + */ + async check_nftNameIsDisplayed(nftName: string): Promise { + console.log( + `Check that NFT item ${nftName} is displayed in NFT tab on homepage`, + ); + await this.driver.waitForSelector({ + tag: 'h5', + text: nftName, + }); + } + + async check_successImportNftMessageIsDisplayed(): Promise { + console.log( + 'Check that success imported NFT message is displayed on homepage', + ); + await this.driver.waitForSelector(this.successImportNftMessage); + } +} + +export default NftListPage; diff --git a/test/e2e/page-objects/pages/homepage.ts b/test/e2e/page-objects/pages/homepage.ts deleted file mode 100644 index 3722f35f98d9..000000000000 --- a/test/e2e/page-objects/pages/homepage.ts +++ /dev/null @@ -1,497 +0,0 @@ -import { strict as assert } from 'assert'; -import { Driver } from '../../webdriver/driver'; -import { Ganache } from '../../seeder/ganache'; -import { getCleanAppState } from '../../helpers'; -import HeaderNavbar from './header-navbar'; - -class HomePage { - private driver: Driver; - - public headerNavbar: HeaderNavbar; - - private readonly activityTab = - '[data-testid="account-overview__activity-tab"]'; - - private readonly balance = '[data-testid="eth-overview__primary-currency"]'; - - private readonly basicFunctionalityOffWarningMessage = { - text: 'Basic functionality is off', - css: '.mm-banner-alert', - }; - - private readonly closeUseNetworkNotificationModalButton = { - text: 'Got it', - tag: 'h6', - }; - - private readonly completedTransactions = '[data-testid="activity-list-item"]'; - - private readonly confirmedTransactions = { - text: 'Confirmed', - css: '.transaction-status-label--confirmed', - }; - - private readonly failedTransactions = { - text: 'Failed', - css: '.transaction-status-label--failed', - }; - - private readonly popoverBackground = '.popover-bg'; - - private readonly sendButton = '[data-testid="eth-overview-send"]'; - - private readonly tokensTab = '[data-testid="account-overview__asset-tab"]'; - - private readonly transactionAmountsInActivity = - '[data-testid="transaction-list-item-primary-currency"]'; - - // Token tab selectors - private readonly assetOptionsButton = '[data-testid="asset-options__button"]'; - - private readonly confirmImportTokenButton = - '[data-testid="import-tokens-modal-import-button"]'; - - private readonly confirmImportTokenMessage = { - text: 'Would you like to import this token?', - tag: 'p', - }; - - private readonly hideTokenButton = '[data-testid="asset-options__hide"]'; - - private readonly hideTokenConfirmationButton = - '[data-testid="hide-token-confirmation__hide"]'; - - private readonly hideTokenConfirmationModalTitle = { - text: 'Hide token', - css: '.hide-token-confirmation__title', - }; - - private readonly importTokenModalTitle = { text: 'Import tokens', tag: 'h4' }; - - private readonly importTokensButton = '[data-testid="importTokens"]'; - - private readonly importTokensNextButton = - '[data-testid="import-tokens-button-next"]'; - - private readonly tokenAmountValue = - '[data-testid="multichain-token-list-item-value"]'; - - private readonly tokenLisiItem = - '[data-testid="multichain-token-list-button"]'; - - private readonly tokenOptionsButton = '[data-testid="import-token-button"]'; - - private readonly tokenSearchInput = 'input[placeholder="Search tokens"]'; - - // NFT selectors - private readonly confirmImportNftButton = - '[data-testid="import-nfts-modal-import-button"]'; - - private readonly importNftAddressInput = '#address'; - - private readonly importNftButton = '[data-testid="import-nft-button"]'; - - private readonly importNftModalTitle = { text: 'Import NFT', tag: 'header' }; - - private readonly importNftTokenIdInput = '#token-id'; - - private readonly nftIconOnActivityList = '[data-testid="nft-item"]'; - - private readonly nftTab = '[data-testid="account-overview__nfts-tab"]'; - - private readonly popoverCloseButton = '[data-testid="popover-close"]'; - - private readonly successImportNftMessage = { - text: 'NFT was successfully added!', - tag: 'h6', - }; - - constructor(driver: Driver) { - this.driver = driver; - this.headerNavbar = new HeaderNavbar(driver); - } - - async check_pageIsLoaded(): Promise { - try { - await this.driver.waitForMultipleSelectors([ - this.sendButton, - this.activityTab, - this.tokensTab, - ]); - } catch (e) { - console.log('Timeout while waiting for home page to be loaded', e); - throw e; - } - console.log('Home page is loaded'); - } - - async clickNFTIconOnActivityList() { - await this.driver.clickElement(this.nftIconOnActivityList); - } - - async closePopover(): Promise { - console.log('Closing popover'); - await this.driver.clickElement(this.popoverCloseButton); - } - - async closeUseNetworkNotificationModal(): Promise { - // We need to use clickElementSafe + assertElementNotPresent as sometimes the network dialog doesn't appear, as per this issue (#25788) - // TODO: change the 2 actions for clickElementAndWaitToDisappear, once the issue is fixed - await this.driver.assertElementNotPresent(this.popoverBackground); - await this.driver.clickElementSafe( - this.closeUseNetworkNotificationModalButton, - ); - await this.driver.assertElementNotPresent( - this.closeUseNetworkNotificationModalButton, - ); - } - - async goToActivityList(): Promise { - console.log(`Open activity tab on homepage`); - await this.driver.clickElement(this.activityTab); - } - - async goToNftTab(): Promise { - console.log(`Go to NFT tab on homepage`); - await this.driver.clickElement(this.nftTab); - } - - /** - * Hides a token by clicking on the token name, and confirming the hide modal. - * - * @param tokenName - The name of the token to hide. - */ - async hideToken(tokenName: string): Promise { - console.log(`Hide token ${tokenName} on homepage`); - await this.driver.clickElement({ text: tokenName, tag: 'span' }); - await this.driver.clickElement(this.assetOptionsButton); - await this.driver.clickElement(this.hideTokenButton); - await this.driver.waitForSelector(this.hideTokenConfirmationModalTitle); - await this.driver.clickElementAndWaitToDisappear( - this.hideTokenConfirmationButton, - ); - } - - async startSendFlow(): Promise { - await this.driver.clickElement(this.sendButton); - } - - /** - * Imports an NFT by entering the NFT contract address and token ID - * - * @param nftContractAddress - The address of the NFT contract to import - * @param id - The ID of the NFT to import - * @param expectedErrorMessage - Expected error message if the import should fail - */ - async importNft( - nftContractAddress: string, - id: string, - expectedErrorMessage?: string, - ) { - await this.driver.clickElement(this.importNftButton); - await this.driver.waitForSelector(this.importNftModalTitle); - await this.driver.fill(this.importNftAddressInput, nftContractAddress); - await this.driver.fill(this.importNftTokenIdInput, id); - if (expectedErrorMessage) { - await this.driver.clickElement(this.confirmImportNftButton); - await this.driver.waitForSelector({ - tag: 'p', - text: expectedErrorMessage, - }); - } else { - await this.driver.clickElementAndWaitToDisappear( - this.confirmImportNftButton, - ); - } - } - - async importTokenBySearch(tokenName: string) { - console.log(`Import token ${tokenName} on homepage by search`); - await this.driver.clickElement(this.tokenOptionsButton); - await this.driver.clickElement(this.importTokensButton); - await this.driver.waitForSelector(this.importTokenModalTitle); - await this.driver.fill(this.tokenSearchInput, tokenName); - await this.driver.clickElement({ text: tokenName, tag: 'p' }); - await this.driver.clickElement(this.importTokensNextButton); - await this.driver.waitForSelector(this.confirmImportTokenMessage); - await this.driver.clickElementAndWaitToDisappear( - this.confirmImportTokenButton, - ); - } - - /** - * Checks if the toaster message for adding a network is displayed on the homepage. - * - * @param networkName - The name of the network that was added. - */ - async check_addNetworkMessageIsDisplayed(networkName: string): Promise { - console.log( - `Check the toaster message for adding network ${networkName} is displayed on homepage`, - ); - await this.driver.waitForSelector({ - tag: 'h6', - text: `“${networkName}” was successfully added!`, - }); - } - - async check_basicFunctionalityOffWarnigMessageIsDisplayed(): Promise { - console.log( - 'Check if basic functionality off warning message is displayed on homepage', - ); - await this.driver.waitForSelector(this.basicFunctionalityOffWarningMessage); - } - - /** - * This function checks the specified number of completed transactions are displayed in the activity list on the homepage. - * It waits up to 10 seconds for the expected number of completed transactions to be visible. - * - * @param expectedNumber - The number of completed transactions expected to be displayed in the activity list. Defaults to 1. - * @returns A promise that resolves if the expected number of completed transactions is displayed within the timeout period. - */ - async check_completedTxNumberDisplayedInActivity( - expectedNumber: number = 1, - ): Promise { - console.log( - `Wait for ${expectedNumber} completed transactions to be displayed in activity list`, - ); - await this.driver.wait(async () => { - const completedTxs = await this.driver.findElements( - this.completedTransactions, - ); - return completedTxs.length === expectedNumber; - }, 10000); - console.log( - `${expectedNumber} completed transactions found in activity list on homepage`, - ); - } - - /** - * This function checks if the specified number of confirmed transactions are displayed in the activity list on homepage. - * It waits up to 10 seconds for the expected number of confirmed transactions to be visible. - * - * @param expectedNumber - The number of confirmed transactions expected to be displayed in activity list. Defaults to 1. - * @returns A promise that resolves if the expected number of confirmed transactions is displayed within the timeout period. - */ - async check_confirmedTxNumberDisplayedInActivity( - expectedNumber: number = 1, - ): Promise { - console.log( - `Wait for ${expectedNumber} confirmed transactions to be displayed in activity list`, - ); - await this.driver.wait(async () => { - const confirmedTxs = await this.driver.findElements( - this.confirmedTransactions, - ); - return confirmedTxs.length === expectedNumber; - }, 10000); - console.log( - `${expectedNumber} confirmed transactions found in activity list on homepage`, - ); - } - - async check_nftImageIsDisplayed(): Promise { - console.log('Check that NFT image is displayed in NFT tab on homepage'); - await this.driver.waitForSelector(this.nftIconOnActivityList); - } - - /** - * Checks if the toaster message for editing a network is displayed on the homepage. - * - * @param networkName - The name of the network that was edited. - */ - async check_editNetworkMessageIsDisplayed( - networkName: string, - ): Promise { - console.log( - `Check the toaster message for editing network ${networkName} is displayed on homepage`, - ); - await this.driver.waitForSelector({ - tag: 'h6', - text: `“${networkName}” was successfully edited!`, - }); - } - - /** - * Checks if the expected balance is displayed on homepage. - * - * @param expectedBalance - The expected balance to be displayed. Defaults to '0'. - * @param symbol - The symbol of the currency or token. Defaults to 'ETH'. - */ - async check_expectedBalanceIsDisplayed( - expectedBalance: string = '0', - symbol: string = 'ETH', - ): Promise { - try { - await this.driver.waitForSelector({ - css: this.balance, - text: expectedBalance, - }); - } catch (e) { - const balance = await this.driver.waitForSelector(this.balance); - const currentBalance = parseFloat(await balance.getText()); - const errorMessage = `Expected balance ${expectedBalance} ${symbol}, got balance ${currentBalance} ${symbol}`; - console.log(errorMessage, e); - throw e; - } - console.log( - `Expected balance ${expectedBalance} ${symbol} is displayed on homepage`, - ); - } - - /** - * This function checks if the specified number of failed transactions are displayed in the activity list on homepage. - * It waits up to 10 seconds for the expected number of failed transactions to be visible. - * - * @param expectedNumber - The number of failed transactions expected to be displayed in activity list. Defaults to 1. - * @returns A promise that resolves if the expected number of failed transactions is displayed within the timeout period. - */ - async check_failedTxNumberDisplayedInActivity( - expectedNumber: number = 1, - ): Promise { - console.log( - `Wait for ${expectedNumber} failed transactions to be displayed in activity list`, - ); - await this.driver.wait(async () => { - const failedTxs = await this.driver.findElements(this.failedTransactions); - return failedTxs.length === expectedNumber; - }, 10000); - console.log( - `${expectedNumber} failed transactions found in activity list on homepage`, - ); - } - - async check_localBlockchainBalanceIsDisplayed( - localBlockchainServer?: Ganache, - address = null, - ): Promise { - let expectedBalance: string; - if (localBlockchainServer) { - expectedBalance = ( - await localBlockchainServer.getBalance(address) - ).toString(); - } else { - expectedBalance = '0'; - } - await this.check_expectedBalanceIsDisplayed(expectedBalance); - } - - /** - * Checks if the NFT item with the specified name is displayed in the homepage nft tab. - * - * @param nftName - The name of the NFT to check for. - */ - async check_nftNameIsDisplayed(nftName: string): Promise { - console.log( - `Check that NFT item ${nftName} is displayed in NFT tab on homepage`, - ); - await this.driver.waitForSelector({ - tag: 'h5', - text: nftName, - }); - } - - async check_successImportNftMessageIsDisplayed(): Promise { - console.log( - 'Check that success imported NFT message is displayed on homepage', - ); - await this.driver.waitForSelector(this.successImportNftMessage); - } - - /** - * Checks if the specified token amount is displayed in the token list. - * - * @param tokenAmount - The token amount to be checked for. - */ - async check_tokenAmountIsDisplayed(tokenAmount: string): Promise { - console.log(`Waiting for token amount ${tokenAmount} to be displayed`); - await this.driver.waitForSelector({ - css: this.tokenAmountValue, - text: tokenAmount, - }); - } - - /** - * Checks if the specified token amount is displayed in the token details modal. - * - * @param tokenName - The name of the token to check for. - * @param tokenAmount - The token amount to be checked for. - */ - async check_tokenAmountInTokenDetailsModal( - tokenName: string, - tokenAmount: string, - ): Promise { - console.log( - `Check that token amount ${tokenAmount} is displayed in token details modal for token ${tokenName}`, - ); - await this.driver.clickElement({ - tag: 'span', - text: tokenName, - }); - await this.driver.waitForSelector({ - css: this.tokenAmountValue, - text: tokenAmount, - }); - } - - /** - * This function checks if the specified number of token items is displayed in the token list. - * - * @param expectedNumber - The number of token items expected to be displayed. Defaults to 1. - * @returns A promise that resolves if the expected number of token items is displayed. - */ - async check_tokenItemNumber(expectedNumber: number = 1): Promise { - console.log(`Waiting for ${expectedNumber} token items to be displayed`); - await this.driver.wait(async () => { - const tokenItems = await this.driver.findElements(this.tokenLisiItem); - return tokenItems.length === expectedNumber; - }, 10000); - console.log( - `Expected number of token items ${expectedNumber} is displayed.`, - ); - } - - /** - * This function checks if a specified transaction amount at the specified index matches the expected one. - * - * @param expectedAmount - The expected transaction amount to be displayed. Defaults to '-1 ETH'. - * @param expectedNumber - The 1-based index of the transaction in the activity list whose amount is to be checked. - * Defaults to 1, indicating the first transaction in the list. - * @returns A promise that resolves if the transaction amount at the specified index matches the expected amount. - * The promise is rejected if the amounts do not match or if an error occurs during the process. - * @example - * // To check if the third transaction in the activity list displays an amount of '2 ETH' - * await check_txAmountInActivity('2 ETH', 3); - */ - async check_txAmountInActivity( - expectedAmount: string = '-1 ETH', - expectedNumber: number = 1, - ): Promise { - const transactionAmounts = await this.driver.findElements( - this.transactionAmountsInActivity, - ); - const transactionAmountsText = await transactionAmounts[ - expectedNumber - 1 - ].getText(); - assert.equal( - transactionAmountsText, - expectedAmount, - `${transactionAmountsText} is displayed as transaction amount instead of ${expectedAmount} for transaction ${expectedNumber}`, - ); - console.log( - `Amount for transaction ${expectedNumber} is displayed as ${expectedAmount}`, - ); - } - - /** - * This function checks if account syncing has been successfully completed at least once. - */ - async check_hasAccountSyncingSyncedAtLeastOnce(): Promise { - console.log('Check if account syncing has synced at least once'); - await this.driver.wait(async () => { - const uiState = await getCleanAppState(this.driver); - return uiState.metamask.hasAccountSyncingSyncedAtLeastOnce === true; - }, 10000); - } -} - -export default HomePage; diff --git a/test/e2e/page-objects/pages/permission/permission-list-page.ts b/test/e2e/page-objects/pages/permission/permission-list-page.ts new file mode 100644 index 000000000000..10f214fd8da6 --- /dev/null +++ b/test/e2e/page-objects/pages/permission/permission-list-page.ts @@ -0,0 +1,50 @@ +import { Driver } from '../../../webdriver/driver'; + +/** + * Represents the permissions list page. + * This page allows users to view permissions for connected sites. + */ +class PermissionListPage { + private driver: Driver; + + private readonly permissionsPage = '[data-testid="permissions-page"]'; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForSelector(this.permissionsPage); + } catch (e) { + console.log( + 'Timeout while waiting for permission list page to be loaded', + e, + ); + throw e; + } + console.log('Permission list page is loaded'); + } + + /** + * Open permission page for site + * + * @param site - Site to open + */ + async openPermissionPageForSite(site: string): Promise { + console.log('Open permission page for site', site); + await this.driver.clickElement({ text: site, tag: 'p' }); + } + + /** + * Check if account is connected to site + * + * @param site - Site to check + */ + async check_connectedToSite(site: string): Promise { + console.log('Check if account is connected to site', site); + await this.driver.waitForSelector({ text: site, tag: 'p' }); + } +} + +export default PermissionListPage; diff --git a/test/e2e/page-objects/pages/permission/site-permission-page.ts b/test/e2e/page-objects/pages/permission/site-permission-page.ts new file mode 100644 index 000000000000..bc5eee61c781 --- /dev/null +++ b/test/e2e/page-objects/pages/permission/site-permission-page.ts @@ -0,0 +1,36 @@ +import { Driver } from '../../../webdriver/driver'; + +/** + * Represents the site permission page. + * This page allows users to view and manage permissions for a connected site. + */ +class SitePermissionPage { + private driver: Driver; + + private readonly permissionPage = '[data-testid ="connections-page"]'; + + constructor(driver: Driver) { + this.driver = driver; + } + + /** + * Check if site permission page is loaded + * + * @param site - Site to check + */ + async check_pageIsLoaded(site: string): Promise { + try { + await this.driver.waitForSelector(this.permissionPage); + await this.driver.waitForSelector({ text: site, tag: 'span' }); + } catch (e) { + console.log( + 'Timeout while waiting for site permission page to be loaded', + e, + ); + throw e; + } + console.log('Site permission page is loaded'); + } +} + +export default SitePermissionPage; diff --git a/test/e2e/page-objects/pages/settings/advanced-settings.ts b/test/e2e/page-objects/pages/settings/advanced-settings.ts new file mode 100644 index 000000000000..b93f29b58736 --- /dev/null +++ b/test/e2e/page-objects/pages/settings/advanced-settings.ts @@ -0,0 +1,32 @@ +import { Driver } from '../../../webdriver/driver'; + +class AdvancedSettings { + private readonly driver: Driver; + + private readonly downloadDataButton = '[data-testid="export-data-button"]'; + + private readonly downloadStateLogsButton = + '[data-testid="advanced-setting-state-logs"]'; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.downloadStateLogsButton, + this.downloadDataButton, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for Advanced Settings page to be loaded', + e, + ); + throw e; + } + console.log('Advanced Settings page is loaded'); + } +} + +export default AdvancedSettings; diff --git a/test/e2e/page-objects/pages/settings/experimental-settings.ts b/test/e2e/page-objects/pages/settings/experimental-settings.ts index 3af5c8a538e4..f551db6d47c5 100644 --- a/test/e2e/page-objects/pages/settings/experimental-settings.ts +++ b/test/e2e/page-objects/pages/settings/experimental-settings.ts @@ -1,4 +1,5 @@ import { Driver } from '../../../webdriver/driver'; +import messages from '../../../../../app/_locales/en/messages.json'; class ExperimentalSettings { private readonly driver: Driver; @@ -7,6 +8,9 @@ class ExperimentalSettings { private readonly addAccountSnapToggle = '[data-testid="add-account-snap-toggle-div"]'; + private readonly addBitcoinAccountToggle = + '[data-testid="bitcoin-support-toggle-div"]'; + private readonly experimentalPageTitle = { text: 'Experimental', tag: 'h4', @@ -15,6 +19,9 @@ class ExperimentalSettings { private readonly redesignedSignatureToggle = '[data-testid="toggle-redesigned-confirmations-container"]'; + private readonly requestQueueToggle = + '[data-testid="experimental-setting-toggle-request-queue"] label'; + constructor(driver: Driver) { this.driver = driver; } @@ -32,6 +39,15 @@ class ExperimentalSettings { console.log('Experimental Settings page is loaded'); } + async toggleBitcoinAccount(): Promise { + console.log('Toggle Add new Bitcoin account on experimental setting page'); + await this.driver.waitForSelector({ + text: messages.bitcoinSupportToggleTitle.message, + tag: 'span', + }); + await this.driver.clickElement(this.addBitcoinAccountToggle); + } + async toggleAddAccountSnap(): Promise { console.log('Toggle Add Account Snap on experimental setting page'); await this.driver.clickElement(this.addAccountSnapToggle); @@ -41,6 +57,11 @@ class ExperimentalSettings { console.log('Toggle Redesigned Signature on experimental setting page'); await this.driver.clickElement(this.redesignedSignatureToggle); } + + async toggleRequestQueue(): Promise { + console.log('Toggle Request Queue on experimental setting page'); + await this.driver.clickElement(this.requestQueueToggle); + } } export default ExperimentalSettings; diff --git a/test/e2e/page-objects/pages/settings/general-settings.ts b/test/e2e/page-objects/pages/settings/general-settings.ts new file mode 100644 index 000000000000..0db61a03a23f --- /dev/null +++ b/test/e2e/page-objects/pages/settings/general-settings.ts @@ -0,0 +1,61 @@ +import { Driver } from '../../../webdriver/driver'; + +class GeneralSettings { + private readonly driver: Driver; + + private readonly generalSettingsPageTitle = { + text: 'General', + tag: 'h4', + }; + + private readonly loadingOverlaySpinner = '.loading-overlay__spinner'; + + private readonly selectLanguageField = '[data-testid="locale-select"]'; + + constructor(driver: Driver) { + this.driver = driver; + } + + async check_pageIsLoaded(): Promise { + try { + await this.check_noLoadingOverlaySpinner(); + await this.driver.waitForMultipleSelectors([ + this.generalSettingsPageTitle, + this.selectLanguageField, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for General Settings page to be loaded', + e, + ); + throw e; + } + console.log('General Settings page is loaded'); + } + + /** + * Change the language of MM on General Settings page + * + * @param languageToSelect - The language to select + */ + async changeLanguage(languageToSelect: string): Promise { + console.log( + 'Changing language to ', + languageToSelect, + 'on general settings page', + ); + await this.check_noLoadingOverlaySpinner(); + await this.driver.clickElement(this.selectLanguageField); + await this.driver.clickElement({ + text: languageToSelect, + tag: 'option', + }); + await this.check_noLoadingOverlaySpinner(); + } + + async check_noLoadingOverlaySpinner(): Promise { + await this.driver.assertElementNotPresent(this.loadingOverlaySpinner); + } +} + +export default GeneralSettings; diff --git a/test/e2e/page-objects/pages/snap-simple-keyring-page.ts b/test/e2e/page-objects/pages/snap-simple-keyring-page.ts index c75adb06da3a..21722cf7b36a 100644 --- a/test/e2e/page-objects/pages/snap-simple-keyring-page.ts +++ b/test/e2e/page-objects/pages/snap-simple-keyring-page.ts @@ -306,7 +306,10 @@ class SnapSimpleKeyringPage { await this.driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); await this.driver.clickElement(this.confirmConnectionButton); - await this.driver.waitForSelector(this.addtoMetamaskMessage); + // set a bigger timeout to wait for element as a temporary fix to reduce flakiness + await this.driver.waitForSelector(this.addtoMetamaskMessage, { + timeout: 15000, + }); await this.driver.clickElementSafe(this.snapInstallScrollButton, 200); await this.driver.waitForSelector(this.confirmAddtoMetamask); await this.driver.clickElement(this.confirmAddtoMetamask); diff --git a/test/e2e/page-objects/pages/test-dapp.ts b/test/e2e/page-objects/pages/test-dapp.ts index c31ee497152e..5471afb3556a 100644 --- a/test/e2e/page-objects/pages/test-dapp.ts +++ b/test/e2e/page-objects/pages/test-dapp.ts @@ -8,6 +8,11 @@ const DAPP_URL = `http://${DAPP_HOST_ADDRESS}`; class TestDapp { private driver: Driver; + private readonly addTokensToWalletButton = { + text: 'Add Token(s) to Wallet', + tag: 'button', + }; + private readonly confirmDepositButton = '[data-testid="confirm-footer-button"]'; @@ -16,9 +21,15 @@ class TestDapp { private readonly confirmDialogScrollButton = '[data-testid="signature-request-scroll-button"]'; + private readonly confirmScrollToBottomButtonRedesign = + '.confirm-scroll-to-bottom__button'; + private readonly confirmSignatureButton = '[data-testid="page-container-footer-next"]'; + private readonly confirmSignatureButtonRedesign = + '[data-testid="confirm-footer-button"]'; + private readonly connectAccountButton = '#connectButton'; private readonly connectMetaMaskMessage = { @@ -32,6 +43,8 @@ class TestDapp { private readonly simpleSendButton = '#sendButton'; + private readonly erc20TokenAddresses = '#erc20TokenAddresses'; + private readonly erc721MintButton = '#mintButton'; private readonly erc721TransferFromButton = '#transferFromButton'; @@ -116,6 +129,11 @@ class TestDapp { tag: 'div', }; + private readonly signTypedDataV3V4SignatureRequestMessageRedesign = { + text: 'Hello, Bob!', + tag: 'p', + }; + private readonly signTypedDataV3VerifyButton = '#signTypedDataV3Verify'; private readonly signTypedDataV3VerifyResult = '#signTypedDataV3VerifyResult'; @@ -159,11 +177,6 @@ class TestDapp { tag: 'h2', }; - private readonly updateNetworkButton = { - text: 'Update', - tag: 'button', - }; - private readonly userRejectedRequestMessage = { tag: 'span', text: 'Error: User rejected the request.', @@ -171,6 +184,11 @@ class TestDapp { private erc20TokenTransferButton = '#transferTokens'; + private createTokenButton = { + text: 'Create Token', + tag: 'button', + }; + constructor(driver: Driver) { this.driver = driver; } @@ -215,6 +233,10 @@ class TestDapp { }); } + public async clickAddTokenToWallet() { + await this.driver.clickElement(this.addTokensToWalletButton); + } + async clickSimpleSendButton() { await this.driver.clickElement(this.simpleSendButton); } @@ -267,26 +289,46 @@ class TestDapp { await this.driver.clickElement(this.erc20TokenTransferButton); } - /** - * Connect account to test dapp. - * - * @param publicAddress - The public address to connect to test dapp. - */ - async connectAccount(publicAddress: string) { - console.log('Connect account to test dapp'); - await this.driver.clickElement(this.connectAccountButton); + async confirmConnectAccountModal() { + console.log('Confirm connect account modal in notification window'); await this.driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); await this.driver.waitForSelector(this.connectMetaMaskMessage); - await this.driver.clickElementAndWaitForWindowToClose( this.confirmDialogButton, ); await this.driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await this.driver.waitForSelector({ - css: this.connectedAccount, - text: publicAddress.toLowerCase(), - }); - await this.driver.waitForSelector(this.localhostNetworkMessage); + } + + /** + * Connect account to test dapp. + * + * @param options - Options for connecting account to test dapp. + * @param [options.connectAccountButtonEnabled] - Indicates if the connect account button should be enabled. + * @param options.publicAddress - The public address to connect to test dapp. + */ + async connectAccount({ + connectAccountButtonEnabled = true, + publicAddress, + }: { + connectAccountButtonEnabled?: boolean; + publicAddress?: string; + }) { + console.log('Connect account to test dapp'); + await this.driver.clickElement(this.connectAccountButton); + if (connectAccountButtonEnabled) { + await this.confirmConnectAccountModal(); + } else { + await this.driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await this.driver.waitForSelector(this.connectMetaMaskMessage); + const confirmConnectDialogButton = await this.driver.findElement( + this.confirmDialogButton, + ); + assert.equal(await confirmConnectDialogButton.isEnabled(), false); + } + if (publicAddress) { + await this.check_connectedAccounts(publicAddress); + await this.driver.waitForSelector(this.localhostNetworkMessage); + } } async createDepositTransaction() { @@ -309,10 +351,43 @@ class TestDapp { await this.driver.clickElement(this.revokePermissionButton); await this.driver.refresh(); await this.check_pageIsLoaded(); - await this.driver.assertElementNotPresent({ - css: this.connectedAccount, - text: publicAddress.toLowerCase(), - }); + await this.check_connectedAccounts(publicAddress, false); + } + + /** + * Scrolls to the create token button and clicks it. + */ + public async findAndClickCreateToken() { + const createTokenElement = await this.driver.findElement( + this.createTokenButton, + ); + await this.driver.scrollToElement(createTokenElement); + await this.driver.clickElement(this.createTokenButton); + } + + /** + * Verifies the accounts connected to the test dapp. + * + * @param connectedAccounts - Account addresses to check if connected to test dapp, separated by a comma. + * @param shouldBeConnected - Whether the accounts should be connected to test dapp. Defaults to true. + */ + async check_connectedAccounts( + connectedAccounts: string, + shouldBeConnected: boolean = true, + ) { + if (shouldBeConnected) { + console.log('Verify connected accounts:', connectedAccounts); + await this.driver.waitForSelector({ + css: this.connectedAccount, + text: connectedAccounts.toLowerCase(), + }); + } else { + console.log('Verify accounts not connected:', connectedAccounts); + await this.driver.assertElementNotPresent({ + css: this.connectedAccount, + text: connectedAccounts.toLowerCase(), + }); + } } /** @@ -551,6 +626,24 @@ class TestDapp { }); } + /** + * Checks the count of token addresses. + * + * @param expectedCount - The expected count of token addresses. + */ + async check_TokenAddressesCount(expectedCount: number) { + console.log(`checking token addresses count: ${expectedCount}`); + await this.driver.wait(async () => { + const tokenAddressesElement = await this.driver.findElement( + this.erc20TokenAddresses, + ); + const tokenAddresses = await tokenAddressesElement.getText(); + const addresses = tokenAddresses.split(',').filter(Boolean); + + return addresses.length === expectedCount; + }, 10000); + } + async verify_successSignTypedDataV4Result(result: string) { await this.driver.waitForSelector({ css: this.signTypedDataV4Result, @@ -657,18 +750,33 @@ class TestDapp { /** * Sign a message with the signTypedDataV4 method. + * + * @param confirmationRedesign - Indicates whether the redesigned signature confirmation flow is used. Defaults to false. */ - async signTypedDataV4() { + async signTypedDataV4(confirmationRedesign: boolean = false) { console.log('Sign message with signTypedDataV4'); await this.clickSignTypedDatav4(); await this.driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await this.driver.waitForSelector( - this.signTypedDataV3V4SignatureRequestMessage, - ); - await this.driver.clickElementSafe(this.confirmDialogScrollButton, 200); - await this.driver.clickElementAndWaitForWindowToClose( - this.confirmSignatureButton, - ); + if (confirmationRedesign) { + await this.driver.waitForSelector( + this.signTypedDataV3V4SignatureRequestMessageRedesign, + ); + await this.driver.clickElementSafe( + this.confirmScrollToBottomButtonRedesign, + 200, + ); + await this.driver.clickElementAndWaitForWindowToClose( + this.confirmSignatureButtonRedesign, + ); + } else { + await this.driver.waitForSelector( + this.signTypedDataV3V4SignatureRequestMessage, + ); + await this.driver.clickElementSafe(this.confirmDialogScrollButton, 200); + await this.driver.clickElementAndWaitForWindowToClose( + this.confirmSignatureButton, + ); + } } async pasteIntoEip747ContractAddressInput() { diff --git a/test/e2e/page-objects/pages/test-snaps.ts b/test/e2e/page-objects/pages/test-snaps.ts new file mode 100644 index 000000000000..8bb285321ef5 --- /dev/null +++ b/test/e2e/page-objects/pages/test-snaps.ts @@ -0,0 +1,56 @@ +import { Driver } from '../../webdriver/driver'; +import { TEST_SNAPS_WEBSITE_URL } from '../../snaps/enums'; +import { largeDelayMs, WINDOW_TITLES } from '../../helpers'; + +export class TestSnaps { + driver: Driver; + + private readonly installedSnapsHeader = '[data-testid="InstalledSnaps"]'; + + private readonly connectDialogsSnapButton = + '[data-testid="dialogs"] [data-testid="connect-button"]'; + + private readonly dialogsSnapConfirmationButton = '#sendConfirmationButton'; + + constructor(driver: Driver) { + this.driver = driver; + } + + async openPage() { + await this.driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + await this.driver.waitForSelector(this.installedSnapsHeader); + } + + async clickConnectDialogsSnapButton() { + await this.driver.scrollToElement( + this.driver.findClickableElement(this.connectDialogsSnapButton), + ); + await this.driver.delay(largeDelayMs); + await this.driver.clickElement(this.connectDialogsSnapButton); + } + + async clickDialogsSnapConfirmationButton() { + await this.driver.clickElement(this.dialogsSnapConfirmationButton); + } + + async completeSnapInstallConfirmation() { + await this.driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + await this.driver.clickElement({ + text: 'Connect', + tag: 'button', + }); + + await this.driver.clickElement({ + text: 'Confirm', + tag: 'button', + }); + + await this.driver.clickElement({ + text: 'OK', + tag: 'button', + }); + + await this.driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps); + } +} diff --git a/test/e2e/playwright/global/specs/protect-intrinsics.spec.ts b/test/e2e/playwright/global/specs/protect-intrinsics.spec.ts index 7f67cd587f2b..63091e9fe5cc 100644 --- a/test/e2e/playwright/global/specs/protect-intrinsics.spec.ts +++ b/test/e2e/playwright/global/specs/protect-intrinsics.spec.ts @@ -1,5 +1,4 @@ import { test, expect } from '@playwright/test'; -// @ts-expect-error lint fails otherwise import 'ses'; import '../../../../../app/scripts/lockdown-run'; import '../../../../../app/scripts/lockdown-more'; diff --git a/test/e2e/playwright/shared/pageObjects/network-controller-page.ts b/test/e2e/playwright/shared/pageObjects/network-controller-page.ts index 1986de15dd88..cc496f2c9a36 100644 --- a/test/e2e/playwright/shared/pageObjects/network-controller-page.ts +++ b/test/e2e/playwright/shared/pageObjects/network-controller-page.ts @@ -88,6 +88,9 @@ export class NetworkController { await this.networkTicker.fill(options.symbol); await this.saveBtn.waitFor({ state: 'visible' }); await this.saveBtn.click({ timeout: 60000 }); + await this.page.waitForSelector(`text=/was successfully edited/`, { + timeout: 30000, + }); } async addPopularNetwork(options: { networkName: string }) { diff --git a/test/e2e/playwright/shared/pageObjects/wallet-page.ts b/test/e2e/playwright/shared/pageObjects/wallet-page.ts index 4e31441451bf..10b4be84aef8 100644 --- a/test/e2e/playwright/shared/pageObjects/wallet-page.ts +++ b/test/e2e/playwright/shared/pageObjects/wallet-page.ts @@ -1,7 +1,7 @@ import { type Locator, type Page } from '@playwright/test'; export class WalletPage { - private page: Page; + readonly page: Page; readonly importTokensButton: Locator; @@ -21,6 +21,8 @@ export class WalletPage { readonly importAccountConfirmBtn: Locator; + readonly tokenBalance: Locator; + constructor(page: Page) { this.page = page; this.swapButton = this.page.getByTestId('token-overview-button-swap'); @@ -29,6 +31,9 @@ export class WalletPage { this.importAccountButton = this.page.getByText('Import account'); this.importButton = this.page.getByText('Import ('); this.tokenTab = this.page.getByTestId('account-overview__asset-tab'); + this.tokenBalance = this.page.getByTestId( + 'multichain-token-list-item-value', + ); this.addAccountButton = this.page.getByTestId( 'multichain-account-menu-popover-action-button', ); @@ -68,4 +73,12 @@ export class WalletPage { async selectActivityList() { await this.activityListTab.click(); } + + async getTokenBalance() { + return await this.tokenBalance.first().textContent(); + } + + async waitforTokenBalance(balance: string) { + await this.page.waitForSelector(`text=/${balance}/`, { timeout: 60000 }); + } } diff --git a/test/e2e/playwright/swap/specs/swap.spec.ts b/test/e2e/playwright/swap/specs/swap.spec.ts index 73a85620eabf..ec9cd73858da 100644 --- a/test/e2e/playwright/swap/specs/swap.spec.ts +++ b/test/e2e/playwright/swap/specs/swap.spec.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import { test } from '@playwright/test'; +import { test, expect } from '@playwright/test'; import log from 'loglevel'; import { ChromeExtensionPage } from '../../shared/pageObjects/extension-page'; @@ -74,6 +74,7 @@ test.beforeAll( await networkController.addCustomNetwork(Tenderly.Mainnet); await walletPage.importAccount(wallet.privateKey); + expect(walletPage.accountMenu).toHaveText('Account 2', { timeout: 30000 }); }, ); @@ -81,7 +82,14 @@ testSet.forEach((options) => { test(`should swap ${options.type} token ${options.source} to ${options.destination} on ${options.network.name}'`, async () => { await walletPage.selectTokenWallet(); await networkController.selectNetwork(options.network); + const balance = await walletPage.getTokenBalance(); + if (balance === '0 ETH') { + test.skip(); + } + await walletPage.selectSwapAction(); + // Allow balance label to populate + await walletPage.page.waitForTimeout(3000); const quoteEntered = await swapPage.enterQuote({ from: options.source, to: options.destination, diff --git a/test/e2e/run-all.js b/test/e2e/run-all.js index b1b75d8864f6..3ef50edf66b0 100644 --- a/test/e2e/run-all.js +++ b/test/e2e/run-all.js @@ -79,7 +79,7 @@ function runningOnCircleCI(testPaths) { // 1. split the test files into chunks based on how long they take to run // 2. support "Rerun failed tests" on CircleCI const result = execSync( - 'circleci tests run --command=">test/test-results/myTestList.txt xargs echo" --split-by=timings --timings-type=filename --time-default=30s < test/test-results/fullTestList.txt', + 'circleci tests run --command=">test/test-results/myTestList.txt xargs echo" --split-by=timings --timings-type=filename --time-default=50s < test/test-results/fullTestList.txt', ).toString('utf8'); // Report if no tests found, exit gracefully diff --git a/test/e2e/set-manifest-flags.ts b/test/e2e/set-manifest-flags.ts index 75339250506f..8a7e45050f14 100644 --- a/test/e2e/set-manifest-flags.ts +++ b/test/e2e/set-manifest-flags.ts @@ -1,7 +1,7 @@ -import { execSync } from 'child_process'; import fs from 'fs'; import { merge } from 'lodash'; import { ManifestFlags } from '../../app/scripts/lib/manifestFlags'; +import { fetchManifestFlagsFromPRAndGit } from '../../development/lib/get-manifest-flag'; export const folder = `dist/${process.env.SELENIUM_BROWSER}`; @@ -12,86 +12,8 @@ function parseIntOrUndefined(value: string | undefined): number | undefined { return value ? parseInt(value, 10) : undefined; } -/** - * Search a string for `flags = {...}` and return ManifestFlags if it exists - * - * @param str - The string to search - * @param errorType - The type of error to log if parsing fails - * @returns The ManifestFlags object if valid, otherwise undefined - */ -function regexSearchForFlags( - str: string, - errorType: string, -): ManifestFlags | undefined { - // Search str for `flags = {...}` - const flagsMatch = str.match(/flags\s*=\s*(\{.*\})/u); - - if (flagsMatch) { - try { - // Get 1st capturing group from regex - return JSON.parse(flagsMatch[1]); - } catch (error) { - console.error( - `Error parsing flags from ${errorType}, ignoring flags\n`, - error, - ); - } - } - - return undefined; -} - -/** - * Add flags from the GitHub PR body if they are set - * - * To use this feature, add a line to your PR body like: - * `flags = {"sentry": {"tracesSampleRate": 0.1}}` - * (must be valid JSON) - * - * @param flags - The flags object to add to - */ -function addFlagsFromPrBody(flags: ManifestFlags) { - let body; - - try { - body = fs.readFileSync('changed-files/pr-body.txt', 'utf8'); - } catch (error) { - console.debug('No pr-body.txt, ignoring flags'); - return; - } - - const newFlags = regexSearchForFlags(body, 'PR body'); - - if (newFlags) { - // Use lodash merge to do a deep merge (spread operator is shallow) - merge(flags, newFlags); - } -} - -/** - * Add flags from the Git message if they are set - * - * To use this feature, add a line to your commit message like: - * `flags = {"sentry": {"tracesSampleRate": 0.1}}` - * (must be valid JSON) - * - * @param flags - The flags object to add to - */ -function addFlagsFromGitMessage(flags: ManifestFlags) { - const gitMessage = execSync( - `git show --format='%B' --no-patch "HEAD"`, - ).toString(); - - const newFlags = regexSearchForFlags(gitMessage, 'git message'); - - if (newFlags) { - // Use lodash merge to do a deep merge (spread operator is shallow) - merge(flags, newFlags); - } -} - // Alter the manifest with CircleCI environment variables and custom flags -export function setManifestFlags(flags: ManifestFlags = {}) { +export async function setManifestFlags(flags: ManifestFlags = {}) { if (process.env.CIRCLECI) { flags.circleci = { enabled: true, @@ -104,8 +26,8 @@ export function setManifestFlags(flags: ManifestFlags = {}) { ), }; - addFlagsFromPrBody(flags); - addFlagsFromGitMessage(flags); + const additionalManifestFlags = await fetchManifestFlagsFromPRAndGit(); + merge(flags, additionalManifestFlags); // Set `flags.sentry.forceEnable` to true by default if (flags.sentry === undefined) { diff --git a/test/e2e/snaps/enums.js b/test/e2e/snaps/enums.js index 30037479fca8..c17c4bd9eff7 100644 --- a/test/e2e/snaps/enums.js +++ b/test/e2e/snaps/enums.js @@ -1,3 +1,3 @@ module.exports = { - TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.15.3', + TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.15.4', }; diff --git a/test/e2e/snaps/test-snap-metrics.spec.js b/test/e2e/snaps/test-snap-metrics.spec.js index 6c8ac7b9530f..0b3ef8db2bf6 100644 --- a/test/e2e/snaps/test-snap-metrics.spec.js +++ b/test/e2e/snaps/test-snap-metrics.spec.js @@ -245,7 +245,7 @@ describe('Test Snap Metrics', function () { assert.deepStrictEqual(events[1].properties, { snap_id: 'npm:@metamask/notification-example-snap', origin: 'https://metamask.github.io', - version: '2.1.4', + version: '2.2.0', category: 'Snaps', locale: 'en', chain_id: '0x539', @@ -545,7 +545,7 @@ describe('Test Snap Metrics', function () { const events = await getEventPayloads(driver, mockedEndpoints); assert.deepStrictEqual(events[0].properties, { snap_id: 'npm:@metamask/notification-example-snap', - version: '2.1.4', + version: '2.2.0', category: 'Snaps', locale: 'en', chain_id: '0x539', diff --git a/test/e2e/snaps/test-snap-siginsights.spec.js b/test/e2e/snaps/test-snap-siginsights.spec.js index 94237b99c7f9..c463d09d864a 100644 --- a/test/e2e/snaps/test-snap-siginsights.spec.js +++ b/test/e2e/snaps/test-snap-siginsights.spec.js @@ -1,6 +1,7 @@ const { withFixtures, clickSignOnSignatureConfirmation, + clickSignOnRedesignedSignatureConfirmation, defaultGanacheOptions, openDapp, unlockWallet, @@ -11,494 +12,721 @@ const FixtureBuilder = require('../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); describe('Test Snap Signature Insights', function () { - it('tests Signature Insights functionality (New)', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - failOnConsoleError: false, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - // navigate to test snaps page and connect - await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); - - // wait for page to load - await driver.waitForSelector({ - text: 'Installed Snaps', - tag: 'h2', - }); - - // find and scroll to the transaction-insights snap - const snapButton1 = await driver.findElement( - '#connectsignature-insights', - ); - await driver.scrollToElement(snapButton1); - - // added delay for firefox (deflake) - await driver.delayFirefox(1000); - - // wait for and click connect - await driver.waitForSelector('#connectsignature-insights'); - await driver.clickElement('#connectsignature-insights'); - - // switch to metamask extension - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for and click connect - await driver.waitForSelector({ - text: 'Connect', - tag: 'button', - }); - await driver.clickElement({ - text: 'Connect', - tag: 'button', - }); - - // wait for and click confirm - await driver.waitForSelector({ text: 'Confirm' }); - await driver.clickElement({ - text: 'Confirm', - tag: 'button', - }); - - // wait for and click ok and wait for window to close - await driver.waitForSelector({ text: 'OK' }); - await driver.clickElementAndWaitForWindowToClose({ - text: 'OK', - tag: 'button', - }); - - // switch to test-snaps page - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps); - - // open the test-dapp page - await openDapp(driver); - - // TEST ONE: personal sign - // find and scroll to personal sign and click sign - const personalSignButton1 = await driver.findElement('#personalSign'); - await driver.scrollToElement(personalSignButton1); - await driver.clickElement('#personalSign'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for information from signature request screen - await driver.waitForSelector({ - text: 'Example `personal_sign` message', - tag: 'p', - }); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', - tag: 'p', - }); - - // Click down arrow - await driver.clickElementSafe('[aria-label="Scroll down"]'); - - // click sign button - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="confirm-footer-button"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check result of test - await driver.waitForSelector({ - text: '0xa10b6707dd79e2f1f91ba243ab7abe15a46f58b052ad9cec170c5366ef5667c447a87eba2c0a9d4c9fbfa0a23e9db1fb55865d0568c32bd7cc681b8d0860e7af1b', - tag: 'span', - }); - - // TEST TWO: sign typed data - // find and scroll to sign typed data and click sign - const signTypedButton1 = await driver.findElement('#signTypedData'); - await driver.scrollToElement(signTypedButton1); - await driver.clickElement('#signTypedData'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for information from signature request screen - await driver.waitForSelector({ - text: 'Hi, Alice!', - tag: 'p', - }); - - // click down arrow - await driver.clickElementSafe('[aria-label="Scroll down"]'); - - // required: delay for scroll to render - await driver.delay(500); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '1', - tag: 'p', - }); - - // click sign button and wait for window to close - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="confirm-footer-button"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check result of test - await driver.waitForSelector({ - text: '0x32791e3c41d40dd5bbfb42e66cf80ca354b0869ae503ad61cd19ba68e11d4f0d2e42a5835b0bfd633596b6a7834ef7d36033633a2479dacfdb96bda360d51f451b', - tag: 'span', - }); - - // TEST THREE: sign typed data v3 - // find and scroll to sign typed data v3 and click sign - const signTypedV3Button1 = await driver.findElement('#signTypedDataV3'); - await driver.scrollToElement(signTypedV3Button1); - await driver.clickElement('#signTypedDataV3'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // click down arrow - await driver.clickElementSafe('[aria-label="Scroll down"]'); - - // required: delay for scroll to render - await driver.delay(500); - - // wait for information from signature request screen - await driver.waitForSelector({ - text: 'Hello, Bob!', - tag: 'p', - }); - - // click down arrow - await driver.clickElementSafe('[aria-label="Scroll down"]'); - - // required: delay for scroll to render - await driver.delay(500); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', - tag: 'p', - }); - - // click sign button - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="confirm-footer-button"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check result of test - await driver.waitForSelector({ - text: '0x0a22f7796a2a70c8dc918e7e6eb8452c8f2999d1a1eb5ad714473d36270a40d6724472e5609948c778a07216bd082b60b6f6853d6354c731fd8ccdd3a2f4af261b', - tag: 'span', - }); - - // TEST FOUR: sign typed data v4 - // find and scroll to sign typed data v4 and click sign - const signTypedV4Button1 = await driver.findElement('#signTypedDataV4'); - await driver.scrollToElement(signTypedV4Button1); - await driver.clickElement('#signTypedDataV4'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // click down arrow - await driver.clickElementSafe('[aria-label="Scroll down"]'); - - // required: delay for scroll to render - await driver.delay(500); - - // wait for information from signature request screen - await driver.waitForSelector({ - text: 'Hello, Bob!', - tag: 'p', - }); - - // click down arrow - await driver.clickElementSafe('[aria-label="Scroll down"]'); - - // required: delay for scroll to render - await driver.delay(500); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', - tag: 'p', - }); - - // click sign button and wait for window to close - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="confirm-footer-button"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check results of test - await driver.waitForSelector({ - text: '0xcd2f9c55840f5e1bcf61812e93c1932485b524ca673b36355482a4fbdf52f692684f92b4f4ab6f6c8572dacce46bd107da154be1c06939b855ecce57a1616ba71b', - tag: 'span', - }); - }, - ); + describe('Old confirmation screens', function () { + it('tests Signature Insights functionality (Legacy)', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + failOnConsoleError: false, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + // navigate to test snaps page and connect + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + + // delay added for page render (deflake) + await driver.delay(1000); + + // find and scroll to the transaction-insights test snap + const snapButton1 = await driver.findElement( + '#connectsignature-insights', + ); + await driver.scrollToElement(snapButton1); + + // added delay for firefox (deflake) + await driver.delayFirefox(1000); + + // wait for and click connect + await driver.waitForSelector('#connectsignature-insights'); + await driver.clickElement('#connectsignature-insights'); + + // switch to metamask extension + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for and click connect + await driver.waitForSelector({ + text: 'Connect', + tag: 'button', + }); + await driver.clickElement({ + text: 'Connect', + tag: 'button', + }); + + // wait for and click confirm + await driver.waitForSelector({ text: 'Confirm' }); + await driver.clickElement({ + text: 'Confirm', + tag: 'button', + }); + + // wait for and click ok and wait for window to close + await driver.waitForSelector({ text: 'OK' }); + await driver.clickElementAndWaitForWindowToClose({ + text: 'OK', + tag: 'button', + }); + + // switch to test-snaps page + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps); + + // open the test-dapp page + await openDapp(driver); + + // TEST ONE: personal sign + // find and scroll to personal sign and click sign + const personalSignButton1 = await driver.findElement('#personalSign'); + await driver.scrollToElement(personalSignButton1); + await driver.clickElement('#personalSign'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for and click sign + await clickSignOnSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'span', + }); + await driver.clickElement('.mm-checkbox__input-wrapper'); + + // click sign button and wait for window to close + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="snapInsightsButtonConfirm"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0xa10b6707dd79e2f1f91ba243ab7abe15a46f58b052ad9cec170c5366ef5667c447a87eba2c0a9d4c9fbfa0a23e9db1fb55865d0568c32bd7cc681b8d0860e7af1b', + tag: 'span', + }); + + // TEST TWO: sign typed data + // find and scroll to sign typed data and click sign + const signTypedButton1 = await driver.findElement('#signTypedData'); + await driver.scrollToElement(signTypedButton1); + await driver.clickElement('#signTypedData'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for and click sign + await clickSignOnSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '1', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'span', + }); + await driver.clickElement('.mm-checkbox__input-wrapper'); + + // click sign button and wait for window to close + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="snapInsightsButtonConfirm"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0x32791e3c41d40dd5bbfb42e66cf80ca354b0869ae503ad61cd19ba68e11d4f0d2e42a5835b0bfd633596b6a7834ef7d36033633a2479dacfdb96bda360d51f451b', + tag: 'span', + }); + + // TEST THREE: sign typed data v3 + // find and scroll to sign typed data v3 and click sign + const signTypedV3Button1 = await driver.findElement( + '#signTypedDataV3', + ); + await driver.scrollToElement(signTypedV3Button1); + await driver.clickElement('#signTypedDataV3'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // click down arrow + await driver.clickElementSafe('.fa-arrow-down'); + + // wait for and click sign + await clickSignOnSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'span', + }); + await driver.clickElement('.mm-checkbox__input-wrapper'); + + // click sign button and wait for window to close + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="snapInsightsButtonConfirm"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0x0a22f7796a2a70c8dc918e7e6eb8452c8f2999d1a1eb5ad714473d36270a40d6724472e5609948c778a07216bd082b60b6f6853d6354c731fd8ccdd3a2f4af261b', + tag: 'span', + }); + + // TEST FOUR: sign typed data v4 + // find and scroll to sign typed data v4 and click sign + const signTypedV4Button1 = await driver.findElement( + '#signTypedDataV4', + ); + await driver.scrollToElement(signTypedV4Button1); + await driver.clickElement('#signTypedDataV4'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // click down arrow + await driver.clickElementSafe('.fa-arrow-down'); + + // wait for and click sign + await clickSignOnSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'span', + }); + await driver.clickElement('.mm-checkbox__input-wrapper'); + + // click sign button and wait for window to close + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="snapInsightsButtonConfirm"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check results of test + await driver.waitForSelector({ + text: '0xcd2f9c55840f5e1bcf61812e93c1932485b524ca673b36355482a4fbdf52f692684f92b4f4ab6f6c8572dacce46bd107da154be1c06939b855ecce57a1616ba71b', + tag: 'span', + }); + }, + ); + }); }); - it('tests Signature Insights functionality (Legacy)', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - failOnConsoleError: false, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - // navigate to test snaps page and connect - await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); - - // delay added for page render (deflake) - await driver.delay(1000); - - // find and scroll to the transaction-insights test snap - const snapButton1 = await driver.findElement( - '#connectsignature-insights', - ); - await driver.scrollToElement(snapButton1); - - // added delay for firefox (deflake) - await driver.delayFirefox(1000); - - // wait for and click connect - await driver.waitForSelector('#connectsignature-insights'); - await driver.clickElement('#connectsignature-insights'); - - // switch to metamask extension - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for and click connect - await driver.waitForSelector({ - text: 'Connect', - tag: 'button', - }); - await driver.clickElement({ - text: 'Connect', - tag: 'button', - }); - - // wait for and click confirm - await driver.waitForSelector({ text: 'Confirm' }); - await driver.clickElement({ - text: 'Confirm', - tag: 'button', - }); - - // wait for and click ok and wait for window to close - await driver.waitForSelector({ text: 'OK' }); - await driver.clickElementAndWaitForWindowToClose({ - text: 'OK', - tag: 'button', - }); - - // switch to test-snaps page - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps); - - // open the test-dapp page - await openDapp(driver); - - // TEST ONE: personal sign - // find and scroll to personal sign and click sign - const personalSignButton1 = await driver.findElement('#personalSign'); - await driver.scrollToElement(personalSignButton1); - await driver.clickElement('#personalSign'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for and click sign - await clickSignOnSignatureConfirmation({ - driver, - snapSigInsights: true, - }); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', - tag: 'p', - }); - - // wait for host to render and click checkbox to authorize signing - await driver.waitForSelector({ - text: '127.0.0.1:8080', - tag: 'span', - }); - await driver.clickElement('.mm-checkbox__input-wrapper'); - - // click sign button and wait for window to close - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="snapInsightsButtonConfirm"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check result of test - await driver.waitForSelector({ - text: '0xa10b6707dd79e2f1f91ba243ab7abe15a46f58b052ad9cec170c5366ef5667c447a87eba2c0a9d4c9fbfa0a23e9db1fb55865d0568c32bd7cc681b8d0860e7af1b', - tag: 'span', - }); - - // TEST TWO: sign typed data - // find and scroll to sign typed data and click sign - const signTypedButton1 = await driver.findElement('#signTypedData'); - await driver.scrollToElement(signTypedButton1); - await driver.clickElement('#signTypedData'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for and click sign - await clickSignOnSignatureConfirmation({ - driver, - snapSigInsights: true, - }); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '1', - tag: 'p', - }); - - // wait for host to render and click checkbox to authorize signing - await driver.waitForSelector({ - text: '127.0.0.1:8080', - tag: 'span', - }); - await driver.clickElement('.mm-checkbox__input-wrapper'); - - // click sign button and wait for window to close - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="snapInsightsButtonConfirm"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check result of test - await driver.waitForSelector({ - text: '0x32791e3c41d40dd5bbfb42e66cf80ca354b0869ae503ad61cd19ba68e11d4f0d2e42a5835b0bfd633596b6a7834ef7d36033633a2479dacfdb96bda360d51f451b', - tag: 'span', - }); - - // TEST THREE: sign typed data v3 - // find and scroll to sign typed data v3 and click sign - const signTypedV3Button1 = await driver.findElement('#signTypedDataV3'); - await driver.scrollToElement(signTypedV3Button1); - await driver.clickElement('#signTypedDataV3'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // click down arrow - await driver.waitForSelector('.fa-arrow-down'); - await driver.clickElement('.fa-arrow-down'); - - // wait for and click sign - await clickSignOnSignatureConfirmation({ - driver, - snapSigInsights: true, - }); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', - tag: 'p', - }); - - // wait for host to render and click checkbox to authorize signing - await driver.waitForSelector({ - text: '127.0.0.1:8080', - tag: 'span', - }); - await driver.clickElement('.mm-checkbox__input-wrapper'); - - // click sign button and wait for window to close - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="snapInsightsButtonConfirm"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check result of test - await driver.waitForSelector({ - text: '0x0a22f7796a2a70c8dc918e7e6eb8452c8f2999d1a1eb5ad714473d36270a40d6724472e5609948c778a07216bd082b60b6f6853d6354c731fd8ccdd3a2f4af261b', - tag: 'span', - }); - - // TEST FOUR: sign typed data v4 - // find and scroll to sign typed data v4 and click sign - const signTypedV4Button1 = await driver.findElement('#signTypedDataV4'); - await driver.scrollToElement(signTypedV4Button1); - await driver.clickElement('#signTypedDataV4'); - - // switch back to MetaMask window and switch to tx insights pane - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // click down arrow - await driver.waitForSelector('.fa-arrow-down'); - await driver.clickElement('.fa-arrow-down'); - - // wait for and click sign - await clickSignOnSignatureConfirmation({ - driver, - snapSigInsights: true, - }); - - // look for returned signature insights data - await driver.waitForSelector({ - text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', - tag: 'p', - }); - - // wait for host to render and click checkbox to authorize signing - await driver.waitForSelector({ - text: '127.0.0.1:8080', - tag: 'span', - }); - await driver.clickElement('.mm-checkbox__input-wrapper'); - - // click sign button and wait for window to close - await driver.clickElementAndWaitForWindowToClose( - '[data-testid="snapInsightsButtonConfirm"]', - ); - - // switch back to test-dapp window - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // check results of test - await driver.waitForSelector({ - text: '0xcd2f9c55840f5e1bcf61812e93c1932485b524ca673b36355482a4fbdf52f692684f92b4f4ab6f6c8572dacce46bd107da154be1c06939b855ecce57a1616ba71b', - tag: 'span', - }); - }, - ); + describe('Redesigned confirmation screens', function () { + it('tests Signature Insights functionality (New)', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + failOnConsoleError: false, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // navigate to test snaps page and connect + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + + // wait for page to load + await driver.waitForSelector({ + text: 'Installed Snaps', + tag: 'h2', + }); + + // find and scroll to the transaction-insights snap + const snapButton1 = await driver.findElement( + '#connectsignature-insights', + ); + await driver.scrollToElement(snapButton1); + + // added delay for firefox (deflake) + await driver.delayFirefox(1000); + + // wait for and click connect + await driver.waitForSelector('#connectsignature-insights'); + await driver.clickElement('#connectsignature-insights'); + + // switch to metamask extension + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for and click connect + await driver.waitForSelector({ + text: 'Connect', + tag: 'button', + }); + await driver.clickElement({ + text: 'Connect', + tag: 'button', + }); + + // wait for and click confirm + await driver.waitForSelector({ text: 'Confirm' }); + await driver.clickElement({ + text: 'Confirm', + tag: 'button', + }); + + // wait for and click ok and wait for window to close + await driver.waitForSelector({ text: 'OK' }); + await driver.clickElementAndWaitForWindowToClose({ + text: 'OK', + tag: 'button', + }); + + // switch to test-snaps page + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps); + + // open the test-dapp page + await openDapp(driver); + + // TEST ONE: personal sign + // find and scroll to personal sign and click sign + const personalSignButton1 = await driver.findElement('#personalSign'); + await driver.scrollToElement(personalSignButton1); + await driver.clickElement('#personalSign'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for information from signature request screen + await driver.waitForSelector({ + text: 'Example `personal_sign` message', + tag: 'p', + }); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', + tag: 'p', + }); + + // Click down arrow + await driver.clickElementSafe('[aria-label="Scroll down"]'); + + // click sign button + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="confirm-footer-button"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0xa10b6707dd79e2f1f91ba243ab7abe15a46f58b052ad9cec170c5366ef5667c447a87eba2c0a9d4c9fbfa0a23e9db1fb55865d0568c32bd7cc681b8d0860e7af1b', + tag: 'span', + }); + + // TEST TWO: sign typed data + // find and scroll to sign typed data and click sign + const signTypedButton1 = await driver.findElement('#signTypedData'); + await driver.scrollToElement(signTypedButton1); + await driver.clickElement('#signTypedData'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for information from signature request screen + await driver.waitForSelector({ + text: 'Hi, Alice!', + tag: 'p', + }); + + // click down arrow + await driver.clickElementSafe('[aria-label="Scroll down"]'); + + // required: delay for scroll to render + await driver.delay(500); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '1', + tag: 'p', + }); + + // click sign button and wait for window to close + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="confirm-footer-button"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0x32791e3c41d40dd5bbfb42e66cf80ca354b0869ae503ad61cd19ba68e11d4f0d2e42a5835b0bfd633596b6a7834ef7d36033633a2479dacfdb96bda360d51f451b', + tag: 'span', + }); + + // TEST THREE: sign typed data v3 + // find and scroll to sign typed data v3 and click sign + const signTypedV3Button1 = await driver.findElement( + '#signTypedDataV3', + ); + await driver.scrollToElement(signTypedV3Button1); + await driver.clickElement('#signTypedDataV3'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // click down arrow + await driver.clickElementSafe('[aria-label="Scroll down"]'); + + // required: delay for scroll to render + await driver.delay(500); + + // wait for information from signature request screen + await driver.waitForSelector({ + text: 'Hello, Bob!', + tag: 'p', + }); + + // click down arrow + await driver.clickElementSafe('[aria-label="Scroll down"]'); + + // required: delay for scroll to render + await driver.delay(500); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', + tag: 'p', + }); + + // click sign button + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="confirm-footer-button"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0x0a22f7796a2a70c8dc918e7e6eb8452c8f2999d1a1eb5ad714473d36270a40d6724472e5609948c778a07216bd082b60b6f6853d6354c731fd8ccdd3a2f4af261b', + tag: 'span', + }); + + // TEST FOUR: sign typed data v4 + // find and scroll to sign typed data v4 and click sign + const signTypedV4Button1 = await driver.findElement( + '#signTypedDataV4', + ); + await driver.scrollToElement(signTypedV4Button1); + await driver.clickElement('#signTypedDataV4'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // click down arrow + await driver.clickElementSafe('[aria-label="Scroll down"]'); + + // required: delay for scroll to render + await driver.delay(500); + + // wait for information from signature request screen + await driver.waitForSelector({ + text: 'Hello, Bob!', + tag: 'p', + }); + + // click down arrow + await driver.clickElementSafe('[aria-label="Scroll down"]'); + + // required: delay for scroll to render + await driver.delay(500); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', + tag: 'p', + }); + + // click sign button and wait for window to close + await driver.clickElementAndWaitForWindowToClose( + '[data-testid="confirm-footer-button"]', + ); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check results of test + await driver.waitForSelector({ + text: '0xcd2f9c55840f5e1bcf61812e93c1932485b524ca673b36355482a4fbdf52f692684f92b4f4ab6f6c8572dacce46bd107da154be1c06939b855ecce57a1616ba71b', + tag: 'span', + }); + }, + ); + }); + + it('tests Signature Insights functionality (Legacy)', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + failOnConsoleError: false, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // navigate to test snaps page and connect + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + + // delay added for page render (deflake) + await driver.delay(1000); + + // find and scroll to the transaction-insights test snap + const snapButton1 = await driver.findElement( + '#connectsignature-insights', + ); + await driver.scrollToElement(snapButton1); + + // added delay for firefox (deflake) + await driver.delayFirefox(1000); + + // wait for and click connect + await driver.waitForSelector('#connectsignature-insights'); + await driver.clickElement('#connectsignature-insights'); + + // switch to metamask extension + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for and click connect + await driver.waitForSelector({ + text: 'Connect', + tag: 'button', + }); + await driver.clickElement({ + text: 'Connect', + tag: 'button', + }); + + // wait for and click confirm + await driver.waitForSelector({ text: 'Confirm' }); + await driver.clickElement({ + text: 'Confirm', + tag: 'button', + }); + + // wait for and click ok and wait for window to close + await driver.waitForSelector({ text: 'OK' }); + await driver.clickElementAndWaitForWindowToClose({ + text: 'OK', + tag: 'button', + }); + + // switch to test-snaps page + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestSnaps); + + // open the test-dapp page + await openDapp(driver); + + // TEST ONE: personal sign + // find and scroll to personal sign and click sign + const personalSignButton1 = await driver.findElement('#personalSign'); + await driver.scrollToElement(personalSignButton1); + await driver.clickElement('#personalSign'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'p', + }); + + // wait for and click sign + await clickSignOnRedesignedSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0xa10b6707dd79e2f1f91ba243ab7abe15a46f58b052ad9cec170c5366ef5667c447a87eba2c0a9d4c9fbfa0a23e9db1fb55865d0568c32bd7cc681b8d0860e7af1b', + tag: 'span', + }); + + // TEST TWO: sign typed data + // find and scroll to sign typed data and click sign + const signTypedButton1 = await driver.findElement('#signTypedData'); + await driver.scrollToElement(signTypedButton1); + await driver.clickElement('#signTypedData'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '1', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'p', + }); + + // wait for and click sign + await clickSignOnRedesignedSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0x32791e3c41d40dd5bbfb42e66cf80ca354b0869ae503ad61cd19ba68e11d4f0d2e42a5835b0bfd633596b6a7834ef7d36033633a2479dacfdb96bda360d51f451b', + tag: 'span', + }); + + // TEST THREE: sign typed data v3 + // find and scroll to sign typed data v3 and click sign + const signTypedV3Button1 = await driver.findElement( + '#signTypedDataV3', + ); + await driver.scrollToElement(signTypedV3Button1); + await driver.clickElement('#signTypedDataV3'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'p', + }); + + // wait for and click sign + await clickSignOnRedesignedSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check result of test + await driver.waitForSelector({ + text: '0x0a22f7796a2a70c8dc918e7e6eb8452c8f2999d1a1eb5ad714473d36270a40d6724472e5609948c778a07216bd082b60b6f6853d6354c731fd8ccdd3a2f4af261b', + tag: 'span', + }); + + // TEST FOUR: sign typed data v4 + // find and scroll to sign typed data v4 and click sign + const signTypedV4Button1 = await driver.findElement( + '#signTypedDataV4', + ); + await driver.scrollToElement(signTypedV4Button1); + await driver.clickElement('#signTypedDataV4'); + + // switch back to MetaMask window and switch to tx insights pane + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // look for returned signature insights data + await driver.waitForSelector({ + text: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC has been identified as a malicious verifying contract.', + tag: 'p', + }); + + // wait for host to render and click checkbox to authorize signing + await driver.waitForSelector({ + text: '127.0.0.1:8080', + tag: 'p', + }); + + // wait for and click sign + await clickSignOnRedesignedSignatureConfirmation({ + driver, + snapSigInsights: true, + }); + + // switch back to test-dapp window + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // check results of test + await driver.waitForSelector({ + text: '0xcd2f9c55840f5e1bcf61812e93c1932485b524ca673b36355482a4fbdf52f692684f92b4f4ab6f6c8572dacce46bd107da154be1c06939b855ecce57a1616ba71b', + tag: 'span', + }); + }, + ); + }); }); }); diff --git a/test/e2e/tests/account/add-account.spec.ts b/test/e2e/tests/account/add-account.spec.ts index 906e01f50b4d..db62927b91d7 100644 --- a/test/e2e/tests/account/add-account.spec.ts +++ b/test/e2e/tests/account/add-account.spec.ts @@ -8,123 +8,201 @@ import { } from '../../helpers'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; import { completeImportSRPOnboardingFlow } from '../../page-objects/flows/onboarding.flow'; -import { sendTransactionToAccount } from '../../page-objects/flows/send-transaction.flow'; +import { + sendRedesignedTransactionToAccount, + sendTransactionToAccount, +} from '../../page-objects/flows/send-transaction.flow'; import AccountListPage from '../../page-objects/pages/account-list-page'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import LoginPage from '../../page-objects/pages/login-page'; import ResetPasswordPage from '../../page-objects/pages/reset-password-page'; describe('Add account', function () { - it('should not affect public address when using secret recovery phrase to recover account with non-zero balance @no-mmi', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder({ onboarding: true }).build(), - ganacheOptions: defaultGanacheOptions, - title: this.test?.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await completeImportSRPOnboardingFlow({ driver }); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - const homePage = new HomePage(driver); - await homePage.check_pageIsLoaded(); - await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); - const headerNavbar = new HeaderNavbar(driver); - await headerNavbar.openAccountMenu(); - - // Create new account with default name `newAccountName` - const newAccountName = 'Account 2'; - const accountListPage = new AccountListPage(driver); - await accountListPage.check_pageIsLoaded(); - await accountListPage.addNewAccount(); - await headerNavbar.check_accountLabel(newAccountName); - await homePage.check_expectedBalanceIsDisplayed(); - - // Switch back to the first account and transfer some balance to 2nd account so they will not be removed after recovering SRP - await headerNavbar.openAccountMenu(); - await accountListPage.check_pageIsLoaded(); - await accountListPage.check_accountDisplayedInAccountList('Account 1'); - await accountListPage.switchToAccount('Account 1'); - await headerNavbar.check_accountLabel('Account 1'); - await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); - await sendTransactionToAccount({ - driver, - recipientAccount: newAccountName, - amount: '2.8', - gasFee: '0.000042', - totalFee: '2.800042', - }); - await homePage.check_pageIsLoaded(); - await homePage.check_confirmedTxNumberDisplayedInActivity(); - await homePage.check_txAmountInActivity('-2.8 ETH'); - - // Lock wallet and recover via SRP in "forget password" option - await headerNavbar.lockMetaMask(); - await new LoginPage(driver).gotoResetPasswordPage(); - const resetPasswordPage = new ResetPasswordPage(driver); - await resetPasswordPage.check_pageIsLoaded(); - await resetPasswordPage.resetPassword(E2E_SRP, WALLET_PASSWORD); - - // Check wallet balance for both accounts - await homePage.check_pageIsLoaded(); - await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); - await headerNavbar.openAccountMenu(); - await accountListPage.check_pageIsLoaded(); - await accountListPage.check_accountDisplayedInAccountList( - newAccountName, - ); - await accountListPage.switchToAccount(newAccountName); - await headerNavbar.check_accountLabel(newAccountName); - await homePage.check_expectedBalanceIsDisplayed('2.8'); - }, - ); + describe('Old confirmation screens', function () { + it('should not affect public address when using secret recovery phrase to recover account with non-zero balance @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder({ onboarding: true }).build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await completeImportSRPOnboardingFlow({ driver }); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); + + // Create new account with default name `newAccountName` + const newAccountName = 'Account 2'; + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.addNewAccount(); + await headerNavbar.check_accountLabel(newAccountName); + await homePage.check_expectedBalanceIsDisplayed(); + + // Switch back to the first account and transfer some balance to 2nd account so they will not be removed after recovering SRP + await headerNavbar.openAccountMenu(); + await accountListPage.check_pageIsLoaded(); + await accountListPage.check_accountDisplayedInAccountList( + 'Account 1', + ); + await accountListPage.switchToAccount('Account 1'); + await headerNavbar.check_accountLabel('Account 1'); + await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); + await sendTransactionToAccount({ + driver, + recipientAccount: newAccountName, + amount: '2.8', + gasFee: '0.000042', + totalFee: '2.800042', + }); + await homePage.check_pageIsLoaded(); + const activityList = new ActivityListPage(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(); + await activityList.check_txAmountInActivity('-2.8 ETH'); + + // Lock wallet and recover via SRP in "forget password" option + await headerNavbar.lockMetaMask(); + await new LoginPage(driver).gotoResetPasswordPage(); + const resetPasswordPage = new ResetPasswordPage(driver); + await resetPasswordPage.check_pageIsLoaded(); + await resetPasswordPage.resetPassword(E2E_SRP, WALLET_PASSWORD); + + // Check wallet balance for both accounts + await homePage.check_pageIsLoaded(); + await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); + await headerNavbar.openAccountMenu(); + await accountListPage.check_pageIsLoaded(); + await accountListPage.check_accountDisplayedInAccountList( + newAccountName, + ); + await accountListPage.switchToAccount(newAccountName); + await headerNavbar.check_accountLabel(newAccountName); + await homePage.check_expectedBalanceIsDisplayed('2.8'); + }, + ); + }); }); - it('should be possible to remove an account imported with a private key, but should not be possible to remove an account generated from the SRP imported in onboarding @no-mmi', async function () { - const testPrivateKey: string = - '14abe6f4aab7f9f626fe981c864d0adeb5685f289ac9270c27b8fd790b4235d6'; - - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - title: this.test?.fullTitle(), - }, - async ({ driver }) => { - await loginWithBalanceValidation(driver); - const headerNavbar = new HeaderNavbar(driver); - const homePage = new HomePage(driver); - await headerNavbar.openAccountMenu(); - - // Create new account with default name Account 2 - const accountListPage = new AccountListPage(driver); - await accountListPage.check_pageIsLoaded(); - await accountListPage.addNewAccount(); - await headerNavbar.check_accountLabel('Account 2'); - await homePage.check_expectedBalanceIsDisplayed(); - - // Check user cannot delete 2nd account generated from the SRP imported in onboarding - await headerNavbar.openAccountMenu(); - await accountListPage.check_removeAccountButtonIsNotDisplayed( - 'Account 1', - ); - - // Create 3rd account with private key - await accountListPage.addNewImportedAccount(testPrivateKey); - await headerNavbar.check_accountLabel('Account 3'); - await homePage.check_expectedBalanceIsDisplayed(); - - // Remove the 3rd account imported with a private key - await headerNavbar.openAccountMenu(); - await accountListPage.removeAccount('Account 3'); - await homePage.check_pageIsLoaded(); - await homePage.check_expectedBalanceIsDisplayed(); - await headerNavbar.openAccountMenu(); - await accountListPage.check_accountIsNotDisplayedInAccountList( - 'Account 3', - ); - }, - ); + describe('Redesigned confirmation screens', function () { + it('should not affect public address when using secret recovery phrase to recover account with non-zero balance @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder({ onboarding: true }).build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await completeImportSRPOnboardingFlow({ driver }); + + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); + + // Create new account with default name `newAccountName` + const newAccountName = 'Account 2'; + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.addNewAccount(); + await headerNavbar.check_accountLabel(newAccountName); + await homePage.check_expectedBalanceIsDisplayed(); + + // Switch back to the first account and transfer some balance to 2nd account so they will not be removed after recovering SRP + await headerNavbar.openAccountMenu(); + await accountListPage.check_pageIsLoaded(); + await accountListPage.check_accountDisplayedInAccountList( + 'Account 1', + ); + await accountListPage.switchToAccount('Account 1'); + await headerNavbar.check_accountLabel('Account 1'); + await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); + + await sendRedesignedTransactionToAccount({ + driver, + recipientAccount: newAccountName, + amount: '2.8', + }); + + await homePage.check_pageIsLoaded(); + const activityList = new ActivityListPage(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(); + await activityList.check_txAmountInActivity('-2.8 ETH'); + + // Lock wallet and recover via SRP in "forget password" option + await headerNavbar.lockMetaMask(); + await new LoginPage(driver).gotoResetPasswordPage(); + const resetPasswordPage = new ResetPasswordPage(driver); + await resetPasswordPage.check_pageIsLoaded(); + await resetPasswordPage.resetPassword(E2E_SRP, WALLET_PASSWORD); + + // Check wallet balance for both accounts + await homePage.check_pageIsLoaded(); + await homePage.check_localBlockchainBalanceIsDisplayed(ganacheServer); + await headerNavbar.openAccountMenu(); + await accountListPage.check_pageIsLoaded(); + await accountListPage.check_accountDisplayedInAccountList( + newAccountName, + ); + await accountListPage.switchToAccount(newAccountName); + await headerNavbar.check_accountLabel(newAccountName); + await homePage.check_expectedBalanceIsDisplayed('2.8'); + }, + ); + }); + + it('should be possible to remove an account imported with a private key, but should not be possible to remove an account generated from the SRP imported in onboarding @no-mmi', async function () { + const testPrivateKey: string = + '14abe6f4aab7f9f626fe981c864d0adeb5685f289ac9270c27b8fd790b4235d6'; + + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithBalanceValidation(driver); + const headerNavbar = new HeaderNavbar(driver); + const homePage = new HomePage(driver); + await headerNavbar.openAccountMenu(); + + // Create new account with default name Account 2 + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.addNewAccount(); + await headerNavbar.check_accountLabel('Account 2'); + await homePage.check_expectedBalanceIsDisplayed(); + + // Check user cannot delete 2nd account generated from the SRP imported in onboarding + await headerNavbar.openAccountMenu(); + await accountListPage.check_removeAccountButtonIsNotDisplayed( + 'Account 1', + ); + + // Create 3rd account with private key + await accountListPage.addNewImportedAccount(testPrivateKey); + await headerNavbar.check_accountLabel('Account 3'); + await homePage.check_expectedBalanceIsDisplayed(); + + // Remove the 3rd account imported with a private key + await headerNavbar.openAccountMenu(); + await accountListPage.removeAccount('Account 3'); + await homePage.check_pageIsLoaded(); + await homePage.check_expectedBalanceIsDisplayed(); + await headerNavbar.openAccountMenu(); + await accountListPage.check_accountIsNotDisplayedInAccountList( + 'Account 3', + ); + }, + ); + }); }); }); diff --git a/test/e2e/tests/account/forgot-password.spec.ts b/test/e2e/tests/account/forgot-password.spec.ts index 698efcbe0819..62d382cd69dc 100644 --- a/test/e2e/tests/account/forgot-password.spec.ts +++ b/test/e2e/tests/account/forgot-password.spec.ts @@ -3,7 +3,7 @@ import FixtureBuilder from '../../fixture-builder'; import { Driver } from '../../webdriver/driver'; import { E2E_SRP } from '../../default-fixture'; import { Ganache } from '../../seeder/ganache'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import LoginPage from '../../page-objects/pages/login-page'; import ResetPasswordPage from '../../page-objects/pages/reset-password-page'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; diff --git a/test/e2e/tests/account/import-flow.spec.ts b/test/e2e/tests/account/import-flow.spec.ts index 8dc989db4d41..dbb7b2f85d49 100644 --- a/test/e2e/tests/account/import-flow.spec.ts +++ b/test/e2e/tests/account/import-flow.spec.ts @@ -1,15 +1,15 @@ import path from 'path'; +import { DEFAULT_FIXTURE_ACCOUNT } from '../../constants'; import { withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; import AccountListPage from '../../page-objects/pages/account-list-page'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; import { completeImportSRPOnboardingFlow } from '../../page-objects/flows/onboarding.flow'; describe('Import flow @no-mmi', function () { it('Import wallet using Secret Recovery Phrase with pasting word by word', async function () { - const testAddress = '0x5CfE73b6021E818B776b421B1c4Db2474086a7e1'; await withFixtures( { fixtures: new FixtureBuilder({ onboarding: true }).build(), @@ -33,7 +33,7 @@ describe('Import flow @no-mmi', function () { await accountListPage.check_pageIsLoaded(); await accountListPage.openAccountDetailsModal('Account 1'); await accountListPage.check_addressInAccountDetailsModal( - testAddress.toLowerCase(), + DEFAULT_FIXTURE_ACCOUNT.toLowerCase(), ); }, ); diff --git a/test/e2e/tests/account/incremental-security.spec.js b/test/e2e/tests/account/incremental-security.spec.js index f16fb5350b91..e8295de765ec 100644 --- a/test/e2e/tests/account/incremental-security.spec.js +++ b/test/e2e/tests/account/incremental-security.spec.js @@ -82,7 +82,7 @@ describe('Incremental Security', function () { await driver.findVisibleElement( '[data-testid="account-details-modal"]', ); - await driver.clickElement('button[aria-label="Close"]'); + await driver.clickElement('header button[aria-label="Close"]'); // wait for account modal to be removed from DOM await driver.assertElementNotPresent( diff --git a/test/e2e/tests/account/lock-account.spec.ts b/test/e2e/tests/account/lock-account.spec.ts index b77170c23676..06e1523889e3 100644 --- a/test/e2e/tests/account/lock-account.spec.ts +++ b/test/e2e/tests/account/lock-account.spec.ts @@ -1,7 +1,7 @@ import { Suite } from 'mocha'; import { defaultGanacheOptions, withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import { Driver } from '../../webdriver/driver'; import { Ganache } from '../../seeder/ganache'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; diff --git a/test/e2e/tests/account/migrate-old-vault.spec.ts b/test/e2e/tests/account/migrate-old-vault.spec.ts index 702729bd6fe7..372c94351465 100644 --- a/test/e2e/tests/account/migrate-old-vault.spec.ts +++ b/test/e2e/tests/account/migrate-old-vault.spec.ts @@ -3,7 +3,7 @@ import { defaultGanacheOptions, withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; import { Driver } from '../../webdriver/driver'; import { Ganache } from '../../seeder/ganache'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; describe('Migrate vault with old encryption', function (this: Suite) { diff --git a/test/e2e/tests/account/snap-account-contract-interaction.spec.ts b/test/e2e/tests/account/snap-account-contract-interaction.spec.ts index b5cfd4d2707c..4b12b71b293e 100644 --- a/test/e2e/tests/account/snap-account-contract-interaction.spec.ts +++ b/test/e2e/tests/account/snap-account-contract-interaction.spec.ts @@ -10,8 +10,9 @@ import { WINDOW_TITLES, } from '../../helpers'; import { SMART_CONTRACTS } from '../../seeder/smart-contracts'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import SnapSimpleKeyringPage from '../../page-objects/pages/snap-simple-keyring-page'; import TestDapp from '../../page-objects/pages/test-dapp'; import { installSnapSimpleKeyring } from '../../page-objects/flows/snap-simple-keyring.flow'; @@ -75,8 +76,9 @@ describe('Snap Account Contract interaction @no-mmi', function (this: Suite) { const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); await homePage.goToActivityList(); - await homePage.check_confirmedTxNumberDisplayedInActivity(); - await homePage.check_txAmountInActivity('-4 ETH'); + const activityList = new ActivityListPage(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(); + await activityList.check_txAmountInActivity('-4 ETH'); }, ); }); diff --git a/test/e2e/tests/account/snap-account-signatures-and-disconnects.spec.ts b/test/e2e/tests/account/snap-account-signatures-and-disconnects.spec.ts index 7e355302212a..d3c177ff7fdd 100644 --- a/test/e2e/tests/account/snap-account-signatures-and-disconnects.spec.ts +++ b/test/e2e/tests/account/snap-account-signatures-and-disconnects.spec.ts @@ -56,7 +56,9 @@ describe('Snap Account Signatures and Disconnects @no-mmi', function (this: Suit // Disconnect from Test Dapp and reconnect to Test Dapp await testDapp.disconnectAccount(newPublicKey); - await testDapp.connectAccount(newPublicKey); + await testDapp.connectAccount({ + publicAddress: newPublicKey, + }); // SignTypedDataV4 with Test Dapp await signTypedDataV4WithSnapAccount(driver, newPublicKey, false, true); diff --git a/test/e2e/tests/account/snap-account-transfers.spec.ts b/test/e2e/tests/account/snap-account-transfers.spec.ts index af2a61a62a39..d6ebff34d642 100644 --- a/test/e2e/tests/account/snap-account-transfers.spec.ts +++ b/test/e2e/tests/account/snap-account-transfers.spec.ts @@ -10,9 +10,10 @@ import { DEFAULT_FIXTURE_ACCOUNT } from '../../constants'; import { Driver } from '../../webdriver/driver'; import { Ganache } from '../../seeder/ganache'; import AccountListPage from '../../page-objects/pages/account-list-page'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; import FixtureBuilder from '../../fixture-builder'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import SnapSimpleKeyringPage from '../../page-objects/pages/snap-simple-keyring-page'; import { installSnapSimpleKeyring } from '../../page-objects/flows/snap-simple-keyring.flow'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; @@ -172,9 +173,10 @@ describe('Snap Account Transfers @no-mmi', function (this: Suite) { }); // check the transaction is failed in MetaMask activity list - const homepage = new HomePage(driver); - await homepage.check_pageIsLoaded(); - await homepage.check_failedTxNumberDisplayedInActivity(); + await new HomePage(driver).check_pageIsLoaded(); + await new ActivityListPage( + driver, + ).check_failedTxNumberDisplayedInActivity(); }, ); }); @@ -316,9 +318,10 @@ describe('Snap Account Transfers @no-mmi', function (this: Suite) { }); // check the transaction is failed in MetaMask activity list - const homepage = new HomePage(driver); - await homepage.check_pageIsLoaded(); - await homepage.check_failedTxNumberDisplayedInActivity(); + await new HomePage(driver).check_pageIsLoaded(); + await new ActivityListPage( + driver, + ).check_failedTxNumberDisplayedInActivity(); }, ); }); diff --git a/test/e2e/tests/bridge/bridge-button-routing.spec.ts b/test/e2e/tests/bridge/bridge-button-routing.spec.ts index a3ecb70a2967..90cd03bd6dff 100644 --- a/test/e2e/tests/bridge/bridge-button-routing.spec.ts +++ b/test/e2e/tests/bridge/bridge-button-routing.spec.ts @@ -1,11 +1,17 @@ import { Suite } from 'mocha'; import { logInWithBalanceValidation, withFixtures } from '../../helpers'; import { BridgePage, getBridgeFixtures } from './bridge-test-utils'; +import { DEFAULT_FEATURE_FLAGS_RESPONSE } from './constants'; describe('Click bridge button @no-mmi', function (this: Suite) { it('loads placeholder swap route from wallet overview when flag is turned on', async function () { await withFixtures( - getBridgeFixtures(this.test?.fullTitle(), { 'extension-support': true }), + getBridgeFixtures(this.test?.fullTitle(), { + 'extension-config': { + ...DEFAULT_FEATURE_FLAGS_RESPONSE['extension-config'], + support: true, + }, + }), async ({ driver, ganacheServer }) => { const bridgePage = new BridgePage(driver); await logInWithBalanceValidation(driver, ganacheServer); diff --git a/test/e2e/tests/bridge/bridge-test-utils.ts b/test/e2e/tests/bridge/bridge-test-utils.ts index 930f0196673e..cf57deb59f96 100644 --- a/test/e2e/tests/bridge/bridge-test-utils.ts +++ b/test/e2e/tests/bridge/bridge-test-utils.ts @@ -112,6 +112,10 @@ const mockServer = json: { ...DEFAULT_FEATURE_FLAGS_RESPONSE, ...featureFlagOverrides, + 'extension-config': { + ...DEFAULT_FEATURE_FLAGS_RESPONSE['extension-config'], + ...featureFlagOverrides['extension-config'], + }, }, }; }), diff --git a/test/e2e/tests/bridge/constants.ts b/test/e2e/tests/bridge/constants.ts index ae7fc37a62c6..d5b6da9afc61 100644 --- a/test/e2e/tests/bridge/constants.ts +++ b/test/e2e/tests/bridge/constants.ts @@ -4,10 +4,13 @@ export const DEFAULT_FEATURE_FLAGS_RESPONSE: FeatureFlagResponse = { 'extension-config': { refreshRate: 30, maxRefreshCount: 5, + support: false, + chains: { + '1': { isActiveSrc: true, isActiveDest: true }, + '42161': { isActiveSrc: true, isActiveDest: true }, + '59144': { isActiveSrc: true, isActiveDest: true }, + }, }, - 'extension-support': false, - 'src-network-allowlist': [1, 42161, 59144], - 'dest-network-allowlist': [1, 42161, 59144], }; export const LOCATOR = { diff --git a/test/e2e/tests/carousel/carousel.spec.ts b/test/e2e/tests/carousel/carousel.spec.ts new file mode 100644 index 000000000000..833fbd5ed00c --- /dev/null +++ b/test/e2e/tests/carousel/carousel.spec.ts @@ -0,0 +1,115 @@ +import { strict as assert } from 'assert'; +import { withFixtures } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; + +describe('Carousel component e2e tests', () => { + it('should display correct slides with expected content', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithBalanceValidation(driver); + + await driver.waitForSelector( + '[data-testid="eth-overview__primary-currency"]', + ); + + await driver.waitForSelector('.mm-carousel'); + await driver.waitForSelector('.mm-carousel-slide'); + + const slides = await driver.findElements('.mm-carousel-slide'); + assert.ok(slides.length > 0, 'Carousel should have slides'); + + const slideIds = ['bridge', 'card', 'fund', 'cash']; + + const firstSlideSelector = `[data-testid="slide-${slideIds[0]}"]`; + await driver.waitForSelector(firstSlideSelector); + + for (let i = 0; i < slideIds.length; i++) { + if (i > 0) { + const dots = await driver.findElements('.dot'); + await dots[i].click(); + await driver.waitForSelector( + `[data-testid="slide-${slideIds[i]}"]`, + ); + } + + const slideSelector = `[data-testid="slide-${slideIds[i]}"]`; + const currentSlide = await driver.waitForSelector(slideSelector); + assert.ok( + currentSlide, + `Slide with data-testid="slide-${slideIds[i]}" should exist`, + ); + + const hasTitle = await driver.isElementPresent( + `${slideSelector} .mm-text--body-sm-medium`, + ); + const hasDescription = await driver.isElementPresent( + `${slideSelector} .mm-text--body-xs`, + ); + + assert.ok(hasTitle, `Slide ${slideIds[i]} should have a title`); + assert.ok( + hasDescription, + `Slide ${slideIds[i]} should have a description`, + ); + } + }, + ); + }); + + it('should handle slide dismissal', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithBalanceValidation(driver); + await driver.waitForSelector('.mm-carousel'); + await driver.waitForSelector('.mm-carousel-slide'); + + const initialSlides = await driver.findElements('.mm-carousel-slide'); + assert.equal(initialSlides.length, 4); + + for (let i = 0; i < 4; i++) { + const currentSlides = await driver.findElements('.mm-carousel-slide'); + assert.equal( + currentSlides.length, + 4 - i, + `Expected ${4 - i} slides remaining`, + ); + + const dismissButton = await driver.findElement( + '.mm-carousel-slide:first-child .mm-carousel-slide__close-button', + ); + await dismissButton.click(); + + if (i < 3) { + await driver.wait(async () => { + const remainingSlides = await driver.findElements( + '.mm-carousel-slide', + ); + return remainingSlides.length === 3 - i; + }, 5e3); + } + } + + await driver.wait(async () => { + const carouselExists = await driver.isElementPresent('.mm-carousel'); + return !carouselExists; + }, 5e3); + + const carouselExists = await driver.isElementPresent('.mm-carousel'); + assert.equal( + carouselExists, + false, + 'Carousel should no longer be visible', + ); + }, + ); + }); +}); diff --git a/test/e2e/tests/confirmations/helpers.ts b/test/e2e/tests/confirmations/helpers.ts index c9001d3e0914..3e8bc10cc217 100644 --- a/test/e2e/tests/confirmations/helpers.ts +++ b/test/e2e/tests/confirmations/helpers.ts @@ -107,6 +107,15 @@ export async function mockSignatureApproved( await createMockSegmentEvent(mockServer, 'Account Details Opened'), ...anonEvents, await createMockSegmentEvent(mockServer, 'Signature Approved'), + ]; +} + +export async function mockSignatureApprovedWithDecoding( + mockServer: Mockttp, + withAnonEvents = false, +) { + return [ + ...(await mockSignatureApproved(mockServer, withAnonEvents)), await createMockSignatureDecodingEvent(mockServer), ]; } @@ -125,11 +134,20 @@ export async function mockSignatureRejected( return [ await createMockSegmentEvent(mockServer, 'Signature Requested'), await createMockSegmentEvent(mockServer, 'Signature Rejected'), - await createMockSignatureDecodingEvent(mockServer), ...anonEvents, ]; } +export async function mockSignatureRejectedWithDecoding( + mockServer: Mockttp, + withAnonEvents = false, +) { + return [ + ...(await mockSignatureRejected(mockServer, withAnonEvents)), + await createMockSignatureDecodingEvent(mockServer), + ]; +} + export async function mockPermitDecoding(mockServer: Mockttp) { return [await createMockSignatureDecodingEvent(mockServer)]; } diff --git a/test/e2e/tests/confirmations/navigation.spec.ts b/test/e2e/tests/confirmations/navigation.spec.ts index 97985381b08b..9f26fa697068 100644 --- a/test/e2e/tests/confirmations/navigation.spec.ts +++ b/test/e2e/tests/confirmations/navigation.spec.ts @@ -8,9 +8,14 @@ import { WINDOW_TITLES, } from '../../helpers'; import { Driver } from '../../webdriver/driver'; +import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; +import TestDapp from '../../page-objects/pages/test-dapp'; +import { createDappTransaction } from '../../page-objects/flows/transaction'; +import { TestSnaps } from '../../page-objects/pages/test-snaps'; +import Confirmation from '../../page-objects/pages/confirmations/redesign/confirmation'; import { withTransactionEnvelopeTypeFixtures } from './helpers'; -describe('Navigation Signature - Different signature types', function (this: Suite) { +describe('Confirmation Navigation', function (this: Suite) { it('initiates and queues multiple signatures and confirms', async function () { await withTransactionEnvelopeTypeFixtures( this.test?.fullTitle(), @@ -120,6 +125,49 @@ describe('Navigation Signature - Different signature types', function (this: Sui }, ); }); + + it('navigates between transactions, signatures, and snap dialogs', async function () { + await withTransactionEnvelopeTypeFixtures( + this.test?.fullTitle(), + TransactionEnvelopeType.feeMarket, + async ({ driver }: { driver: Driver }) => { + await loginWithoutBalanceValidation(driver); + + const testSnaps = new TestSnaps(driver); + await testSnaps.openPage(); + await testSnaps.clickConnectDialogsSnapButton(); + await testSnaps.completeSnapInstallConfirmation(); + await testSnaps.clickDialogsSnapConfirmationButton(); + + const testDapp = new TestDapp(driver); + await testDapp.openTestDappPage(); + await testDapp.clickSignTypedDatav4(); + + await createDappTransaction(driver); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + const confirmation = new Confirmation(driver); + await confirmation.check_pageNumbers(1, 3); + await driver.waitForSelector({ text: 'Confirmation Dialog' }); + + await confirmation.clickNextPage(); + await confirmation.check_pageNumbers(2, 3); + await driver.waitForSelector({ text: 'Signature request' }); + + await confirmation.clickNextPage(); + await confirmation.check_pageNumbers(3, 3); + await driver.waitForSelector({ text: 'Transfer request' }); + + await confirmation.clickPreviousPage(); + await confirmation.check_pageNumbers(2, 3); + await driver.waitForSelector({ text: 'Signature request' }); + + await confirmation.clickPreviousPage(); + await confirmation.check_pageNumbers(1, 3); + await driver.waitForSelector({ text: 'Confirmation Dialog' }); + }, + ); + }); }); async function verifySignTypedData(driver: Driver) { diff --git a/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts b/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts index 09c1e414eeee..4f1afe586116 100644 --- a/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts +++ b/test/e2e/tests/confirmations/signatures/nft-permit.spec.ts @@ -5,8 +5,8 @@ import { WINDOW_TITLES } from '../../../helpers'; import { Ganache } from '../../../seeder/ganache'; import { Driver } from '../../../webdriver/driver'; import { - mockSignatureApproved, - mockSignatureRejected, + mockSignatureApprovedWithDecoding, + mockSignatureRejectedWithDecoding, scrollAndConfirmAndAssertConfirm, withTransactionEnvelopeTypeFixtures, } from '../helpers'; @@ -78,7 +78,7 @@ describe('Confirmation Signature - NFT Permit @no-mmi', function (this: Suite) { await assertVerifiedResults(driver, publicAddress); }, - mockSignatureApproved, + mockSignatureApprovedWithDecoding, ); }); @@ -119,7 +119,7 @@ describe('Confirmation Signature - NFT Permit @no-mmi', function (this: Suite) { decodingResponse: 'CHANGE', }); }, - mockSignatureRejected, + mockSignatureRejectedWithDecoding, ); }); }); diff --git a/test/e2e/tests/confirmations/signatures/permit.spec.ts b/test/e2e/tests/confirmations/signatures/permit.spec.ts index f4c55582cb0a..ea375b0c1100 100644 --- a/test/e2e/tests/confirmations/signatures/permit.spec.ts +++ b/test/e2e/tests/confirmations/signatures/permit.spec.ts @@ -7,8 +7,8 @@ import { Ganache } from '../../../seeder/ganache'; import { Driver } from '../../../webdriver/driver'; import { mockPermitDecoding, - mockSignatureApproved, - mockSignatureRejected, + mockSignatureApprovedWithDecoding, + mockSignatureRejectedWithDecoding, scrollAndConfirmAndAssertConfirm, withTransactionEnvelopeTypeFixtures, } from '../helpers'; @@ -75,7 +75,7 @@ describe('Confirmation Signature - Permit @no-mmi', function (this: Suite) { await assertVerifiedResults(driver, publicAddress); }, - mockSignatureApproved, + mockSignatureApprovedWithDecoding, ); }); @@ -111,7 +111,7 @@ describe('Confirmation Signature - Permit @no-mmi', function (this: Suite) { decodingResponse: 'CHANGE', }); }, - mockSignatureRejected, + mockSignatureRejectedWithDecoding, ); }); diff --git a/test/e2e/tests/confirmations/signatures/signature-helpers.ts b/test/e2e/tests/confirmations/signatures/signature-helpers.ts index 050b2fc19eb7..d341a0020e56 100644 --- a/test/e2e/tests/confirmations/signatures/signature-helpers.ts +++ b/test/e2e/tests/confirmations/signatures/signature-helpers.ts @@ -294,6 +294,12 @@ function compareDecodingAPIResponse( expectedProperties: Record, eventName: string, ) { + if ( + !expectedProperties.decoding_response && + !actualProperties.decoding_response + ) { + return; + } if ( eventName === 'Signature Rejected' || eventName === 'Signature Approved' diff --git a/test/e2e/tests/confirmations/signatures/siwe.spec.ts b/test/e2e/tests/confirmations/signatures/siwe.spec.ts index ab614095d793..4e90ac788a08 100644 --- a/test/e2e/tests/confirmations/signatures/siwe.spec.ts +++ b/test/e2e/tests/confirmations/signatures/siwe.spec.ts @@ -31,7 +31,6 @@ import { } from './signature-helpers'; describe('Confirmation Signature - SIWE @no-mmi', function (this: Suite) { - this.timeout(200000); // This test is very long, so we need an unusually high timeout it('initiates and confirms', async function () { await withTransactionEnvelopeTypeFixtures( this.test?.fullTitle(), diff --git a/test/e2e/tests/confirmations/transactions/erc20-token-send-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/erc20-token-send-redesign.spec.ts index 2fbe2c553a06..317d97abef6e 100644 --- a/test/e2e/tests/confirmations/transactions/erc20-token-send-redesign.spec.ts +++ b/test/e2e/tests/confirmations/transactions/erc20-token-send-redesign.spec.ts @@ -9,7 +9,7 @@ import { import { Mockttp } from '../../../mock-e2e'; import WatchAssetConfirmation from '../../../page-objects/pages/confirmations/legacy/watch-asset-confirmation'; import TokenTransferTransactionConfirmation from '../../../page-objects/pages/confirmations/redesign/token-transfer-confirmation'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import SendTokenPage from '../../../page-objects/pages/send/send-token-page'; import TestDapp from '../../../page-objects/pages/test-dapp'; import ContractAddressRegistry from '../../../seeder/contract-address-registry'; @@ -127,6 +127,7 @@ async function createWalletInitiatedTransactionAndAssertDetails( await testDapp.openTestDappPage({ contractAddress, url: DAPP_URL }); + await driver.delay(1000); await testDapp.clickERC20WatchAssetButton(); await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); @@ -172,6 +173,7 @@ async function createDAppInitiatedTransactionAndAssertDetails( await testDapp.openTestDappPage({ contractAddress, url: DAPP_URL }); + await driver.delay(1000); await testDapp.clickERC20WatchAssetButton(); await driver.delay(veryLargeDelayMs); diff --git a/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts index c7ceb6c42c94..e949e77e0e36 100644 --- a/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts +++ b/test/e2e/tests/confirmations/transactions/erc721-approve-redesign.spec.ts @@ -145,7 +145,7 @@ async function assertApproveDetails(driver: Driver) { await driver.waitForSelector({ css: 'h2', - text: 'Allowance request', + text: 'Withdrawal request', }); await driver.waitForSelector({ diff --git a/test/e2e/tests/confirmations/transactions/native-send-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/native-send-redesign.spec.ts index 46318e113c35..bbf7481a9fc1 100644 --- a/test/e2e/tests/confirmations/transactions/native-send-redesign.spec.ts +++ b/test/e2e/tests/confirmations/transactions/native-send-redesign.spec.ts @@ -7,7 +7,7 @@ import { WINDOW_TITLES, } from '../../../helpers'; import TokenTransferTransactionConfirmation from '../../../page-objects/pages/confirmations/redesign/token-transfer-confirmation'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import SendTokenPage from '../../../page-objects/pages/send/send-token-page'; import TestDapp from '../../../page-objects/pages/test-dapp'; import { Driver } from '../../../webdriver/driver'; diff --git a/test/e2e/tests/confirmations/transactions/nft-token-send-redesign.spec.ts b/test/e2e/tests/confirmations/transactions/nft-token-send-redesign.spec.ts index 6fc048c7f11b..09bd9d4b32a2 100644 --- a/test/e2e/tests/confirmations/transactions/nft-token-send-redesign.spec.ts +++ b/test/e2e/tests/confirmations/transactions/nft-token-send-redesign.spec.ts @@ -10,7 +10,8 @@ import { Mockttp } from '../../../mock-e2e'; import WatchAssetConfirmation from '../../../page-objects/pages/confirmations/legacy/watch-asset-confirmation'; import TokenTransferTransactionConfirmation from '../../../page-objects/pages/confirmations/redesign/token-transfer-confirmation'; import TransactionConfirmation from '../../../page-objects/pages/confirmations/redesign/transaction-confirmation'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; +import NFTListPage from '../../../page-objects/pages/home/nft-list'; import NFTDetailsPage from '../../../page-objects/pages/nft-details-page'; import SendTokenPage from '../../../page-objects/pages/send/send-token-page'; import TestDapp from '../../../page-objects/pages/test-dapp'; @@ -206,9 +207,8 @@ async function createERC721WalletInitiatedTransactionAndAssertDetails( await driver.switchToWindowWithTitle(WINDOW_TITLES.ExtensionInFullScreenView); - const homePage = new HomePage(driver); - await homePage.goToNftTab(); - await homePage.clickNFTIconOnActivityList(); + await new HomePage(driver).goToNftTab(); + await new NFTListPage(driver).clickNFTIconOnActivityList(); const nftDetailsPage = new NFTDetailsPage(driver); await nftDetailsPage.clickNFTSendButton(); @@ -295,9 +295,8 @@ async function createERC1155WalletInitiatedTransactionAndAssertDetails( await watchAssetConfirmation.clickFooterConfirmButton(); await driver.switchToWindowWithTitle(WINDOW_TITLES.ExtensionInFullScreenView); - const homePage = new HomePage(driver); - await homePage.goToNftTab(); - await homePage.clickNFTIconOnActivityList(); + await new HomePage(driver).goToNftTab(); + await new NFTListPage(driver).clickNFTIconOnActivityList(); const nftDetailsPage = new NFTDetailsPage(driver); await nftDetailsPage.clickNFTSendButton(); diff --git a/test/e2e/tests/connections/connect-with-metamask.spec.js b/test/e2e/tests/connections/connect-with-metamask.spec.js index 5611b40346db..b46fc8730d84 100644 --- a/test/e2e/tests/connections/connect-with-metamask.spec.js +++ b/test/e2e/tests/connections/connect-with-metamask.spec.js @@ -55,10 +55,6 @@ describe('Connections page', function () { '[data-testid ="account-options-menu-button"]', ); await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.clickElement({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/connections/edit-account-flow.spec.js b/test/e2e/tests/connections/edit-account-flow.spec.js index 7b05f439714c..1c4899ed8328 100644 --- a/test/e2e/tests/connections/edit-account-flow.spec.js +++ b/test/e2e/tests/connections/edit-account-flow.spec.js @@ -58,10 +58,6 @@ describe('Edit Accounts Flow', function () { '[data-testid ="account-options-menu-button"]', ); await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.clickElement({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/connections/edit-networks-flow.spec.js b/test/e2e/tests/connections/edit-networks-flow.spec.js index 1db224f0ac0a..95a091f7e504 100644 --- a/test/e2e/tests/connections/edit-networks-flow.spec.js +++ b/test/e2e/tests/connections/edit-networks-flow.spec.js @@ -43,10 +43,6 @@ describe('Edit Networks Flow', function () { '[data-testid ="account-options-menu-button"]', ); await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.clickElement({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/connections/review-permissions-page.spec.js b/test/e2e/tests/connections/review-permissions-page.spec.js index d411a343b2c9..60b7df8de4e0 100644 --- a/test/e2e/tests/connections/review-permissions-page.spec.js +++ b/test/e2e/tests/connections/review-permissions-page.spec.js @@ -36,10 +36,6 @@ describe('Review Permissions page', function () { '[data-testid ="account-options-menu-button"]', ); await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.clickElement({ text: '127.0.0.1:8080', tag: 'p', @@ -90,10 +86,6 @@ describe('Review Permissions page', function () { '[data-testid ="account-options-menu-button"]', ); await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.clickElement({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/dapp-interactions/block-explorer.spec.js b/test/e2e/tests/dapp-interactions/block-explorer.spec.js index 0b01aa65aab3..d6d64dcf4322 100644 --- a/test/e2e/tests/dapp-interactions/block-explorer.spec.js +++ b/test/e2e/tests/dapp-interactions/block-explorer.spec.js @@ -82,7 +82,7 @@ describe('Block Explorer', function () { await driver.clickElement({ text: 'TST', - tag: 'span', + tag: 'p', }); await driver.clickElement('[data-testid="asset-options__button"]'); diff --git a/test/e2e/tests/dapp-interactions/dapp-interactions.spec.js b/test/e2e/tests/dapp-interactions/dapp-interactions.spec.js index 584408134f1a..05d9528ce6b4 100644 --- a/test/e2e/tests/dapp-interactions/dapp-interactions.spec.js +++ b/test/e2e/tests/dapp-interactions/dapp-interactions.spec.js @@ -83,11 +83,6 @@ describe('Dapp interactions', function () { ); await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); - const connectedDapp1 = await driver.isElementPresent({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/dapp-interactions/permissions.spec.js b/test/e2e/tests/dapp-interactions/permissions.spec.js index 4b6c210f0a98..b8da733d3160 100644 --- a/test/e2e/tests/dapp-interactions/permissions.spec.js +++ b/test/e2e/tests/dapp-interactions/permissions.spec.js @@ -46,10 +46,6 @@ describe('Permissions', function () { text: 'All Permissions', tag: 'div', }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.waitForSelector({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/dapp-interactions/signin-with-ethereum.spec.js b/test/e2e/tests/dapp-interactions/signin-with-ethereum.spec.js index b2fe384f9523..eab8dc430d40 100644 --- a/test/e2e/tests/dapp-interactions/signin-with-ethereum.spec.js +++ b/test/e2e/tests/dapp-interactions/signin-with-ethereum.spec.js @@ -11,74 +11,157 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('Sign in with ethereum', function () { - it('user should be able to confirm sign in with ethereum', async function () { - const expectedSigninMessageTitle = - 'This site is requesting to sign in with Account 1'; - const expectedSigninMessage = - 'I accept the MetaMask Terms of Service: https://community.metamask.io/tos'; - const expectedSignInResult = - '0xef8674a92d62a1876624547bdccaef6c67014ae821de18fa910fbff56577a65830f68848585b33d1f4b9ea1c3da1c1b11553b6aabe8446717daf7cd1e38a68271c'; - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); + describe('Old confirmation screens', function () { + it('user should be able to confirm sign in with ethereum', async function () { + const expectedSigninMessageTitle = + 'This site is requesting to sign in with Account 1'; + const expectedSigninMessage = + 'I accept the MetaMask Terms of Service: https://community.metamask.io/tos'; + const expectedSignInResult = + '0xef8674a92d62a1876624547bdccaef6c67014ae821de18fa910fbff56577a65830f68848585b33d1f4b9ea1c3da1c1b11553b6aabe8446717daf7cd1e38a68271c'; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); - // Create a signin with ethereum request in test dapp - await openDapp(driver); - await driver.clickElement('#siwe'); + // Create a signin with ethereum request in test dapp + await openDapp(driver); + await driver.clickElement('#siwe'); - // Wait for signature request popup and check the message title - await driver.waitUntilXWindowHandles(3); - let windowHandles = await driver.getAllWindowHandles(); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - const title = await driver.findElement( - '.permissions-connect-header__title', - ); - const origin = await driver.findElement('.site-origin'); - assert.equal(await title.getText(), 'Sign-in request'); - assert.equal(await origin.getText(), DAPP_URL); + // Wait for signature request popup and check the message title + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + const title = await driver.findElement( + '.permissions-connect-header__title', + ); + const origin = await driver.findElement('.site-origin'); + assert.equal(await title.getText(), 'Sign-in request'); + assert.equal(await origin.getText(), DAPP_URL); - const displayedMessageTitle = await driver.findElement( - '.permissions-connect-header__subtitle', - ); - const account = await driver.findElement( - '.account-list-item__account-name', - ); - assert.equal( - `${await displayedMessageTitle.getText()} ${await account.getText()}`, - expectedSigninMessageTitle, - ); + const displayedMessageTitle = await driver.findElement( + '.permissions-connect-header__subtitle', + ); + const account = await driver.findElement( + '.account-list-item__account-name', + ); + assert.equal( + `${await displayedMessageTitle.getText()} ${await account.getText()}`, + expectedSigninMessageTitle, + ); - // Check the displayed information in popup content - const [message, url, version, chainId] = await driver.findElements( - '.signature-request-siwe-message__sub-text', - ); - assert.equal(await message.getText(), expectedSigninMessage); - assert.equal(await url.getText(), 'https://127.0.0.1:8080'); - assert.equal(await version.getText(), '1'); - assert.equal(await chainId.getText(), '1'); + // Check the displayed information in popup content + const [message, url, version, chainId] = await driver.findElements( + '.signature-request-siwe-message__sub-text', + ); + assert.equal(await message.getText(), expectedSigninMessage); + assert.equal(await url.getText(), 'https://127.0.0.1:8080'); + assert.equal(await version.getText(), '1'); + assert.equal(await chainId.getText(), '1'); - // Click on extension popup to approve signin with ethereum - await driver.clickElement('[data-testid="page-container-footer-next"]'); - await driver.waitUntilXWindowHandles(2); + // Click on extension popup to approve signin with ethereum + await driver.clickElement( + '[data-testid="page-container-footer-next"]', + ); + await driver.waitUntilXWindowHandles(2); - // Switch back to the dapp and verify the signed result - windowHandles = await driver.getAllWindowHandles(); - await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); - const result = await driver.findElement('#siweResult'); - assert.equal(await result.getText(), expectedSignInResult); - }, - ); + // Switch back to the dapp and verify the signed result + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + const result = await driver.findElement('#siweResult'); + assert.equal(await result.getText(), expectedSignInResult); + }, + ); + }); + }); + + describe('Redesigned confirmation screens', function () { + it('user should be able to confirm sign in with ethereum', async function () { + const expectedSigninMessageTitle = + 'A site wants you to sign in to prove you own this account.'; + const expectedSigninMessage = + 'I accept the MetaMask Terms of Service: https://community.metamask.io/tos'; + const expectedSignInResult = + '0xef8674a92d62a1876624547bdccaef6c67014ae821de18fa910fbff56577a65830f68848585b33d1f4b9ea1c3da1c1b11553b6aabe8446717daf7cd1e38a68271c'; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // Create a signin with ethereum request in test dapp + await openDapp(driver); + await driver.clickElement('#siwe'); + + // Wait for signature request popup and check the message title + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + await driver.findElement({ + css: 'h2', + text: 'Sign-in request', + }); + await driver.findElement({ + css: 'p', + text: expectedSigninMessageTitle, + }); + await driver.findElement({ + css: 'p', + text: '127.0.0.1:8080', + }); + + await driver.clickElement('[data-testid="sectionCollapseButton"]'); + + // Check the displayed information in popup content + await driver.findElement({ + css: 'p', + text: expectedSigninMessage, + }); + await driver.findElement({ + css: 'p', + text: 'https://127.0.0.1:8080', + }); + await driver.findElement({ + css: 'p', + text: '1', + }); + await driver.findElement({ + css: 'p', + text: '1', + }); + + await driver.clickElement({ + css: 'button', + text: 'Confirm', + }); + + // Switch back to the dapp and verify the signed result + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + const result = await driver.findElement('#siweResult'); + assert.equal(await result.getText(), expectedSignInResult); + }, + ); + }); }); }); diff --git a/test/e2e/tests/hardware-wallets/lattice-connect.spec.ts b/test/e2e/tests/hardware-wallets/lattice-connect.spec.ts index b8497a9df692..e20e0bd6fb45 100644 --- a/test/e2e/tests/hardware-wallets/lattice-connect.spec.ts +++ b/test/e2e/tests/hardware-wallets/lattice-connect.spec.ts @@ -2,39 +2,33 @@ import { strict as assert } from 'assert'; import { Suite } from 'mocha'; import { Driver } from '../../webdriver/driver'; import FixtureBuilder from '../../fixture-builder'; -import { withFixtures, unlockWallet } from '../../helpers'; +import { withFixtures } from '../../helpers'; import { isManifestV3 } from '../../../../shared/modules/mv3.utils'; +import AccountListPage from '../../page-objects/pages/account-list-page'; +import ConnectHardwareWalletPage from '../../page-objects/pages/hardware-wallet/connect-hardware-wallet-page'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; describe('Lattice hardware wallet @no-mmi', function (this: Suite) { - it('connects to lattice hardware wallet', async function () { + it('lattice page rendering validation', async function () { await withFixtures( { fixtures: new FixtureBuilder().build(), title: this.test?.fullTitle(), }, async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); + await loginWithBalanceValidation(driver); + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); - // choose Connect hardware wallet from the account menu - await driver.clickElement('[data-testid="account-menu-icon"]'); + // Choose connect hardware wallet from the account menu + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.openConnectHardwareWalletModal(); - // Wait until account list is loaded to mitigate race condition - await driver.waitForSelector({ - text: 'Account 1', - tag: 'span', - }); - await driver.clickElement( - '[data-testid="multichain-account-menu-popover-action-button"]', - ); - await driver.clickElement({ - text: 'Add hardware wallet', - tag: 'button', - }); - await driver.findClickableElement( - '[data-testid="hardware-connect-close-btn"]', - ); - await driver.clickElement('[data-testid="connect-lattice-btn"]'); - await driver.clickElement({ text: 'Continue', tag: 'button' }); + const connectHardwareWalletPage = new ConnectHardwareWalletPage(driver); + await connectHardwareWalletPage.check_pageIsLoaded(); + await connectHardwareWalletPage.openConnectLatticePage(); const allWindows = await driver.waitUntilXWindowHandles(2); assert.equal(allWindows.length, isManifestV3 ? 3 : 2); diff --git a/test/e2e/tests/hardware-wallets/trezor-account.spec.js b/test/e2e/tests/hardware-wallets/trezor-account.spec.js deleted file mode 100644 index 9abf6e67974d..000000000000 --- a/test/e2e/tests/hardware-wallets/trezor-account.spec.js +++ /dev/null @@ -1,156 +0,0 @@ -const { strict: assert } = require('assert'); -const FixtureBuilder = require('../../fixture-builder'); -const { - defaultGanacheOptions, - unlockWallet, - withFixtures, - regularDelayMs, -} = require('../../helpers'); -const { shortenAddress } = require('../../../../ui/helpers/utils/util'); -const { KNOWN_PUBLIC_KEY_ADDRESSES } = require('../../../stub/keyring-bridge'); - -/** - * Connect Trezor hardware wallet without selecting an account - * - * @param {*} driver - Selenium driver - */ -async function connectTrezor(driver) { - // Open add hardware wallet modal - await driver.clickElement('[data-testid="account-menu-icon"]'); - await driver.clickElement( - '[data-testid="multichain-account-menu-popover-action-button"]', - ); - await driver.clickElement({ text: 'Add hardware wallet' }); - // This delay is needed to mitigate an existing bug in FF - // See https://github.com/metamask/metamask-extension/issues/25851 - await driver.delay(regularDelayMs); - // Select Trezor - await driver.clickElement('[data-testid="connect-trezor-btn"]'); - await driver.clickElement({ text: 'Continue' }); -} - -describe('Trezor Hardware', function () { - it('derives the correct accounts', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await connectTrezor(driver); - - // Check that the first page of accounts is correct - for (const { address, index } of KNOWN_PUBLIC_KEY_ADDRESSES.slice( - 0, - 4, - )) { - const shortenedAddress = `${address.slice(0, 4)}...${address.slice( - -4, - )}`; - assert( - await driver.isElementPresent({ - text: shortenedAddress, - }), - `Known account ${index} not found`, - ); - } - }, - ); - }); - - it('unlocks the first account', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await connectTrezor(driver); - - // Select first account of first page and unlock - await driver.clickElement('.hw-account-list__item__checkbox'); - await driver.clickElement({ text: 'Unlock' }); - - // Check that the correct account has been added - await driver.clickElement('[data-testid="account-menu-icon"]'); - assert( - await driver.isElementPresent({ - text: 'Trezor 1', - }), - 'Trezor account not found', - ); - assert( - await driver.isElementPresent({ - text: shortenAddress(KNOWN_PUBLIC_KEY_ADDRESSES[0].address), - }), - 'Unlocked account is wrong', - ); - }, - ); - }); - - it('unlocks multiple accounts at once and removes one', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await connectTrezor(driver); - - // Unlock 5 Trezor accounts - const accountCheckboxes = await driver.findElements( - '.hw-account-list__item__checkbox', - ); - await accountCheckboxes[0].click(); - await accountCheckboxes[1].click(); - await accountCheckboxes[2].click(); - await accountCheckboxes[3].click(); - await accountCheckboxes[4].click(); - - await driver.clickElement({ text: 'Unlock' }); - - // Check that all 5 Trezor accounts are present - await driver.clickElement('[data-testid="account-menu-icon"]'); - for (let i = 0; i < 5; i++) { - assert( - await driver.isElementPresent({ - text: `Trezor ${i + 1}`, - }), - `Trezor account ${i + 1} not found`, - ); - assert( - await driver.isElementPresent({ - text: shortenAddress(KNOWN_PUBLIC_KEY_ADDRESSES[i].address), - }), - `Unlocked account ${i + 1} is wrong`, - ); - } - - // Remove Trezor account - const accountDetailsButton = await driver.findElements( - '[data-testid="account-list-item-menu-button"', - ); - await accountDetailsButton[1].click(); - await driver.clickElement('[data-testid="account-list-menu-remove"'); - await driver.clickElement({ - text: 'Remove', - tag: 'button', - }); - - // Assert Trezor account is removed - await driver.clickElement('[data-testid="account-menu-icon"]'); - - await driver.assertElementNotPresent({ - text: 'Trezor 1', - }); - }, - ); - }); -}); diff --git a/test/e2e/tests/hardware-wallets/trezor-account.spec.ts b/test/e2e/tests/hardware-wallets/trezor-account.spec.ts new file mode 100644 index 000000000000..44a382023881 --- /dev/null +++ b/test/e2e/tests/hardware-wallets/trezor-account.spec.ts @@ -0,0 +1,117 @@ +import FixtureBuilder from '../../fixture-builder'; +import { withFixtures } from '../../helpers'; +import { shortenAddress } from '../../../../ui/helpers/utils/util'; +import { KNOWN_PUBLIC_KEY_ADDRESSES } from '../../../stub/keyring-bridge'; +import AccountListPage from '../../page-objects/pages/account-list-page'; +import ConnectHardwareWalletPage from '../../page-objects/pages/hardware-wallet/connect-hardware-wallet-page'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import HomePage from '../../page-objects/pages/home/homepage'; +import SelectTrezorAccountPage from '../../page-objects/pages/hardware-wallet/select-trezor-account-page'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; + +describe('Trezor Hardware', function () { + it('derives the correct accounts and unlocks the first account', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithBalanceValidation(driver); + + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); + + // Choose connect hardware wallet from the account menu + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.openConnectHardwareWalletModal(); + + const connectHardwareWalletPage = new ConnectHardwareWalletPage(driver); + await connectHardwareWalletPage.check_pageIsLoaded(); + await connectHardwareWalletPage.openConnectTrezorPage(); + + const selectTrezorAccountPage = new SelectTrezorAccountPage(driver); + await selectTrezorAccountPage.check_pageIsLoaded(); + + // Check that the first page of accounts is correct + await selectTrezorAccountPage.check_trezorAccountNumber(); + for (const { address } of KNOWN_PUBLIC_KEY_ADDRESSES.slice(0, 4)) { + const shortenedAddress = `${address.slice(0, 4)}...${address.slice( + -4, + )}`; + await selectTrezorAccountPage.check_addressIsDisplayed( + shortenedAddress, + ); + } + + // Unlock first account of first page and check that the correct account has been added + await selectTrezorAccountPage.unlockAccount(1); + await headerNavbar.check_pageIsLoaded(); + await new HomePage(driver).check_expectedBalanceIsDisplayed(); + await headerNavbar.openAccountMenu(); + await accountListPage.check_pageIsLoaded(); + await accountListPage.check_accountDisplayedInAccountList('Trezor 1'); + await accountListPage.check_accountAddressDisplayedInAccountList( + shortenAddress(KNOWN_PUBLIC_KEY_ADDRESSES[0].address), + ); + }, + ); + }); + + it('unlocks multiple accounts at once and removes one', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithBalanceValidation(driver); + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); + + // Choose connect hardware wallet from the account menu + const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); + await accountListPage.openConnectHardwareWalletModal(); + + const connectHardwareWalletPage = new ConnectHardwareWalletPage(driver); + await connectHardwareWalletPage.check_pageIsLoaded(); + await connectHardwareWalletPage.openConnectTrezorPage(); + + // Unlock 5 Trezor accounts + const selectTrezorAccountPage = new SelectTrezorAccountPage(driver); + await selectTrezorAccountPage.check_pageIsLoaded(); + await selectTrezorAccountPage.check_trezorAccountNumber(); + for (let i = 1; i <= 5; i++) { + await selectTrezorAccountPage.selectTrezorAccount(i); + } + await selectTrezorAccountPage.clickUnlockButton(); + + // Check that all 5 Trezor accounts are displayed in account list + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + await homePage.check_expectedBalanceIsDisplayed(); + await headerNavbar.openAccountMenu(); + await accountListPage.check_pageIsLoaded(); + for (let i = 0; i < 5; i++) { + await accountListPage.check_accountDisplayedInAccountList( + `Trezor ${i + 1}`, + ); + await accountListPage.check_accountAddressDisplayedInAccountList( + shortenAddress(KNOWN_PUBLIC_KEY_ADDRESSES[i].address), + ); + } + + // Remove Trezor 1 account and check Trezor 1 account is removed + await accountListPage.removeAccount('Trezor 1'); + await homePage.check_pageIsLoaded(); + await homePage.check_expectedBalanceIsDisplayed(); + await headerNavbar.openAccountMenu(); + await accountListPage.check_accountIsNotDisplayedInAccountList( + 'Trezor 1', + ); + }, + ); + }); +}); diff --git a/test/e2e/tests/hardware-wallets/trezor-send.spec.ts b/test/e2e/tests/hardware-wallets/trezor-send.spec.ts index b10269c69ef0..5bb6fcb45220 100644 --- a/test/e2e/tests/hardware-wallets/trezor-send.spec.ts +++ b/test/e2e/tests/hardware-wallets/trezor-send.spec.ts @@ -2,13 +2,11 @@ import { Suite } from 'mocha'; import { Driver } from '../../webdriver/driver'; import { Ganache } from '../../seeder/ganache'; import FixtureBuilder from '../../fixture-builder'; -import { - defaultGanacheOptions, - logInWithBalanceValidation, - sendTransaction, - withFixtures, -} from '../../helpers'; +import { logInWithBalanceValidation, withFixtures } from '../../helpers'; import { KNOWN_PUBLIC_KEY_ADDRESSES } from '../../../stub/keyring-bridge'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; +import HomePage from '../../page-objects/pages/home/homepage'; +import { sendRedesignedTransactionToAddress } from '../../page-objects/flows/send-transaction.flow'; const RECIPIENT = '0x0Cc5261AB8cE458dc977078A3623E2BaDD27afD3'; @@ -17,7 +15,6 @@ describe('Trezor Hardware', function (this: Suite) { await withFixtures( { fixtures: new FixtureBuilder().withTrezorAccount().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, async ({ @@ -33,14 +30,16 @@ describe('Trezor Hardware', function (this: Suite) { '0x100000000000000000000', ); await logInWithBalanceValidation(driver); - - await sendTransaction(driver, RECIPIENT, '1'); - - // Wait for transaction to be confirmed - await driver.waitForSelector({ - css: '.transaction-status-label', - text: 'Confirmed', + await sendRedesignedTransactionToAddress({ + driver, + recipientAddress: RECIPIENT, + amount: '1', }); + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + const activityList = new ActivityListPage(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(); + await activityList.check_txAmountInActivity(); }, ); }); diff --git a/test/e2e/tests/hardware-wallets/trezor-sign.spec.ts b/test/e2e/tests/hardware-wallets/trezor-sign.spec.ts index f4cbf87b9dd4..418758a4d426 100644 --- a/test/e2e/tests/hardware-wallets/trezor-sign.spec.ts +++ b/test/e2e/tests/hardware-wallets/trezor-sign.spec.ts @@ -1,15 +1,10 @@ -import { strict as assert } from 'assert'; import { Suite } from 'mocha'; import { Driver } from '../../webdriver/driver'; import FixtureBuilder from '../../fixture-builder'; -import { - defaultGanacheOptions, - openDapp, - unlockWallet, - WINDOW_TITLES, - withFixtures, -} from '../../helpers'; +import { defaultGanacheOptions, withFixtures } from '../../helpers'; import { KNOWN_PUBLIC_KEY_ADDRESSES } from '../../../stub/keyring-bridge'; +import TestDappPage from '../../page-objects/pages/test-dapp'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; describe('Trezor Hardware Signatures', function (this: Suite) { it('sign typed v4', async function () { @@ -26,28 +21,13 @@ describe('Trezor Hardware Signatures', function (this: Suite) { dapp: true, }, async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - - await openDapp(driver); - await driver.clickElement('#signTypedDataV4'); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.delay(1000); - - await driver.clickElementSafe('.confirm-scroll-to-bottom__button'); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.delay(1000); - - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.clickElement('#signTypedDataV4Verify'); - - const verifyRecoverAddress = await driver.findElement( - '#signTypedDataV4VerifyResult', - ); - - assert.equal( - await verifyRecoverAddress.getText(), - KNOWN_PUBLIC_KEY_ADDRESSES[0].address.toLocaleLowerCase(), + await loginWithBalanceValidation(driver); + const testDappPage = new TestDappPage(driver); + await testDappPage.openTestDappPage(); + await testDappPage.check_pageIsLoaded(); + await testDappPage.signTypedDataV4(true); + await testDappPage.check_successSignTypedDataV4( + KNOWN_PUBLIC_KEY_ADDRESSES[0].address, ); }, ); diff --git a/test/e2e/tests/notifications/account-syncing/helpers.ts b/test/e2e/tests/identity/account-syncing/helpers.ts similarity index 100% rename from test/e2e/tests/notifications/account-syncing/helpers.ts rename to test/e2e/tests/identity/account-syncing/helpers.ts diff --git a/test/e2e/tests/notifications/account-syncing/importing-private-key-account.spec.ts b/test/e2e/tests/identity/account-syncing/importing-private-key-account.spec.ts similarity index 81% rename from test/e2e/tests/notifications/account-syncing/importing-private-key-account.spec.ts rename to test/e2e/tests/identity/account-syncing/importing-private-key-account.spec.ts index 1940d4bf3fd6..6647a78f42d3 100644 --- a/test/e2e/tests/notifications/account-syncing/importing-private-key-account.spec.ts +++ b/test/e2e/tests/identity/account-syncing/importing-private-key-account.spec.ts @@ -2,16 +2,16 @@ import { Mockttp } from 'mockttp'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; -import { mockNotificationServices } from '../mocks'; +import { mockIdentityServices } from '../mocks'; import { - NOTIFICATIONS_TEAM_IMPORTED_PRIVATE_KEY, - NOTIFICATIONS_TEAM_PASSWORD, - NOTIFICATIONS_TEAM_SEED_PHRASE, + IDENTITY_TEAM_IMPORTED_PRIVATE_KEY, + IDENTITY_TEAM_PASSWORD, + IDENTITY_TEAM_SEED_PHRASE, } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; import AccountListPage from '../../../page-objects/pages/account-list-page'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import { completeImportSRPOnboardingFlow } from '../../../page-objects/flows/onboarding.flow'; import { accountsSyncMockResponse } from './mockData'; import { IS_ACCOUNT_SYNCING_ENABLED } from './helpers'; @@ -37,17 +37,14 @@ describe('Account syncing - Import With Private Key @no-mmi', function () { }, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); @@ -71,7 +68,7 @@ describe('Account syncing - Import With Private Key @no-mmi', function () { ); await accountListPage.openAccountOptionsMenu(); await accountListPage.addNewImportedAccount( - NOTIFICATIONS_TEAM_IMPORTED_PRIVATE_KEY, + IDENTITY_TEAM_IMPORTED_PRIVATE_KEY, ); }, ); @@ -85,17 +82,14 @@ describe('Account syncing - Import With Private Key @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); diff --git a/test/e2e/tests/notifications/account-syncing/mockData.ts b/test/e2e/tests/identity/account-syncing/mockData.ts similarity index 100% rename from test/e2e/tests/notifications/account-syncing/mockData.ts rename to test/e2e/tests/identity/account-syncing/mockData.ts diff --git a/test/e2e/tests/notifications/account-syncing/new-user-sync.spec.ts b/test/e2e/tests/identity/account-syncing/new-user-sync.spec.ts similarity index 86% rename from test/e2e/tests/notifications/account-syncing/new-user-sync.spec.ts rename to test/e2e/tests/identity/account-syncing/new-user-sync.spec.ts index ae283c47fa8b..e9a82b128352 100644 --- a/test/e2e/tests/notifications/account-syncing/new-user-sync.spec.ts +++ b/test/e2e/tests/identity/account-syncing/new-user-sync.spec.ts @@ -2,12 +2,12 @@ import { Mockttp } from 'mockttp'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; -import { mockNotificationServices } from '../mocks'; -import { NOTIFICATIONS_TEAM_PASSWORD } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { mockIdentityServices } from '../mocks'; +import { IDENTITY_TEAM_PASSWORD } from '../constants'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; import AccountListPage from '../../../page-objects/pages/account-list-page'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import { completeCreateNewWalletOnboardingFlow, completeImportSRPOnboardingFlow, @@ -36,17 +36,14 @@ describe('Account syncing - New User @no-mmi', function () { server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { // Create a new wallet await completeCreateNewWalletOnboardingFlow({ driver, - password: NOTIFICATIONS_TEAM_PASSWORD, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); @@ -81,9 +78,7 @@ describe('Account syncing - New User @no-mmi', function () { await privacySettings.check_pageIsLoaded(); await privacySettings.openRevealSrpQuiz(); await privacySettings.completeRevealSrpQuiz(); - await privacySettings.fillPasswordToRevealSrp( - NOTIFICATIONS_TEAM_PASSWORD, - ); + await privacySettings.fillPasswordToRevealSrp(IDENTITY_TEAM_PASSWORD); walletSrp = await privacySettings.getSrpInRevealSrpDialog(); if (!walletSrp) { throw new Error('Wallet SRP was not set'); @@ -100,10 +95,7 @@ describe('Account syncing - New User @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { @@ -111,7 +103,7 @@ describe('Account syncing - New User @no-mmi', function () { await completeImportSRPOnboardingFlow({ driver, seedPhrase: walletSrp, - password: NOTIFICATIONS_TEAM_PASSWORD, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); diff --git a/test/e2e/tests/notifications/account-syncing/onboarding-with-opt-out.spec.ts b/test/e2e/tests/identity/account-syncing/onboarding-with-opt-out.spec.ts similarity index 88% rename from test/e2e/tests/notifications/account-syncing/onboarding-with-opt-out.spec.ts rename to test/e2e/tests/identity/account-syncing/onboarding-with-opt-out.spec.ts index 3ec44e4fd07e..19908211181b 100644 --- a/test/e2e/tests/notifications/account-syncing/onboarding-with-opt-out.spec.ts +++ b/test/e2e/tests/identity/account-syncing/onboarding-with-opt-out.spec.ts @@ -2,15 +2,15 @@ import { Mockttp } from 'mockttp'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; -import { mockNotificationServices } from '../mocks'; +import { mockIdentityServices } from '../mocks'; import { - NOTIFICATIONS_TEAM_PASSWORD, - NOTIFICATIONS_TEAM_SEED_PHRASE, + IDENTITY_TEAM_PASSWORD, + IDENTITY_TEAM_SEED_PHRASE, } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import AccountListPage from '../../../page-objects/pages/account-list-page'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import OnboardingCompletePage from '../../../page-objects/pages/onboarding/onboarding-complete-page'; import OnboardingPrivacySettingsPage from '../../../page-objects/pages/onboarding/onboarding-privacy-settings-page'; import { @@ -45,17 +45,14 @@ describe('Account syncing - Opt-out Profile Sync @no-mmi', function () { getResponse: accountsSyncMockResponse, }, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await importSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const onboardingCompletePage = new OnboardingCompletePage(driver); await onboardingCompletePage.check_pageIsLoaded(); @@ -105,16 +102,13 @@ describe('Account syncing - Opt-out Profile Sync @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await createNewWalletOnboardingFlow({ driver, - password: NOTIFICATIONS_TEAM_PASSWORD, + password: IDENTITY_TEAM_PASSWORD, }); const onboardingCompletePage = new OnboardingCompletePage(driver); await onboardingCompletePage.check_pageIsLoaded(); @@ -154,9 +148,7 @@ describe('Account syncing - Opt-out Profile Sync @no-mmi', function () { await privacySettings.check_pageIsLoaded(); await privacySettings.openRevealSrpQuiz(); await privacySettings.completeRevealSrpQuiz(); - await privacySettings.fillPasswordToRevealSrp( - NOTIFICATIONS_TEAM_PASSWORD, - ); + await privacySettings.fillPasswordToRevealSrp(IDENTITY_TEAM_PASSWORD); walletSrp = await privacySettings.getSrpInRevealSrpDialog(); if (!walletSrp) { throw new Error('Wallet SRP was not set'); @@ -174,17 +166,14 @@ describe('Account syncing - Opt-out Profile Sync @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, seedPhrase: walletSrp, - password: NOTIFICATIONS_TEAM_PASSWORD, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); diff --git a/test/e2e/tests/notifications/account-syncing/sync-after-adding-account.spec.ts b/test/e2e/tests/identity/account-syncing/sync-after-adding-account.spec.ts similarity index 85% rename from test/e2e/tests/notifications/account-syncing/sync-after-adding-account.spec.ts rename to test/e2e/tests/identity/account-syncing/sync-after-adding-account.spec.ts index 1c1f7b3119d7..9c2fdb69c7e9 100644 --- a/test/e2e/tests/notifications/account-syncing/sync-after-adding-account.spec.ts +++ b/test/e2e/tests/identity/account-syncing/sync-after-adding-account.spec.ts @@ -2,15 +2,15 @@ import { Mockttp } from 'mockttp'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; -import { mockNotificationServices } from '../mocks'; +import { mockIdentityServices } from '../mocks'; import { - NOTIFICATIONS_TEAM_PASSWORD, - NOTIFICATIONS_TEAM_SEED_PHRASE, + IDENTITY_TEAM_PASSWORD, + IDENTITY_TEAM_SEED_PHRASE, } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; import AccountListPage from '../../../page-objects/pages/account-list-page'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import { completeImportSRPOnboardingFlow } from '../../../page-objects/flows/onboarding.flow'; import { accountsSyncMockResponse } from './mockData'; import { IS_ACCOUNT_SYNCING_ENABLED } from './helpers'; @@ -36,17 +36,14 @@ describe('Account syncing - Add Account @no-mmi', function () { }, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); @@ -81,17 +78,14 @@ describe('Account syncing - Add Account @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); @@ -141,17 +135,14 @@ describe('Account syncing - Add Account @no-mmi', function () { }, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); @@ -186,17 +177,14 @@ describe('Account syncing - Add Account @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); diff --git a/test/e2e/tests/notifications/account-syncing/sync-after-modifying-account-name.spec.ts b/test/e2e/tests/identity/account-syncing/sync-after-modifying-account-name.spec.ts similarity index 84% rename from test/e2e/tests/notifications/account-syncing/sync-after-modifying-account-name.spec.ts rename to test/e2e/tests/identity/account-syncing/sync-after-modifying-account-name.spec.ts index 22618d70f3c5..07f6e4848aba 100644 --- a/test/e2e/tests/notifications/account-syncing/sync-after-modifying-account-name.spec.ts +++ b/test/e2e/tests/identity/account-syncing/sync-after-modifying-account-name.spec.ts @@ -2,15 +2,15 @@ import { Mockttp } from 'mockttp'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; -import { mockNotificationServices } from '../mocks'; +import { mockIdentityServices } from '../mocks'; import { - NOTIFICATIONS_TEAM_PASSWORD, - NOTIFICATIONS_TEAM_SEED_PHRASE, + IDENTITY_TEAM_PASSWORD, + IDENTITY_TEAM_SEED_PHRASE, } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; import AccountListPage from '../../../page-objects/pages/account-list-page'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import { completeImportSRPOnboardingFlow } from '../../../page-objects/flows/onboarding.flow'; import { accountsSyncMockResponse } from './mockData'; import { IS_ACCOUNT_SYNCING_ENABLED } from './helpers'; @@ -36,17 +36,14 @@ describe('Account syncing - Rename Accounts @no-mmi', function () { }, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); @@ -82,17 +79,14 @@ describe('Account syncing - Rename Accounts @no-mmi', function () { USER_STORAGE_FEATURE_NAMES.accounts, server, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); diff --git a/test/e2e/tests/notifications/account-syncing/sync-after-onboarding.spec.ts b/test/e2e/tests/identity/account-syncing/sync-after-onboarding.spec.ts similarity index 82% rename from test/e2e/tests/notifications/account-syncing/sync-after-onboarding.spec.ts rename to test/e2e/tests/identity/account-syncing/sync-after-onboarding.spec.ts index be2b2604633c..8d714bb6b273 100644 --- a/test/e2e/tests/notifications/account-syncing/sync-after-onboarding.spec.ts +++ b/test/e2e/tests/identity/account-syncing/sync-after-onboarding.spec.ts @@ -2,15 +2,15 @@ import { Mockttp } from 'mockttp'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; -import { mockNotificationServices } from '../mocks'; +import { mockIdentityServices } from '../mocks'; import { - NOTIFICATIONS_TEAM_PASSWORD, - NOTIFICATIONS_TEAM_SEED_PHRASE, + IDENTITY_TEAM_PASSWORD, + IDENTITY_TEAM_SEED_PHRASE, } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; import AccountListPage from '../../../page-objects/pages/account-list-page'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import { completeImportSRPOnboardingFlow } from '../../../page-objects/flows/onboarding.flow'; import { accountsSyncMockResponse } from './mockData'; import { IS_ACCOUNT_SYNCING_ENABLED } from './helpers'; @@ -35,17 +35,14 @@ describe('Account syncing - Onboarding @no-mmi', function () { getResponse: accountsSyncMockResponse, }, ); - return mockNotificationServices( - server, - userStorageMockttpController, - ); + return mockIdentityServices(server, userStorageMockttpController); }, }, async ({ driver }) => { await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); diff --git a/test/e2e/tests/notifications/account-syncing/sync-with-account-balances.spec.ts b/test/e2e/tests/identity/account-syncing/sync-with-account-balances.spec.ts similarity index 92% rename from test/e2e/tests/notifications/account-syncing/sync-with-account-balances.spec.ts rename to test/e2e/tests/identity/account-syncing/sync-with-account-balances.spec.ts index 8ecaff943721..6fcc9e9cc0d0 100644 --- a/test/e2e/tests/notifications/account-syncing/sync-with-account-balances.spec.ts +++ b/test/e2e/tests/identity/account-syncing/sync-with-account-balances.spec.ts @@ -3,13 +3,13 @@ import { unlockWallet, withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; import { mockInfuraAndAccountSync } from '../mocks'; import { - NOTIFICATIONS_TEAM_PASSWORD, - NOTIFICATIONS_TEAM_SEED_PHRASE, + IDENTITY_TEAM_PASSWORD, + IDENTITY_TEAM_SEED_PHRASE, } from '../constants'; -import { UserStorageMockttpController } from '../../../helpers/user-storage/userStorageMockttpController'; +import { UserStorageMockttpController } from '../../../helpers/identity/user-storage/userStorageMockttpController'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; import AccountListPage from '../../../page-objects/pages/account-list-page'; -import HomePage from '../../../page-objects/pages/homepage'; +import HomePage from '../../../page-objects/pages/home/homepage'; import { completeImportSRPOnboardingFlow } from '../../../page-objects/flows/onboarding.flow'; import { accountsSyncMockResponse } from './mockData'; import { IS_ACCOUNT_SYNCING_ENABLED } from './helpers'; @@ -81,8 +81,8 @@ describe('Account syncing - User already has balances on multple accounts @no-mm // Complete initial setup with provided seed phrase await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); // Verify initial state and balance @@ -132,8 +132,8 @@ describe('Account syncing - User already has balances on multple accounts @no-mm // Complete setup again for new session await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); @@ -185,8 +185,8 @@ describe('Account syncing - User already has balances on multple accounts @no-mm // Complete setup for final verification await completeImportSRPOnboardingFlow({ driver, - seedPhrase: NOTIFICATIONS_TEAM_SEED_PHRASE, - password: NOTIFICATIONS_TEAM_PASSWORD, + seedPhrase: IDENTITY_TEAM_SEED_PHRASE, + password: IDENTITY_TEAM_PASSWORD, }); const homePage = new HomePage(driver); @@ -210,7 +210,7 @@ describe('Account syncing - User already has balances on multple accounts @no-mm // Lock and unlock wallet to ensure that number of preloaded accounts have not gone up await homePage.headerNavbar.lockMetaMask(); await unlockWallet(driver, { - password: NOTIFICATIONS_TEAM_PASSWORD, + password: IDENTITY_TEAM_PASSWORD, waitLoginSuccess: true, navigate: true, }); diff --git a/test/e2e/tests/identity/constants.ts b/test/e2e/tests/identity/constants.ts new file mode 100644 index 000000000000..4819a2368606 --- /dev/null +++ b/test/e2e/tests/identity/constants.ts @@ -0,0 +1,9 @@ +// As we rely on profile syncing for most of our features, we need to use the same SRP for all of our tests +export const IDENTITY_TEAM_SEED_PHRASE = + 'leisure swallow trip elbow prison wait rely keep supply hole general mountain'; +export const IDENTITY_TEAM_PASSWORD = 'notify_password'; +// You can use the storage key below to generate mock data +export const IDENTITY_TEAM_STORAGE_KEY = + '0d55d30da233959674d14076737198c05ae3fb8631a17e20d3c28c60dddd82f7'; +export const IDENTITY_TEAM_IMPORTED_PRIVATE_KEY = + '0179f7453ff337aba89d04b00085764092cf8c0cfe91d5614c39c2be902ad582'; diff --git a/test/e2e/tests/identity/mocks.ts b/test/e2e/tests/identity/mocks.ts new file mode 100644 index 000000000000..e81f70f2d4a5 --- /dev/null +++ b/test/e2e/tests/identity/mocks.ts @@ -0,0 +1,136 @@ +import { Mockttp, RequestRuleBuilder } from 'mockttp'; +import { AuthenticationController } from '@metamask/profile-sync-controller'; +import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; +import { UserStorageMockttpController } from '../../helpers/identity/user-storage/userStorageMockttpController'; +import { accountsSyncMockResponse } from './account-syncing/mockData'; + +const AuthMocks = AuthenticationController.Mocks; + +type MockResponse = { + url: string | RegExp; + requestMethod: 'GET' | 'POST' | 'PUT' | 'DELETE'; + response: unknown; +}; + +/** + * E2E mock setup for identity APIs (Auth, UserStorage, Profile syncing) + * + * @param server - server obj used to mock our endpoints + * @param userStorageMockttpControllerInstance - optional instance of UserStorageMockttpController, useful if you need persisted user storage between tests + */ +export async function mockIdentityServices( + server: Mockttp, + userStorageMockttpControllerInstance: UserStorageMockttpController = new UserStorageMockttpController(), +) { + // Auth + mockAPICall(server, AuthMocks.getMockAuthNonceResponse()); + mockAPICall(server, AuthMocks.getMockAuthLoginResponse()); + mockAPICall(server, AuthMocks.getMockAuthAccessTokenResponse()); + + // Storage + if ( + !userStorageMockttpControllerInstance?.paths.get( + USER_STORAGE_FEATURE_NAMES.accounts, + ) + ) { + userStorageMockttpControllerInstance.setupPath( + USER_STORAGE_FEATURE_NAMES.accounts, + server, + ); + } + if ( + !userStorageMockttpControllerInstance?.paths.get( + USER_STORAGE_FEATURE_NAMES.networks, + ) + ) { + userStorageMockttpControllerInstance.setupPath( + USER_STORAGE_FEATURE_NAMES.networks, + server, + ); + } +} + +function mockAPICall(server: Mockttp, response: MockResponse) { + let requestRuleBuilder: RequestRuleBuilder | undefined; + + if (response.requestMethod === 'GET') { + requestRuleBuilder = server.forGet(response.url); + } + + if (response.requestMethod === 'POST') { + requestRuleBuilder = server.forPost(response.url); + } + + if (response.requestMethod === 'PUT') { + requestRuleBuilder = server.forPut(response.url); + } + + if (response.requestMethod === 'DELETE') { + requestRuleBuilder = server.forDelete(response.url); + } + + requestRuleBuilder?.thenCallback(() => ({ + statusCode: 200, + json: response.response, + })); +} + +type MockInfuraAndAccountSyncOptions = { + accountsToMock?: string[]; + accountsSyncResponse?: typeof accountsSyncMockResponse; +}; + +const MOCK_ETH_BALANCE = '0xde0b6b3a7640000'; +const INFURA_URL = + 'https://mainnet.infura.io/v3/00000000000000000000000000000000'; + +/** + * Sets up mock responses for Infura balance checks and account syncing + * + * @param mockServer - The Mockttp server instance + * @param userStorageMockttpController - Controller for user storage mocks + * @param options - Configuration options for mocking + */ +export async function mockInfuraAndAccountSync( + mockServer: Mockttp, + userStorageMockttpController: UserStorageMockttpController, + options: MockInfuraAndAccountSyncOptions = {}, +): Promise { + const accounts = options.accountsToMock ?? []; + + // Set up User Storage / Account Sync mock + userStorageMockttpController.setupPath( + USER_STORAGE_FEATURE_NAMES.accounts, + mockServer, + ); + + userStorageMockttpController.setupPath( + USER_STORAGE_FEATURE_NAMES.accounts, + mockServer, + { + getResponse: options.accountsSyncResponse ?? undefined, + }, + ); + + // Account Balances + if (accounts.length > 0) { + accounts.forEach((account) => { + mockServer + .forPost(INFURA_URL) + .withJsonBodyIncluding({ + method: 'eth_getBalance', + params: [account.toLowerCase()], + }) + .thenCallback(() => ({ + statusCode: 200, + json: { + jsonrpc: '2.0', + id: '1111111111111111', + result: MOCK_ETH_BALANCE, + }, + })); + }); + } + + mockIdentityServices(mockServer, userStorageMockttpController); +} diff --git a/test/e2e/tests/metrics/app-opened.spec.ts b/test/e2e/tests/metrics/app-opened.spec.ts new file mode 100644 index 000000000000..80169e36c369 --- /dev/null +++ b/test/e2e/tests/metrics/app-opened.spec.ts @@ -0,0 +1,104 @@ +import { strict as assert } from 'assert'; +import { Mockttp } from 'mockttp'; +import { + withFixtures, + getEventPayloads, + unlockWallet, + connectToDapp, +} from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; + +/** + * Mocks the segment API for the App Opened event that we expect to see when + * these tests are run. + * + * @param mockServer - The mock server instance. + * @returns The mocked endpoints + */ +async function mockSegment(mockServer: Mockttp) { + return [ + await mockServer + .forPost('https://api.segment.io/v1/batch') + .withJsonBodyIncluding({ + batch: [{ type: 'track', event: 'App Opened' }], + }) + .thenCallback(() => { + return { + statusCode: 200, + }; + }), + ]; +} + +describe('App Opened metric @no-mmi', function () { + it('should send AppOpened metric when app is opened and metrics are enabled', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-fd20', + participateInMetaMetrics: true, + }) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await loginWithoutBalanceValidation(driver); + + const events = await getEventPayloads(driver, mockedEndpoints); + assert.equal(events.length, 1); + assert.equal(events[0].properties.category, 'App'); + }, + ); + }); + + it('should not send AppOpened metric when metrics are disabled', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-fd20', + participateInMetaMetrics: false, + }) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + + const events = await getEventPayloads(driver, mockedEndpoints); + assert.equal(events.length, 0); + }, + ); + }); + + it('should send AppOpened metric when dapp opens MetaMask', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-fd20', + participateInMetaMetrics: true, + }) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + + // Connect to dapp which will trigger MetaMask to open + await connectToDapp(driver); + + // Wait for events to be tracked + const events = await getEventPayloads(driver, mockedEndpoints); + assert.equal(events.length, 1); + assert.equal(events[0].properties.category, 'App'); + }, + ); + }); +}); diff --git a/test/e2e/tests/metrics/dapp-viewed.spec.js b/test/e2e/tests/metrics/dapp-viewed.spec.js index 668f93e65dc5..a747ea658937 100644 --- a/test/e2e/tests/metrics/dapp-viewed.spec.js +++ b/test/e2e/tests/metrics/dapp-viewed.spec.js @@ -297,10 +297,6 @@ describe('Dapp viewed Event @no-mmi', function () { text: 'All Permissions', tag: 'div', }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); await driver.clickElement({ text: '127.0.0.1:8080', tag: 'p', diff --git a/test/e2e/tests/metrics/errors.spec.js b/test/e2e/tests/metrics/errors.spec.js index b35a38d83206..12a44e26fbf1 100644 --- a/test/e2e/tests/metrics/errors.spec.js +++ b/test/e2e/tests/metrics/errors.spec.js @@ -874,9 +874,13 @@ describe('Sentry errors', function () { srcTokenAmount: true, walletAddress: false, }, + destTokensLoadingStatus: false, + srcTokensLoadingStatus: false, quotesLastFetched: true, quotesLoadingStatus: true, quotesRefreshCount: true, + quoteFetchError: true, + quotesInitialLoadTime: true, }, currentPopupId: false, // Initialized as undefined // Part of transaction controller store, but missing from the initial diff --git a/test/e2e/tests/metrics/signature-approved.spec.js b/test/e2e/tests/metrics/signature-approved.spec.js index 2ea84d281b50..d0d1bb9c32c3 100644 --- a/test/e2e/tests/metrics/signature-approved.spec.js +++ b/test/e2e/tests/metrics/signature-approved.spec.js @@ -10,6 +10,8 @@ const { clickSignOnSignatureConfirmation, tempToggleSettingRedesignedConfirmations, validateContractDetails, + clickSignOnRedesignedSignatureConfirmation, + WINDOW_TITLES, } = require('../../helpers'); const FixtureBuilder = require('../../fixture-builder'); @@ -58,168 +60,342 @@ const expectedEventPropertiesBase = { security_alert_response: 'loading', }; +const additionalRedesignEventProperties = { + ui_customizations: ['redesigned_confirmation'], +}; + describe('Signature Approved Event @no-mmi', function () { - it('Successfully tracked for signTypedData_v4', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withMetaMetricsController({ - metaMetricsId: 'fake-metrics-id', - participateInMetaMetrics: true, - }) - .build(), - defaultGanacheOptions, - title: this.test.fullTitle(), - testSpecificMock: mockSegment, - }, - async ({ driver, mockedEndpoint: mockedEndpoints }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - - // creates a sign typed data signature request - await driver.clickElement('#signTypedDataV4'); - await switchToNotificationWindow(driver); - await validateContractDetails(driver); - await clickSignOnSignatureConfirmation({ driver }); - const events = await getEventPayloads(driver, mockedEndpoints); - - assert.deepStrictEqual(events[0].properties, { - ...expectedEventPropertiesBase, - signature_type: 'eth_signTypedData_v4', - eip712_primary_type: 'Mail', - }); - - assert.deepStrictEqual(events[1].properties, { - ...expectedEventPropertiesBase, - signature_type: 'eth_signTypedData_v4', - eip712_primary_type: 'Mail', - security_alert_response: 'Benign', - }); - }, - ); - }); + describe('Old confirmation screens', function () { + it('Successfully tracked for signTypedData_v4', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); - it('Successfully tracked for signTypedData_v3', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withMetaMetricsController({ - metaMetricsId: 'fake-metrics-id', - participateInMetaMetrics: true, - }) - .build(), - defaultGanacheOptions, - title: this.test.fullTitle(), - testSpecificMock: mockSegment, - }, - async ({ driver, mockedEndpoint: mockedEndpoints }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - - // creates a sign typed data signature request - await driver.clickElement('#signTypedDataV3'); - await switchToNotificationWindow(driver); - await validateContractDetails(driver); - await clickSignOnSignatureConfirmation({ driver }); - const events = await getEventPayloads(driver, mockedEndpoints); - - assert.deepStrictEqual(events[0].properties, { - ...expectedEventPropertiesBase, - signature_type: 'eth_signTypedData_v3', - }); - - assert.deepStrictEqual(events[1].properties, { - ...expectedEventPropertiesBase, - signature_type: 'eth_signTypedData_v3', - security_alert_response: 'Benign', - }); - }, - ); - }); + // creates a sign typed data signature request + await driver.clickElement('#signTypedDataV4'); + await switchToNotificationWindow(driver); + await validateContractDetails(driver); + await clickSignOnSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + signature_type: 'eth_signTypedData_v4', + eip712_primary_type: 'Mail', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + signature_type: 'eth_signTypedData_v4', + eip712_primary_type: 'Mail', + security_alert_response: 'Benign', + }); + }, + ); + }); + + it('Successfully tracked for signTypedData_v3', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedDataV3'); + await switchToNotificationWindow(driver); + await validateContractDetails(driver); + await clickSignOnSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + signature_type: 'eth_signTypedData_v3', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + signature_type: 'eth_signTypedData_v3', + security_alert_response: 'Benign', + }); + }, + ); + }); + + it('Successfully tracked for signTypedData', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedData'); + await switchToNotificationWindow(driver); + await clickSignOnSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + signature_type: 'eth_signTypedData', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + signature_type: 'eth_signTypedData', + security_alert_response: 'Benign', + }); + }, + ); + }); + + it('Successfully tracked for personalSign', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#personalSign'); + await switchToNotificationWindow(driver); + await clickSignOnSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); - it('Successfully tracked for signTypedData', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withMetaMetricsController({ - metaMetricsId: 'fake-metrics-id', - participateInMetaMetrics: true, - }) - .build(), - defaultGanacheOptions, - title: this.test.fullTitle(), - testSpecificMock: mockSegment, - }, - async ({ driver, mockedEndpoint: mockedEndpoints }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - - // creates a sign typed data signature request - await driver.clickElement('#signTypedData'); - await switchToNotificationWindow(driver); - await clickSignOnSignatureConfirmation({ driver }); - const events = await getEventPayloads(driver, mockedEndpoints); - - assert.deepStrictEqual(events[0].properties, { - ...expectedEventPropertiesBase, - signature_type: 'eth_signTypedData', - }); - - assert.deepStrictEqual(events[1].properties, { - ...expectedEventPropertiesBase, - signature_type: 'eth_signTypedData', - security_alert_response: 'Benign', - }); - }, - ); + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + signature_type: 'personal_sign', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + signature_type: 'personal_sign', + security_alert_response: 'Benign', + }); + }, + ); + }); }); - it('Successfully tracked for personalSign', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withMetaMetricsController({ - metaMetricsId: 'fake-metrics-id', - participateInMetaMetrics: true, - }) - .build(), - defaultGanacheOptions, - title: this.test.fullTitle(), - testSpecificMock: mockSegment, - }, - async ({ driver, mockedEndpoint: mockedEndpoints }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - - // creates a sign typed data signature request - await driver.clickElement('#personalSign'); - await switchToNotificationWindow(driver); - await clickSignOnSignatureConfirmation({ driver }); - const events = await getEventPayloads(driver, mockedEndpoints); - - assert.deepStrictEqual(events[0].properties, { - ...expectedEventPropertiesBase, - signature_type: 'personal_sign', - }); - - assert.deepStrictEqual(events[1].properties, { - ...expectedEventPropertiesBase, - signature_type: 'personal_sign', - security_alert_response: 'Benign', - }); - }, - ); + describe('Redesigned confirmation screens', function () { + it('Successfully tracked for signTypedData_v4', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedDataV4'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await clickSignOnRedesignedSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'eth_signTypedData_v4', + eip712_primary_type: 'Mail', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'eth_signTypedData_v4', + eip712_primary_type: 'Mail', + security_alert_response: 'Benign', + }); + }, + ); + }); + + it('Successfully tracked for signTypedData_v3', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedDataV3'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await clickSignOnRedesignedSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'eth_signTypedData_v3', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'eth_signTypedData_v3', + security_alert_response: 'Benign', + }); + }, + ); + }); + + it('Successfully tracked for signTypedData', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedData'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await clickSignOnRedesignedSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'eth_signTypedData', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'eth_signTypedData', + security_alert_response: 'Benign', + }); + }, + ); + }); + + it('Successfully tracked for personalSign', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.fullTitle(), + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#personalSign'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await clickSignOnRedesignedSignatureConfirmation({ driver }); + const events = await getEventPayloads(driver, mockedEndpoints); + + assert.deepStrictEqual(events[0].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'personal_sign', + }); + + assert.deepStrictEqual(events[1].properties, { + ...expectedEventPropertiesBase, + ...additionalRedesignEventProperties, + signature_type: 'personal_sign', + security_alert_response: 'Benign', + }); + }, + ); + }); }); }); diff --git a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json index 450ef4ee7ebb..cae1a6ae8951 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json @@ -42,16 +42,16 @@ "newPrivacyPolicyToastClickedOrClosed": "boolean", "newPrivacyPolicyToastShownDate": "number", "hadAdvancedGasFeesSetPriorToMigration92_3": false, - "nftsDropdownState": {}, - "termsOfUseLastAgreed": "number", - "qrHardware": {}, - "usedNetworks": { "0x1": true, "0x5": true, "0x539": true }, - "snapsInstallPrivacyWarningShown": true, "surveyLinkLastClickedOrClosed": "object", + "switchedNetworkNeverShowMessage": "boolean", + "slides": "object", + "qrHardware": {}, + "nftsDropdownState": {}, "signatureSecurityAlertResponses": "object", "switchedNetworkDetails": null, - "switchedNetworkNeverShowMessage": "boolean", - "currentExtensionPopupId": "number" + "currentExtensionPopupId": "number", + "termsOfUseLastAgreed": "number", + "snapsInstallPrivacyWarningShown": true }, "ApprovalController": { "pendingApprovals": "object", @@ -62,10 +62,16 @@ "BridgeController": { "bridgeState": { "bridgeFeatureFlags": { - "extensionConfig": "object", - "extensionSupport": "boolean", - "srcNetworkAllowlist": { "0": "string", "1": "string", "2": "string" }, - "destNetworkAllowlist": { "0": "string", "1": "string", "2": "string" } + "extensionConfig": { + "maxRefreshCount": "number", + "refreshRate": "number", + "support": "boolean", + "chains": { + "0x1": "object", + "0xa4b1": "object", + "0xe708": "object" + } + } }, "srcTokens": {}, "srcTopAssets": {}, @@ -234,13 +240,13 @@ "petnamesEnabled": true, "showMultiRpcModal": "boolean", "isRedesignedConfirmationsDeveloperEnabled": "boolean", - "redesignedConfirmationsEnabled": true, - "redesignedTransactionsEnabled": "boolean", "tokenSortConfig": "object", + "shouldShowAggregatedBalancePopover": "boolean", "tokenNetworkFilter": { "0x539": "boolean" }, - "shouldShowAggregatedBalancePopover": "boolean" + "redesignedConfirmationsEnabled": true, + "redesignedTransactionsEnabled": "boolean" }, "ipfsGateway": "string", "isIpfsGatewayEnabled": "boolean", @@ -257,6 +263,10 @@ "showIncomingTransactions": "object" }, "QueuedRequestController": { "queuedRequestCount": 0 }, + "RemoteFeatureFlagController": { + "remoteFeatureFlags": { "feature1": true, "feature2": false }, + "cacheTimestamp": "number" + }, "SelectedNetworkController": { "domains": "object" }, "SignatureController": { "signatureRequests": "object", @@ -317,9 +327,7 @@ "swapsFeatureFlags": {} } }, - "TokenBalancesController": { - "tokenBalances": "object" - }, + "TokenBalancesController": { "tokenBalances": "object" }, "TokenListController": { "tokenList": "object", "tokensChainsCache": { diff --git a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json index a95c969eed00..a306c63c70b6 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json @@ -36,10 +36,10 @@ "showMultiRpcModal": "boolean", "isRedesignedConfirmationsDeveloperEnabled": "boolean", "tokenSortConfig": "object", + "shouldShowAggregatedBalancePopover": "boolean", "tokenNetworkFilter": { "0x539": "boolean" }, - "shouldShowAggregatedBalancePopover": "boolean", "redesignedConfirmationsEnabled": true, "redesignedTransactionsEnabled": "boolean" }, @@ -88,16 +88,16 @@ "newPrivacyPolicyToastClickedOrClosed": "boolean", "newPrivacyPolicyToastShownDate": "number", "hadAdvancedGasFeesSetPriorToMigration92_3": false, - "nftsDropdownState": {}, - "termsOfUseLastAgreed": "number", - "qrHardware": {}, - "usedNetworks": { "0x1": true, "0x5": true, "0x539": true }, - "snapsInstallPrivacyWarningShown": true, "surveyLinkLastClickedOrClosed": "object", + "switchedNetworkNeverShowMessage": "boolean", + "slides": "object", + "qrHardware": {}, + "nftsDropdownState": {}, "signatureSecurityAlertResponses": "object", "switchedNetworkDetails": null, - "switchedNetworkNeverShowMessage": "boolean", "currentExtensionPopupId": "number", + "termsOfUseLastAgreed": "number", + "snapsInstallPrivacyWarningShown": true, "currentAppVersion": "string", "previousAppVersion": "", "previousMigrationVersion": 0, @@ -179,7 +179,6 @@ "tokensChainsCache": { "0x539": "object" }, - "tokenBalances": "object", "preventPollingOnNetworkRestart": false, "tokens": "object", "ignoredTokens": "object", @@ -187,6 +186,7 @@ "allTokens": {}, "allIgnoredTokens": {}, "allDetectedTokens": {}, + "tokenBalances": "object", "smartTransactionsState": { "fees": {}, "feesByChainId": "object", @@ -235,6 +235,8 @@ "isCheckingAccountsPresence": "boolean", "queuedRequestCount": 0, "fcmToken": "string", + "remoteFeatureFlags": { "feature1": true, "feature2": false }, + "cacheTimestamp": "number", "accounts": "object", "accountsByChainId": "object", "marketData": "object", @@ -277,10 +279,16 @@ }, "bridgeState": { "bridgeFeatureFlags": { - "extensionConfig": "object", - "extensionSupport": "boolean", - "srcNetworkAllowlist": { "0": "string", "1": "string", "2": "string" }, - "destNetworkAllowlist": { "0": "string", "1": "string", "2": "string" } + "extensionConfig": { + "maxRefreshCount": "number", + "refreshRate": "number", + "support": "boolean", + "chains": { + "0x1": "object", + "0xa4b1": "object", + "0xe708": "object" + } + } }, "srcTokens": {}, "srcTopAssets": {}, diff --git a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json index 07b292d33b3b..c443b0fe84ec 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json @@ -42,12 +42,6 @@ "trezorModel": null, "newPrivacyPolicyToastClickedOrClosed": "boolean", "newPrivacyPolicyToastShownDate": "number", - "usedNetworks": { - "0x1": true, - "0xe708": true, - "0x5": true, - "0x539": true - }, "snapsInstallPrivacyWarningShown": true }, "CurrencyController": { @@ -149,16 +143,13 @@ "BridgeController": { "bridgeState": { "bridgeFeatureFlags": { - "extensionSupport": "boolean", - "srcNetworkAllowlist": { - "0": "string", - "1": "string", - "2": "string" - }, - "destNetworkAllowlist": { - "0": "string", - "1": "string", - "2": "string" + "extensionConfig": { + "support": "boolean", + "chains": { + "0x1": "object", + "0xa": "object", + "0xe708": "object" + } } }, "destTokens": {}, diff --git a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json index f997b89bcd28..012ccabe6f2f 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json @@ -42,31 +42,8 @@ "trezorModel": null, "newPrivacyPolicyToastClickedOrClosed": "boolean", "newPrivacyPolicyToastShownDate": "number", - "usedNetworks": { - "0x1": true, - "0xe708": true, - "0x5": true, - "0x539": true - }, "snapsInstallPrivacyWarningShown": true }, - "BridgeController": { - "bridgeState": { - "bridgeFeatureFlags": { - "extensionSupport": "boolean", - "srcNetworkAllowlist": { - "0": "string", - "1": "string", - "2": "string" - }, - "destNetworkAllowlist": { - "0": "string", - "1": "string", - "2": "string" - } - } - } - }, "CurrencyController": { "currentCurrency": "usd", "currencyRates": { @@ -175,16 +152,13 @@ "BridgeController": { "bridgeState": { "bridgeFeatureFlags": { - "extensionSupport": "boolean", - "srcNetworkAllowlist": { - "0": "string", - "1": "string", - "2": "string" - }, - "destNetworkAllowlist": { - "0": "string", - "1": "string", - "2": "string" + "extensionConfig": { + "support": "boolean", + "chains": { + "0x1": "object", + "0xa": "object", + "0xe708": "object" + } } }, "destTokens": {}, diff --git a/test/e2e/tests/multichain/aggregated-balances.spec.ts b/test/e2e/tests/multichain/aggregated-balances.spec.ts index 57df2362b236..5e99c2e909e7 100644 --- a/test/e2e/tests/multichain/aggregated-balances.spec.ts +++ b/test/e2e/tests/multichain/aggregated-balances.spec.ts @@ -8,10 +8,10 @@ import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow' import { SMART_CONTRACTS } from '../../seeder/smart-contracts'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; import SelectNetwork from '../../page-objects/pages/dialog/select-network'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import SettingsPage from '../../page-objects/pages/settings/settings-page'; import AccountListPage from '../../page-objects/pages/account-list-page'; -import AssetListPage from '../../page-objects/pages/asset-list'; +import AssetListPage from '../../page-objects/pages/home/asset-list'; import SendTokenPage from '../../page-objects/pages/send/send-token-page'; const EXPECTED_MAINNET_BALANCE_USD = '$84,985.04'; @@ -118,7 +118,7 @@ describe('Multichain Aggregated Balances', function (this: Suite) { EXPECTED_SEPOLIA_BALANCE_NATIVE, SEPOLIA_NATIVE_TOKEN, ); - await assetListPage.checkNetworkFilterText(NETWORK_NAME_SEPOLIA); + await assetListPage.check_networkFilterText(NETWORK_NAME_SEPOLIA); // Step 11: Enable fiat display on testnets in settings await headerNavbar.openSettingsPage(); diff --git a/test/e2e/tests/multichain/all-permissions-page.spec.js b/test/e2e/tests/multichain/all-permissions-page.spec.js deleted file mode 100644 index 5bb718bd8d20..000000000000 --- a/test/e2e/tests/multichain/all-permissions-page.spec.js +++ /dev/null @@ -1,98 +0,0 @@ -const { strict: assert } = require('assert'); -const { - withFixtures, - WINDOW_TITLES, - connectToDapp, - logInWithBalanceValidation, - defaultGanacheOptions, -} = require('../../helpers'); -const FixtureBuilder = require('../../fixture-builder'); - -describe('Permissions Page', function () { - it('should show connected site permissions when a single dapp is connected', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().build(), - title: this.test.fullTitle(), - ganacheOptions: defaultGanacheOptions, - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - await connectToDapp(driver); - - // close test dapp window to avoid future confusion - const windowHandles = await driver.getAllWindowHandles(); - await driver.closeWindowHandle(windowHandles[1]); - // disconnect dapp in fullscreen view - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid ="account-options-menu-button"]', - ); - await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); - const connectedDapp = await driver.isElementPresent({ - text: '127.0.0.1:8080', - tag: 'p', - }); - assert.ok(connectedDapp, 'Account connected to Dapp1'); - }, - ); - }); - - it('should show all permissions listed when experimental settings toggle is off', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().build(), - title: this.test.fullTitle(), - ganacheOptions: defaultGanacheOptions, - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - await connectToDapp(driver); - - // close test dapp window to avoid future confusion - const windowHandles = await driver.getAllWindowHandles(); - await driver.closeWindowHandle(windowHandles[1]); - // disconnect dapp in fullscreen view - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement({ text: 'Settings', tag: 'div' }); - await driver.clickElement({ - text: 'Experimental', - tag: 'div', - }); - - await driver.clickElement( - '[data-testid="experimental-setting-toggle-request-queue"] label', - ); - await driver.clickElement( - '.settings-page__header__title-container__close-button', - ); - await driver.clickElement( - '[data-testid ="account-options-menu-button"]', - ); - await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); - const connectedDapp = await driver.isElementPresent({ - text: '127.0.0.1:8080', - tag: 'p', - }); - assert.ok(connectedDapp, 'Account connected to Dapp1'); - }, - ); - }); -}); diff --git a/test/e2e/tests/multichain/all-permissions-page.spec.ts b/test/e2e/tests/multichain/all-permissions-page.spec.ts new file mode 100644 index 000000000000..eca4052fdbf7 --- /dev/null +++ b/test/e2e/tests/multichain/all-permissions-page.spec.ts @@ -0,0 +1,77 @@ +import { DEFAULT_FIXTURE_ACCOUNT, DAPP_HOST_ADDRESS } from '../../constants'; +import { withFixtures, WINDOW_TITLES } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import ExperimentalSettings from '../../page-objects/pages/settings/experimental-settings'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import Homepage from '../../page-objects/pages/home/homepage'; +import PermissionListPage from '../../page-objects/pages/permission/permission-list-page'; +import SettingsPage from '../../page-objects/pages/settings/settings-page'; +import TestDapp from '../../page-objects/pages/test-dapp'; +import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; + +describe('Permissions Page', function () { + it('should show connected site permissions when a single dapp is connected', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithoutBalanceValidation(driver); + const testDapp = new TestDapp(driver); + await testDapp.openTestDappPage(); + await testDapp.connectAccount({ + publicAddress: DEFAULT_FIXTURE_ACCOUNT, + }); + + // switch to extension window and check the site permissions + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + const homepage = new Homepage(driver); + await homepage.check_pageIsLoaded(); + await homepage.check_expectedBalanceIsDisplayed(); + await homepage.headerNavbar.openPermissionsPage(); + + const permissionListPage = new PermissionListPage(driver); + await permissionListPage.check_pageIsLoaded(); + await permissionListPage.check_connectedToSite(DAPP_HOST_ADDRESS); + }, + ); + }); + + it('should show all permissions listed when experimental settings toggle is off', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithoutBalanceValidation(driver); + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openSettingsPage(); + + // go to experimental settings page and toggle request queue + const settingsPage = new SettingsPage(driver); + await settingsPage.check_pageIsLoaded(); + await settingsPage.goToExperimentalSettings(); + + const experimentalSettings = new ExperimentalSettings(driver); + await experimentalSettings.check_pageIsLoaded(); + await experimentalSettings.toggleRequestQueue(); + await settingsPage.closeSettingsPage(); + + // go to homepage and check site permissions + await new Homepage(driver).check_pageIsLoaded(); + await headerNavbar.openPermissionsPage(); + const permissionListPage = new PermissionListPage(driver); + await permissionListPage.check_pageIsLoaded(); + await permissionListPage.check_connectedToSite(DAPP_HOST_ADDRESS); + }, + ); + }); +}); diff --git a/test/e2e/tests/multichain/asset-list.spec.ts b/test/e2e/tests/multichain/asset-list.spec.ts index d7120a1fcace..b206ef1b4e56 100644 --- a/test/e2e/tests/multichain/asset-list.spec.ts +++ b/test/e2e/tests/multichain/asset-list.spec.ts @@ -9,7 +9,7 @@ import HeaderNavbar from '../../page-objects/pages/header-navbar'; import SelectNetwork from '../../page-objects/pages/dialog/select-network'; import { SMART_CONTRACTS } from '../../seeder/smart-contracts'; import SendTokenPage from '../../page-objects/pages/send/send-token-page'; -import AssetListPage from '../../page-objects/pages/asset-list'; +import AssetListPage from '../../page-objects/pages/home/asset-list'; const NETWORK_NAME_MAINNET = 'Ethereum Mainnet'; const LINEA_NAME_MAINNET = 'Linea Mainnet'; @@ -50,13 +50,13 @@ describe('Multichain Asset List', function (this: Suite) { const assetListPage = new AssetListPage(driver); await headerNavbar.clickSwitchNetworkDropDown(); await selectNetworkDialog.selectNetworkName(NETWORK_NAME_MAINNET); - await assetListPage.waitUntilAssetListHasItems(3); + await assetListPage.check_tokenItemNumber(3); await assetListPage.openNetworksFilter(); await assetListPage.clickCurrentNetworkOption(); await headerNavbar.clickSwitchNetworkDropDown(); await selectNetworkDialog.selectNetworkName(LINEA_NAME_MAINNET); await assetListPage.waitUntilFilterLabelIs(LINEA_NAME_MAINNET); - await assetListPage.waitUntilAssetListHasItems(1); + await assetListPage.check_tokenItemNumber(1); assert.equal( await assetListPage.getNetworksFilterLabel(), LINEA_NAME_MAINNET, @@ -80,7 +80,7 @@ describe('Multichain Asset List', function (this: Suite) { const assetListPage = new AssetListPage(driver); await headerNavbar.clickSwitchNetworkDropDown(); await selectNetworkDialog.selectNetworkName(NETWORK_NAME_MAINNET); - await assetListPage.waitUntilAssetListHasItems(3); + await assetListPage.check_tokenItemNumber(3); await driver.clickElement('.multichain-token-list-item'); const coinOverviewElement = await driver.findElement( '[data-testid="coin-overview-buy"]', @@ -113,7 +113,7 @@ describe('Multichain Asset List', function (this: Suite) { await headerNavbar.clickSwitchNetworkDropDown(); await selectNetworkDialog.selectNetworkName(NETWORK_NAME_MAINNET); const sendPage = new SendTokenPage(driver); - await assetListPage.waitUntilAssetListHasItems(4); + await assetListPage.check_tokenItemNumber(4); await assetListPage.clickOnAsset('TST'); await driver.clickElement('[data-testid="eth-overview-send"]'); await sendPage.check_networkChange(POLYGON_NAME_MAINNET); @@ -147,7 +147,7 @@ describe('Multichain Asset List', function (this: Suite) { const assetListPage = new AssetListPage(driver); await headerNavbar.clickSwitchNetworkDropDown(); await selectNetworkDialog.selectNetworkName(NETWORK_NAME_MAINNET); - await assetListPage.waitUntilAssetListHasItems(4); + await assetListPage.check_tokenItemNumber(4); await assetListPage.clickOnAsset('TST'); await driver.clickElement('.mm-box > button:nth-of-type(3)'); const toastTextElement = await driver.findElement('.toast-text'); @@ -176,8 +176,7 @@ describe('Multichain Asset List', function (this: Suite) { const selectNetworkDialog = new SelectNetwork(driver); await headerNavbar.clickSwitchNetworkDropDown(); await selectNetworkDialog.selectNetworkName(LINEA_NAME_MAINNET); - await assetListPage.waitUntilAssetListHasItems(3); - + await assetListPage.check_tokenItemNumber(3); await assetListPage.clickOnAsset('Ethereum'); const swapButton = await driver.findElement( diff --git a/test/e2e/tests/multichain/asset-picker-send.spec.ts b/test/e2e/tests/multichain/asset-picker-send.spec.ts index a071bec9426d..a6d8e193d537 100644 --- a/test/e2e/tests/multichain/asset-picker-send.spec.ts +++ b/test/e2e/tests/multichain/asset-picker-send.spec.ts @@ -88,7 +88,7 @@ describe('AssetPickerSendFlow @no-mmi', function () { await searchInputField.sendKeys('CHZ'); // check that CHZ is disabled - const [, tkn] = await driver.findElements( + const [tkn] = await driver.findElements( '[data-testid="multichain-token-list-button"]', ); diff --git a/test/e2e/tests/multichain/permission-page.spec.js b/test/e2e/tests/multichain/permission-page.spec.js deleted file mode 100644 index 5ae3f71b6046..000000000000 --- a/test/e2e/tests/multichain/permission-page.spec.js +++ /dev/null @@ -1,88 +0,0 @@ -const { strict: assert } = require('assert'); -const { - withFixtures, - WINDOW_TITLES, - connectToDapp, - logInWithBalanceValidation, - defaultGanacheOptions, -} = require('../../helpers'); -const FixtureBuilder = require('../../fixture-builder'); - -describe('Permissions Page', function () { - it('should show connected site permissions when a single dapp is connected', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().build(), - title: this.test.fullTitle(), - ganacheOptions: defaultGanacheOptions, - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - await connectToDapp(driver); - - // close test dapp window to avoid future confusion - const windowHandles = await driver.getAllWindowHandles(); - await driver.closeWindowHandle(windowHandles[1]); - // disconnect dapp in fullscreen view - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid ="account-options-menu-button"]', - ); - await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); - const connectedDapp = await driver.isElementPresent({ - text: '127.0.0.1:8080', - tag: 'p', - }); - assert.ok(connectedDapp, 'Account connected to Dapp1'); - }, - ); - }); - - it('should redirect users to connections page when users click on connected permission', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().build(), - title: this.test.fullTitle(), - ganacheOptions: defaultGanacheOptions, - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - await connectToDapp(driver); - - // close test dapp window to avoid future confusion - const windowHandles = await driver.getAllWindowHandles(); - await driver.closeWindowHandle(windowHandles[1]); - // disconnect dapp in fullscreen view - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid ="account-options-menu-button"]', - ); - await driver.clickElement({ text: 'All Permissions', tag: 'div' }); - await driver.clickElementAndWaitToDisappear({ - text: 'Got it', - tag: 'button', - }); - await driver.clickElement({ - text: '127.0.0.1:8080', - tag: 'p', - }); - await driver.clickElement('[data-testid ="connections-page"]'); - const connectionsPage = await driver.isElementPresent({ - text: '127.0.0.1:8080', - tag: 'span', - }); - assert.ok(connectionsPage, 'Connections Page is defined'); - }, - ); - }); -}); diff --git a/test/e2e/tests/multichain/permission-page.spec.ts b/test/e2e/tests/multichain/permission-page.spec.ts new file mode 100644 index 000000000000..a85e4f9ba1a4 --- /dev/null +++ b/test/e2e/tests/multichain/permission-page.spec.ts @@ -0,0 +1,33 @@ +import { DAPP_HOST_ADDRESS } from '../../constants'; +import { withFixtures } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import PermissionListPage from '../../page-objects/pages/permission/permission-list-page'; +import SitePermissionPage from '../../page-objects/pages/permission/site-permission-page'; +import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; + +describe('Permissions Page', function () { + it('should redirect users to connections page when users click on connected permission', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await loginWithoutBalanceValidation(driver); + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openPermissionsPage(); + const permissionListPage = new PermissionListPage(driver); + await permissionListPage.check_pageIsLoaded(); + + await permissionListPage.openPermissionPageForSite(DAPP_HOST_ADDRESS); + await new SitePermissionPage(driver).check_pageIsLoaded( + DAPP_HOST_ADDRESS, + ); + }, + ); + }); +}); diff --git a/test/e2e/tests/network/custom-rpc-history.spec.js b/test/e2e/tests/network/custom-rpc-history.spec.js index 6e92f532698f..2d1a52994d10 100644 --- a/test/e2e/tests/network/custom-rpc-history.spec.js +++ b/test/e2e/tests/network/custom-rpc-history.spec.js @@ -264,6 +264,7 @@ describe('Custom RPC history', function () { const customRpcs = await driver.findElements({ text: 'Localhost 8545', tag: 'p', + css: '.multichain-network-list-item__tooltip', }); // click Mainnet to dismiss network dropdown diff --git a/test/e2e/tests/network/multi-rpc.spec.ts b/test/e2e/tests/network/multi-rpc.spec.ts index f5c40259a33b..ebf8604a76ea 100644 --- a/test/e2e/tests/network/multi-rpc.spec.ts +++ b/test/e2e/tests/network/multi-rpc.spec.ts @@ -10,7 +10,7 @@ import { } from '../../helpers/mock-server'; import EditNetworkModal from '../../page-objects/pages/dialog/edit-network'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import OnboardingCompletePage from '../../page-objects/pages/onboarding/onboarding-complete-page'; import OnboardingPrivacySettingsPage from '../../page-objects/pages/onboarding/onboarding-privacy-settings-page'; import SelectNetwork from '../../page-objects/pages/dialog/select-network'; diff --git a/test/e2e/tests/network/switch-network.spec.ts b/test/e2e/tests/network/switch-network.spec.ts index b320e095cc69..78862ecb30b5 100644 --- a/test/e2e/tests/network/switch-network.spec.ts +++ b/test/e2e/tests/network/switch-network.spec.ts @@ -4,7 +4,7 @@ import { withFixtures, defaultGanacheOptions } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; import { Ganache } from '../../seeder/ganache'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; import { switchToNetworkFlow, diff --git a/test/e2e/tests/network/update-network.spec.ts b/test/e2e/tests/network/update-network.spec.ts index 3f0b9882688f..f7861f46ab99 100644 --- a/test/e2e/tests/network/update-network.spec.ts +++ b/test/e2e/tests/network/update-network.spec.ts @@ -23,7 +23,7 @@ const selectors = { deleteButton: { text: 'Delete', tag: 'button' }, cancelButton: { text: 'Cancel', tag: 'button' }, saveButton: { text: 'Save', tag: 'button' }, - updatedNetworkDropDown: { tag: 'span', text: 'Update Network' }, + updatedNetworkDropDown: { tag: 'p', text: 'Update Network' }, errorMessageInvalidUrl: { text: 'URLs require the appropriate HTTP/HTTPS prefix.', }, diff --git a/test/e2e/tests/notifications/mocks.ts b/test/e2e/tests/notifications/mocks.ts index b7069447fd45..c6f65d58dbb7 100644 --- a/test/e2e/tests/notifications/mocks.ts +++ b/test/e2e/tests/notifications/mocks.ts @@ -1,14 +1,11 @@ import { Mockttp, RequestRuleBuilder } from 'mockttp'; -import { AuthenticationController } from '@metamask/profile-sync-controller'; import { NotificationServicesController, NotificationServicesPushController, } from '@metamask/notification-services-controller'; import { USER_STORAGE_FEATURE_NAMES } from '@metamask/profile-sync-controller/sdk'; -import { UserStorageMockttpController } from '../../helpers/user-storage/userStorageMockttpController'; -import { accountsSyncMockResponse } from './account-syncing/mockData'; +import { UserStorageMockttpController } from '../../helpers/identity/user-storage/userStorageMockttpController'; -const AuthMocks = AuthenticationController.Mocks; const NotificationMocks = NotificationServicesController.Mocks; const PushMocks = NotificationServicesPushController.Mocks; @@ -19,7 +16,7 @@ type MockResponse = { }; /** - * E2E mock setup for notification APIs (Auth, UserStorage, Notifications, Push Notifications, Profile syncing) + * E2E mock setup for notification APIs (Notifications, Push Notifications) * * @param server - server obj used to mock our endpoints * @param userStorageMockttpControllerInstance - optional instance of UserStorageMockttpController, useful if you need persisted user storage between tests @@ -28,32 +25,7 @@ export async function mockNotificationServices( server: Mockttp, userStorageMockttpControllerInstance: UserStorageMockttpController = new UserStorageMockttpController(), ) { - // Auth - mockAPICall(server, AuthMocks.getMockAuthNonceResponse()); - mockAPICall(server, AuthMocks.getMockAuthLoginResponse()); - mockAPICall(server, AuthMocks.getMockAuthAccessTokenResponse()); - // Storage - if ( - !userStorageMockttpControllerInstance?.paths.get( - USER_STORAGE_FEATURE_NAMES.accounts, - ) - ) { - userStorageMockttpControllerInstance.setupPath( - USER_STORAGE_FEATURE_NAMES.accounts, - server, - ); - } - if ( - !userStorageMockttpControllerInstance?.paths.get( - USER_STORAGE_FEATURE_NAMES.networks, - ) - ) { - userStorageMockttpControllerInstance.setupPath( - USER_STORAGE_FEATURE_NAMES.networks, - server, - ); - } if ( !userStorageMockttpControllerInstance?.paths.get( USER_STORAGE_FEATURE_NAMES.notifications, @@ -106,63 +78,3 @@ function mockAPICall(server: Mockttp, response: MockResponse) { json: response.response, })); } - -type MockInfuraAndAccountSyncOptions = { - accountsToMock?: string[]; - accountsSyncResponse?: typeof accountsSyncMockResponse; -}; - -const MOCK_ETH_BALANCE = '0xde0b6b3a7640000'; -const INFURA_URL = - 'https://mainnet.infura.io/v3/00000000000000000000000000000000'; - -/** - * Sets up mock responses for Infura balance checks and account syncing - * - * @param mockServer - The Mockttp server instance - * @param userStorageMockttpController - Controller for user storage mocks - * @param options - Configuration options for mocking - */ -export async function mockInfuraAndAccountSync( - mockServer: Mockttp, - userStorageMockttpController: UserStorageMockttpController, - options: MockInfuraAndAccountSyncOptions = {}, -): Promise { - const accounts = options.accountsToMock ?? []; - - // Set up User Storage / Account Sync mock - userStorageMockttpController.setupPath( - USER_STORAGE_FEATURE_NAMES.accounts, - mockServer, - ); - - userStorageMockttpController.setupPath( - USER_STORAGE_FEATURE_NAMES.accounts, - mockServer, - { - getResponse: options.accountsSyncResponse ?? undefined, - }, - ); - - // Account Balances - if (accounts.length > 0) { - accounts.forEach((account) => { - mockServer - .forPost(INFURA_URL) - .withJsonBodyIncluding({ - method: 'eth_getBalance', - params: [account.toLowerCase()], - }) - .thenCallback(() => ({ - statusCode: 200, - json: { - jsonrpc: '2.0', - id: '1111111111111111', - result: MOCK_ETH_BALANCE, - }, - })); - }); - } - - mockNotificationServices(mockServer, userStorageMockttpController); -} diff --git a/test/e2e/tests/onboarding/onboarding.spec.ts b/test/e2e/tests/onboarding/onboarding.spec.ts index 979e416f5090..b55ddc193569 100644 --- a/test/e2e/tests/onboarding/onboarding.spec.ts +++ b/test/e2e/tests/onboarding/onboarding.spec.ts @@ -7,7 +7,7 @@ import { import { Driver } from '../../webdriver/driver'; import FixtureBuilder from '../../fixture-builder'; import { FirstTimeFlowType } from '../../../../shared/constants/onboarding'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import OnboardingCompletePage from '../../page-objects/pages/onboarding/onboarding-complete-page'; import OnboardingMetricsPage from '../../page-objects/pages/onboarding/onboarding-metrics-page'; import OnboardingPasswordPage from '../../page-objects/pages/onboarding/onboarding-password-page'; diff --git a/test/e2e/tests/petnames/petnames-helpers.js b/test/e2e/tests/petnames/petnames-helpers.js index 03747caba4be..c019cfbfa886 100644 --- a/test/e2e/tests/petnames/petnames-helpers.js +++ b/test/e2e/tests/petnames/petnames-helpers.js @@ -3,6 +3,11 @@ async function rejectSignatureOrTransactionRequest(driver) { await driver.delay(3000); } +async function rejectRedesignedSignatureOrTransactionRequest(driver) { + await driver.clickElement({ text: 'Cancel', tag: 'button' }); + await driver.delay(3000); +} + async function focusTestDapp(driver) { const windowHandles = await driver.getAllWindowHandles(); await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); @@ -49,6 +54,7 @@ async function saveName(driver, value, name, proposedName) { module.exports = { rejectSignatureOrTransactionRequest, + rejectRedesignedSignatureOrTransactionRequest, focusTestDapp, expectName, clickName, diff --git a/test/e2e/tests/petnames/petnames-signatures.spec.js b/test/e2e/tests/petnames/petnames-signatures.spec.js index 6c472901057e..4641424e053f 100644 --- a/test/e2e/tests/petnames/petnames-signatures.spec.js +++ b/test/e2e/tests/petnames/petnames-signatures.spec.js @@ -5,6 +5,7 @@ const { tempToggleSettingRedesignedConfirmations, unlockWallet, defaultGanacheOptions, + WINDOW_TITLES, } = require('../../helpers'); const FixtureBuilder = require('../../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('../../snaps/enums'); @@ -14,6 +15,7 @@ const { rejectSignatureOrTransactionRequest, saveName, clickName, + rejectRedesignedSignatureOrTransactionRequest, } = require('./petnames-helpers'); const SIGNATURE_TYPE = { @@ -95,109 +97,209 @@ async function expectProposedNames(driver, value, options) { } } -describe('Petnames - Signatures', function () { - it('can save names for addresses in type 3 signatures', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withNoNames() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V3); - await switchToNotificationWindow(driver, 3); - await expectName(driver, '0xCD2a3...DD826', false); - await expectName(driver, '0xbBbBB...bBBbB', false); - await saveName(driver, '0xCD2a3...DD826', undefined, 'test.lens'); - await saveName(driver, '0xbBbBB...bBBbB', undefined, 'test2.lens'); - await showThirdPartyDetails(driver); - await expectName(driver, '0xCcCCc...ccccC', false); - await saveName(driver, '0xCcCCc...ccccC', 'Custom Name'); - await closeThirdPartyDetails(driver); - await rejectSignatureOrTransactionRequest(driver); - await focusTestDapp(driver); - await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V3); - await switchToNotificationWindow(driver, 3); - await expectName(driver, 'test.lens', true); - await expectName(driver, 'test2.lens', true); - await showThirdPartyDetails(driver); - await expectName(driver, 'Custom Name', true); - }, - ); - }); +describe('Petnames - Signatures', function () { + describe('Old confirmation screens', function () { + it('can save names for addresses in type 3 signatures', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V3); + await switchToNotificationWindow(driver, 3); + await expectName(driver, '0xCD2a3...DD826', false); + await expectName(driver, '0xbBbBB...bBBbB', false); + await saveName(driver, '0xCD2a3...DD826', undefined, 'test.lens'); + await saveName(driver, '0xbBbBB...bBBbB', undefined, 'test2.lens'); + await showThirdPartyDetails(driver); + await expectName(driver, '0xCcCCc...ccccC', false); + await saveName(driver, '0xCcCCc...ccccC', 'Custom Name'); + await closeThirdPartyDetails(driver); + await rejectSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V3); + await switchToNotificationWindow(driver, 3); + await expectName(driver, 'test.lens', true); + await expectName(driver, 'test2.lens', true); + await showThirdPartyDetails(driver); + await expectName(driver, 'Custom Name', true); + }, + ); + }); - it('can save names for addresses in type 4 signatures', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withNoNames() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); - await switchToNotificationWindow(driver, 3); - await expectName(driver, '0xCD2a3...DD826', false); - await expectName(driver, '0xDeaDb...DbeeF', false); - await expectName(driver, '0xbBbBB...bBBbB', false); - await expectName(driver, '0xB0Bda...bEa57', false); - await expectName(driver, '0xB0B0b...00000', false); - await saveName(driver, '0xCD2a3...DD826', undefined, 'test.lens'); - await saveName(driver, '0xB0Bda...bEa57', undefined, 'Test Token 2'); - await showThirdPartyDetails(driver); - await expectName(driver, '0xCcCCc...ccccC', false); - await saveName(driver, '0xCcCCc...ccccC', 'Custom Name'); - await closeThirdPartyDetails(driver); - await rejectSignatureOrTransactionRequest(driver); - await focusTestDapp(driver); - await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); - await switchToNotificationWindow(driver, 3); - await expectName(driver, 'test.lens', true); - await expectName(driver, 'Test Token 2', true); - await showThirdPartyDetails(driver); - await expectName(driver, 'Custom Name', true); - }, - ); + it('can save names for addresses in type 4 signatures', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); + await switchToNotificationWindow(driver, 3); + await expectName(driver, '0xCD2a3...DD826', false); + await expectName(driver, '0xDeaDb...DbeeF', false); + await expectName(driver, '0xbBbBB...bBBbB', false); + await expectName(driver, '0xB0Bda...bEa57', false); + await expectName(driver, '0xB0B0b...00000', false); + await saveName(driver, '0xCD2a3...DD826', undefined, 'test.lens'); + await saveName(driver, '0xB0Bda...bEa57', undefined, 'Test Token 2'); + await showThirdPartyDetails(driver); + await expectName(driver, '0xCcCCc...ccccC', false); + await saveName(driver, '0xCcCCc...ccccC', 'Custom Name'); + await closeThirdPartyDetails(driver); + await rejectSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); + await switchToNotificationWindow(driver, 3); + await expectName(driver, 'test.lens', true); + await expectName(driver, 'Test Token 2', true); + await showThirdPartyDetails(driver); + await expectName(driver, 'Custom Name', true); + }, + ); + }); + + it('can propose names using installed snaps', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + await openDapp(driver); + await openTestSnaps(driver); + await installNameLookupSnap(driver); + await focusTestDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); + await switchToNotificationWindow(driver, 4); + await expectProposedNames(driver, '0xCD2a3...DD826', [ + ['test.lens', 'Lens Protocol'], + ['cd2.1337.test.domain', 'Name Lookup Example Snap'], + ]); + }, + ); + }); }); - it('can propose names using installed snaps', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withNoNames() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - await openDapp(driver); - await openTestSnaps(driver); - await installNameLookupSnap(driver); - await focusTestDapp(driver); - await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); - await switchToNotificationWindow(driver, 4); - await expectProposedNames(driver, '0xCD2a3...DD826', [ - ['test.lens', 'Lens Protocol'], - ['cd2.1337.test.domain', 'Name Lookup Example Snap'], - ]); - }, - ); + describe('Redesigned confirmation screens', function () { + it('can save names for addresses in type 3 signatures', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await openDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await expectName(driver, '0xCD2a3...DD826', false); + await expectName(driver, '0xbBbBB...bBBbB', false); + await saveName(driver, '0xCD2a3...DD826', undefined, 'test.lens'); + await saveName(driver, '0xbBbBB...bBBbB', undefined, 'test2.lens'); + await expectName(driver, '0xCcCCc...ccccC', false); + await saveName(driver, '0xCcCCc...ccccC', 'Custom Name'); + await rejectRedesignedSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await expectName(driver, 'test.lens', true); + await expectName(driver, 'test2.lens', true); + await expectName(driver, 'Custom Name', true); + }, + ); + }); + + it('can save names for addresses in type 4 signatures', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await openDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await expectName(driver, '0xCD2a3...DD826', false); + await expectName(driver, '0xDeaDb...DbeeF', false); + await expectName(driver, '0xbBbBB...bBBbB', false); + await expectName(driver, '0xB0Bda...bEa57', false); + await expectName(driver, '0xB0B0b...00000', false); + await saveName(driver, '0xCD2a3...DD826', undefined, 'test.lens'); + await saveName(driver, '0xB0Bda...bEa57', undefined, 'Test Token 2'); + await expectName(driver, '0xCcCCc...ccccC', false); + await saveName(driver, '0xCcCCc...ccccC', 'Custom Name'); + await rejectRedesignedSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await expectName(driver, 'test.lens', true); + await expectName(driver, 'Test Token 2', true); + await expectName(driver, 'Custom Name', true); + }, + ); + }); + + it('can propose names using installed snaps', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await openDapp(driver); + await openTestSnaps(driver); + await installNameLookupSnap(driver); + await focusTestDapp(driver); + await createSignatureRequest(driver, SIGNATURE_TYPE.TYPED_V4); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await expectProposedNames(driver, '0xCD2a3...DD826', [ + ['test.lens', 'Lens Protocol'], + ['cd2.1337.test.domain', 'Name Lookup Example Snap'], + ]); + }, + ); + }); }); }); diff --git a/test/e2e/tests/petnames/petnames-transactions.spec.js b/test/e2e/tests/petnames/petnames-transactions.spec.js index 55c295c51c3a..5546de0b4b82 100644 --- a/test/e2e/tests/petnames/petnames-transactions.spec.js +++ b/test/e2e/tests/petnames/petnames-transactions.spec.js @@ -13,6 +13,7 @@ const { focusTestDapp, rejectSignatureOrTransactionRequest, saveName, + rejectRedesignedSignatureOrTransactionRequest, } = require('./petnames-helpers'); async function createDappSendTransaction(driver) { @@ -37,89 +38,196 @@ const CUSTOM_NAME_MOCK = 'Custom Name'; const PROPOSED_NAME_MOCK = 'test4.lens'; describe('Petnames - Transactions', function () { - it('can save petnames for addresses in dapp send transactions', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withNoNames() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openDapp(driver); - await createDappSendTransaction(driver); - await switchToNotificationWindow(driver, 3); - await expectName(driver, ABBREVIATED_ADDRESS_MOCK, false); - - // Test custom name. - await saveName( - driver, - ABBREVIATED_ADDRESS_MOCK, - CUSTOM_NAME_MOCK, - undefined, - ); - await rejectSignatureOrTransactionRequest(driver); - await focusTestDapp(driver); - await createDappSendTransaction(driver); - await switchToNotificationWindow(driver, 3); - await expectName(driver, CUSTOM_NAME_MOCK, true); - - // Test proposed name. - await saveName(driver, CUSTOM_NAME_MOCK, undefined, PROPOSED_NAME_MOCK); - await rejectSignatureOrTransactionRequest(driver); - await focusTestDapp(driver); - await createDappSendTransaction(driver); - await switchToNotificationWindow(driver, 3); - await expectName(driver, PROPOSED_NAME_MOCK, true); - }, - ); + describe('Old confirmation screens', function () { + it('can save petnames for addresses in dapp send transactions', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await openDapp(driver); + await createDappSendTransaction(driver); + await switchToNotificationWindow(driver, 3); + await expectName(driver, ABBREVIATED_ADDRESS_MOCK, false); + + // Test custom name. + await saveName( + driver, + ABBREVIATED_ADDRESS_MOCK, + CUSTOM_NAME_MOCK, + undefined, + ); + await rejectSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createDappSendTransaction(driver); + await switchToNotificationWindow(driver, 3); + await expectName(driver, CUSTOM_NAME_MOCK, true); + + // Test proposed name. + await saveName( + driver, + CUSTOM_NAME_MOCK, + undefined, + PROPOSED_NAME_MOCK, + ); + await rejectSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createDappSendTransaction(driver); + await switchToNotificationWindow(driver, 3); + await expectName(driver, PROPOSED_NAME_MOCK, true); + }, + ); + }); + + it('can save petnames for addresses in wallet send transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createWalletSendTransaction(driver, ADDRESS_MOCK); + await expectName(driver, ABBREVIATED_ADDRESS_MOCK, false); + + // Test custom name. + await saveName( + driver, + ABBREVIATED_ADDRESS_MOCK, + CUSTOM_NAME_MOCK, + undefined, + ); + await rejectSignatureOrTransactionRequest(driver); + await createWalletSendTransaction(driver, ADDRESS_MOCK); + await expectName(driver, CUSTOM_NAME_MOCK, true); + + // Test proposed name. + await saveName( + driver, + CUSTOM_NAME_MOCK, + undefined, + PROPOSED_NAME_MOCK, + ); + await rejectSignatureOrTransactionRequest(driver); + await createWalletSendTransaction(driver, ADDRESS_MOCK); + await expectName(driver, PROPOSED_NAME_MOCK, true); + }, + ); + }); }); - it('can save petnames for addresses in wallet send transactions', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesController({ - featureFlags: { - sendHexData: true, - }, - }) - .withNoNames() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createWalletSendTransaction(driver, ADDRESS_MOCK); - await expectName(driver, ABBREVIATED_ADDRESS_MOCK, false); - - // Test custom name. - await saveName( - driver, - ABBREVIATED_ADDRESS_MOCK, - CUSTOM_NAME_MOCK, - undefined, - ); - await rejectSignatureOrTransactionRequest(driver); - await createWalletSendTransaction(driver, ADDRESS_MOCK); - await expectName(driver, CUSTOM_NAME_MOCK, true); - - // Test proposed name. - await saveName(driver, CUSTOM_NAME_MOCK, undefined, PROPOSED_NAME_MOCK); - await rejectSignatureOrTransactionRequest(driver); - await createWalletSendTransaction(driver, ADDRESS_MOCK); - await expectName(driver, PROPOSED_NAME_MOCK, true); - }, - ); + describe('Redesigned confirmation screens', function () { + it('can save petnames for addresses in dapp send transactions', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await openDapp(driver); + await createDappSendTransaction(driver); + await switchToNotificationWindow(driver, 3); + await expectName(driver, ABBREVIATED_ADDRESS_MOCK, false); + + // Test custom name. + await saveName( + driver, + ABBREVIATED_ADDRESS_MOCK, + CUSTOM_NAME_MOCK, + undefined, + ); + await rejectRedesignedSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createDappSendTransaction(driver); + await switchToNotificationWindow(driver, 3); + await expectName(driver, CUSTOM_NAME_MOCK, true); + + // Test proposed name. + await saveName( + driver, + CUSTOM_NAME_MOCK, + undefined, + PROPOSED_NAME_MOCK, + ); + await rejectRedesignedSignatureOrTransactionRequest(driver); + await focusTestDapp(driver); + await createDappSendTransaction(driver); + await switchToNotificationWindow(driver, 3); + await expectName(driver, PROPOSED_NAME_MOCK, true); + }, + ); + }); + + it('can save petnames for addresses in wallet send transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .withNoNames() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createWalletSendTransaction(driver, ADDRESS_MOCK); + await expectName(driver, ABBREVIATED_ADDRESS_MOCK, false); + + // Test custom name. + await saveName( + driver, + ABBREVIATED_ADDRESS_MOCK, + CUSTOM_NAME_MOCK, + undefined, + ); + await rejectRedesignedSignatureOrTransactionRequest(driver); + await createWalletSendTransaction(driver, ADDRESS_MOCK); + await expectName(driver, CUSTOM_NAME_MOCK, true); + + // Test proposed name. + await saveName( + driver, + CUSTOM_NAME_MOCK, + undefined, + PROPOSED_NAME_MOCK, + ); + await rejectRedesignedSignatureOrTransactionRequest(driver); + await createWalletSendTransaction(driver, ADDRESS_MOCK); + await expectName(driver, PROPOSED_NAME_MOCK, true); + }, + ); + }); }); }); diff --git a/test/e2e/tests/portfolio/portfolio-site.spec.js b/test/e2e/tests/portfolio/portfolio-site.spec.ts similarity index 56% rename from test/e2e/tests/portfolio/portfolio-site.spec.js rename to test/e2e/tests/portfolio/portfolio-site.spec.ts index cba9c0452522..f630de50f1da 100644 --- a/test/e2e/tests/portfolio/portfolio-site.spec.js +++ b/test/e2e/tests/portfolio/portfolio-site.spec.ts @@ -1,13 +1,13 @@ -const { - withFixtures, - unlockWallet, - defaultGanacheOptions, -} = require('../../helpers'); -const FixtureBuilder = require('../../fixture-builder'); -const { emptyHtmlPage } = require('../../mock-e2e'); +import { MockttpServer } from 'mockttp'; +import { withFixtures } from '../../helpers'; +import { EMPTY_E2E_TEST_PAGE_TITLE } from '../../constants'; +import FixtureBuilder from '../../fixture-builder'; +import { emptyHtmlPage } from '../../mock-e2e'; +import HomePage from '../../page-objects/pages/home/homepage'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; describe('Portfolio site', function () { - async function mockPortfolioSite(mockServer) { + async function mockPortfolioSite(mockServer: MockttpServer) { return await mockServer .forGet('https://portfolio.metamask.io/') .withQuery({ @@ -27,18 +27,15 @@ describe('Portfolio site', function () { { dapp: true, fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), + title: this.test?.fullTitle(), testSpecificMock: mockPortfolioSite, }, async ({ driver }) => { - await unlockWallet(driver); + await loginWithBalanceValidation(driver); + await new HomePage(driver).openPortfolioPage(); // Click Portfolio site - await driver.clickElement('[data-testid="portfolio-link"]'); - await driver.waitUntilXWindowHandles(2); - const windowHandles = await driver.getAllWindowHandles(); - await driver.switchToWindowWithTitle('E2E Test Page', windowHandles); + await driver.switchToWindowWithTitle(EMPTY_E2E_TEST_PAGE_TITLE); // Verify site await driver.waitForUrl({ diff --git a/test/e2e/tests/ppom/ppom-blockaid-alert-simple-send.spec.js b/test/e2e/tests/ppom/ppom-blockaid-alert-simple-send.spec.js index 5368c2617f13..370aab17a499 100644 --- a/test/e2e/tests/ppom/ppom-blockaid-alert-simple-send.spec.js +++ b/test/e2e/tests/ppom/ppom-blockaid-alert-simple-send.spec.js @@ -119,115 +119,157 @@ async function mockInfuraWithFailedResponses(mockServer) { * @see {@link https://wobbly-nutmeg-8a5.notion.site/MM-E2E-Testing-1e51b617f79240a49cd3271565c6e12d} */ describe('Simple Send Security Alert - Blockaid @no-mmi', function () { - it('should not show security alerts for benign requests', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withNetworkControllerOnMainnet() - .withPreferencesController({ - securityAlertsEnabled: true, - }) - .build(), - defaultGanacheOptions, - testSpecificMock: mockInfuraWithBenignResponses, - title: this.test.fullTitle(), - }, - - async ({ driver }) => { - await logInWithBalanceValidation(driver); - - await sendScreenToConfirmScreen(driver, mockBenignAddress, '1'); - - const isPresent = await driver.isElementPresent(bannerAlertSelector); - assert.equal(isPresent, false, `Banner alert unexpectedly found.`); - }, - ); - }); + describe('Old confirmation screens', function () { + it('should show "Be careful" if the PPOM request fails to check transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withNetworkControllerOnMainnet() + .withPreferencesController({ + securityAlertsEnabled: true, + }) + .build(), + defaultGanacheOptions, + testSpecificMock: mockInfuraWithFailedResponses, + title: this.test.fullTitle(), + }, + + async ({ driver }) => { + await logInWithBalanceValidation(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); - /** - * Disclaimer: This test does not test all reason types. e.g. 'blur_farming', - * 'malicious_domain'. Some other tests are found in other files: - * e.g. test/e2e/flask/ppom-blockaid-alert-.spec.js - */ - it('should show security alerts for malicious requests', async function () { - await withFixtures( - // we need to use localhost instead of the ip - // see issue: https://github.com/MetaMask/MetaMask-planning/issues/3560 - { - dapp: true, - fixtures: new FixtureBuilder() - .withNetworkControllerOnMainnet() - .withPermissionControllerConnectedToTestDapp({ - useLocalhostHostname: true, - }) - .withPreferencesController({ - securityAlertsEnabled: true, - }) - .build(), - defaultGanacheOptions, - testSpecificMock: mockInfuraWithMaliciousResponses, - title: this.test.fullTitle(), - }, - - async ({ driver }) => { - await logInWithBalanceValidation(driver); - - await driver.openNewPage('http://localhost:8080'); - - await driver.clickElement('#maliciousRawEthButton'); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - await driver.waitForSelector({ - css: '.mm-text--body-lg-medium', - text: expectedMaliciousTitle, - }); - - await driver.waitForSelector({ - css: '.mm-text--body-md', - text: expectedMaliciousDescription, - }); - }, - ); + await sendScreenToConfirmScreen( + driver, + '0xB8c77482e45F1F44dE1745F52C74426C631bDD52', + '1.1', + ); + const expectedTitle = 'Be careful'; + + const bannerAlert = await driver.findElement({ + css: bannerAlertSelector, + text: expectedTitle, + }); + + assert( + bannerAlert, + `Banner alert not found. Expected Title: ${expectedTitle}`, + ); + }, + ); + }); }); - it('should show "Be careful" if the PPOM request fails to check transaction', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withNetworkControllerOnMainnet() - .withPreferencesController({ - securityAlertsEnabled: true, - }) - .build(), - defaultGanacheOptions, - testSpecificMock: mockInfuraWithFailedResponses, - title: this.test.fullTitle(), - }, - - async ({ driver }) => { - await logInWithBalanceValidation(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await sendScreenToConfirmScreen( - driver, - '0xB8c77482e45F1F44dE1745F52C74426C631bDD52', - '1.1', - ); - const expectedTitle = 'Be careful'; - - const bannerAlert = await driver.findElement({ - css: bannerAlertSelector, - text: expectedTitle, - }); - - assert( - bannerAlert, - `Banner alert not found. Expected Title: ${expectedTitle}`, - ); - }, - ); + describe('Redesigned confirmation screens', function () { + it('should not show security alerts for benign requests', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withNetworkControllerOnMainnet() + .withPreferencesController({ + securityAlertsEnabled: true, + }) + .build(), + defaultGanacheOptions, + testSpecificMock: mockInfuraWithBenignResponses, + title: this.test.fullTitle(), + }, + + async ({ driver }) => { + await logInWithBalanceValidation(driver); + + await sendScreenToConfirmScreen(driver, mockBenignAddress, '1'); + + const isPresent = await driver.isElementPresent(bannerAlertSelector); + assert.equal(isPresent, false, `Banner alert unexpectedly found.`); + }, + ); + }); + + /** + * Disclaimer: This test does not test all reason types. e.g. 'blur_farming', + * 'malicious_domain'. Some other tests are found in other files: + * e.g. test/e2e/flask/ppom-blockaid-alert-.spec.js + */ + it('should show security alerts for malicious requests', async function () { + await withFixtures( + // we need to use localhost instead of the ip + // see issue: https://github.com/MetaMask/MetaMask-planning/issues/3560 + { + dapp: true, + fixtures: new FixtureBuilder() + .withNetworkControllerOnMainnet() + .withPermissionControllerConnectedToTestDapp({ + useLocalhostHostname: true, + }) + .withPreferencesController({ + securityAlertsEnabled: true, + }) + .build(), + defaultGanacheOptions, + testSpecificMock: mockInfuraWithMaliciousResponses, + title: this.test.fullTitle(), + }, + + async ({ driver }) => { + await logInWithBalanceValidation(driver); + + await driver.openNewPage('http://localhost:8080'); + + await driver.clickElement('#maliciousRawEthButton'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + await driver.waitForSelector({ + css: '.mm-text--body-lg-medium', + text: expectedMaliciousTitle, + }); + + await driver.waitForSelector({ + css: '.mm-text--body-md', + text: expectedMaliciousDescription, + }); + }, + ); + }); + + it('should show "Be careful" if the PPOM request fails to check transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withNetworkControllerOnMainnet() + .withPreferencesController({ + securityAlertsEnabled: true, + }) + .build(), + defaultGanacheOptions, + testSpecificMock: mockInfuraWithFailedResponses, + title: this.test.fullTitle(), + }, + + async ({ driver }) => { + await logInWithBalanceValidation(driver); + + await sendScreenToConfirmScreen( + driver, + '0xB8c77482e45F1F44dE1745F52C74426C631bDD52', + '1.1', + ); + const expectedTitle = 'Be careful'; + + const bannerAlert = await driver.findElement({ + css: '[data-testid="confirm-banner-alert"]', + text: expectedTitle, + }); + + assert( + bannerAlert, + `Banner alert not found. Expected Title: ${expectedTitle}`, + ); + }, + ); + }); }); }); diff --git a/test/e2e/tests/ppom/ppom-blockaid-alert-trade-order-farming.spec.js b/test/e2e/tests/ppom/ppom-blockaid-alert-trade-order-farming.spec.js index ac17614bc5af..d312daa340e1 100644 --- a/test/e2e/tests/ppom/ppom-blockaid-alert-trade-order-farming.spec.js +++ b/test/e2e/tests/ppom/ppom-blockaid-alert-trade-order-farming.spec.js @@ -118,7 +118,9 @@ describe('PPOM Blockaid Alert - Set Trade farming order @no-mmi', function () { await driver.clickElement('#maliciousTradeOrder'); await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.assertElementNotPresent('.loading-indicator'); + await driver.assertElementNotPresent('.loading-indicator', { + timeout: 20000, + }); await driver.waitForSelector({ css: '.mm-text--body-lg-medium', diff --git a/test/e2e/tests/privacy-mode/privacy-mode.spec.js b/test/e2e/tests/privacy-mode/privacy-mode.spec.js deleted file mode 100644 index ede37f900e66..000000000000 --- a/test/e2e/tests/privacy-mode/privacy-mode.spec.js +++ /dev/null @@ -1,106 +0,0 @@ -const { strict: assert } = require('assert'); -const { - withFixtures, - unlockWallet, - defaultGanacheOptions, -} = require('../../helpers'); -const FixtureBuilder = require('../../fixture-builder'); - -describe('Privacy Mode', function () { - it('should activate privacy mode, then deactivate it', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().withPreferencesController().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - async function checkForHeaderValue(value) { - const balanceElement = await driver.findElement( - '[data-testid="account-value-and-suffix"]', - ); - const surveyText = await balanceElement.getText(); - assert.equal( - surveyText, - value, - `Header balance should be "${value}"`, - ); - } - - async function checkForTokenValue(value) { - const balanceElement = await driver.findElement( - '[data-testid="multichain-token-list-item-value"]', - ); - const surveyText = await balanceElement.getText(); - assert.equal(surveyText, value, `Token balance should be "${value}"`); - } - - async function checkForPrivacy() { - await checkForHeaderValue('••••••'); - await checkForTokenValue('••••••'); - } - - async function checkForNoPrivacy() { - await checkForHeaderValue('25'); - await checkForTokenValue('25 ETH'); - } - - async function togglePrivacy() { - const balanceElement = await driver.findElement( - '[data-testid="account-value-and-suffix"]', - ); - const initialText = await balanceElement.getText(); - - await driver.clickElement('[data-testid="sensitive-toggle"]'); - await driver.wait(async () => { - const currentText = await balanceElement.getText(); - return currentText !== initialText; - }, 2e3); - } - - await unlockWallet(driver); - await checkForNoPrivacy(); - await togglePrivacy(); - await checkForPrivacy(); - await togglePrivacy(); - await checkForNoPrivacy(); - }, - ); - }); - - it('should hide fiat balance and token balance when privacy mode is activated', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().withPreferencesController().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - async function togglePrivacy() { - const balanceElement = await driver.findElement( - '[data-testid="account-value-and-suffix"]', - ); - const initialText = await balanceElement.getText(); - - await driver.clickElement('[data-testid="sensitive-toggle"]'); - await driver.wait(async () => { - const currentText = await balanceElement.getText(); - return currentText !== initialText; - }, 2e3); - } - - await togglePrivacy(); - await driver.clickElement('[data-testid="account-menu-icon"]'); - const valueText = await driver.findElement( - '[data-testid="account-value-and-suffix"]', - ); - const valueTextContent = await valueText.getText(); - - assert.equal(valueTextContent, '••••••'); - }, - ); - }); -}); diff --git a/test/e2e/tests/privacy-mode/privacy-mode.spec.ts b/test/e2e/tests/privacy-mode/privacy-mode.spec.ts new file mode 100644 index 000000000000..60d9faedc080 --- /dev/null +++ b/test/e2e/tests/privacy-mode/privacy-mode.spec.ts @@ -0,0 +1,74 @@ +import { Driver } from '../../webdriver/driver'; +import { defaultGanacheOptions, withFixtures } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import AccountListPage from '../../page-objects/pages/account-list-page'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import HomePage from '../../page-objects/pages/home/homepage'; +import { + loginWithBalanceValidation, + loginWithoutBalanceValidation, +} from '../../page-objects/flows/login.flow'; +import { Ganache } from '../../seeder/ganache'; + +describe('Privacy Mode', function () { + it('should hide fiat balance and token balance when privacy mode is activated', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ + driver, + ganacheServer, + }: { + driver: Driver; + ganacheServer: Ganache; + }) => { + await loginWithBalanceValidation(driver, ganacheServer); + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + await homePage.togglePrivacyBalance(); + await homePage.check_expectedBalanceIsDisplayed('••••••', '••••••'); + + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); + + const accountList = new AccountListPage(driver); + await accountList.check_pageIsLoaded(); + await accountList.check_balanceIsPrivateEverywhere(); + }, + ); + }); + + it('should show fiat balance and token balance when privacy mode is deactivated', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesController({ + preferences: { + privacyMode: true, + }, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ driver }: { driver: Driver }) => { + await loginWithoutBalanceValidation(driver); + + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + await homePage.togglePrivacyBalance(); + await homePage.check_expectedBalanceIsDisplayed('25 ETH'); + + const headerNavbar = new HeaderNavbar(driver); + await headerNavbar.openAccountMenu(); + + const accountList = new AccountListPage(driver); + await accountList.check_pageIsLoaded(); + await accountList.check_accountBalanceDisplayed('25'); + }, + ); + }); +}); diff --git a/test/e2e/tests/privacy/account-tracker-api-usage.spec.ts b/test/e2e/tests/privacy/account-tracker-api-usage.spec.ts index 24f2318fa13b..d5c9b3e82076 100644 --- a/test/e2e/tests/privacy/account-tracker-api-usage.spec.ts +++ b/test/e2e/tests/privacy/account-tracker-api-usage.spec.ts @@ -8,7 +8,7 @@ import { withFixtures, } from '../../helpers'; import { Mockttp } from '../../mock-e2e'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; async function mockInfura(mockServer: Mockttp): Promise { diff --git a/test/e2e/tests/privacy/basic-functionality.spec.js b/test/e2e/tests/privacy/basic-functionality.spec.js deleted file mode 100644 index 77e9dad0b46f..000000000000 --- a/test/e2e/tests/privacy/basic-functionality.spec.js +++ /dev/null @@ -1,176 +0,0 @@ -const { strict: assert } = require('assert'); -const { defaultGanacheOptions, withFixtures } = require('../../helpers'); -const { METAMASK_STALELIST_URL } = require('../phishing-controller/helpers'); -const FixtureBuilder = require('../../fixture-builder'); -const { - importSRPOnboardingFlow, -} = require('../../page-objects/flows/onboarding.flow'); - -async function mockApis(mockServer) { - return [ - await mockServer.forGet(METAMASK_STALELIST_URL).thenCallback(() => { - return { - statusCode: 200, - body: [{ fakedata: true }], - }; - }), - await mockServer - .forGet('https://token.api.cx.metamask.io/tokens/1') - .thenCallback(() => { - return { - statusCode: 200, - body: [{ fakedata: true }], - }; - }), - await mockServer - .forGet('https://min-api.cryptocompare.com/data/pricemulti') - .withQuery({ fsyms: 'ETH', tsyms: 'usd' }) - .thenCallback(() => { - return { - statusCode: 200, - json: { - fakedata: 0, - }, - }; - }), - ]; -} - -describe('MetaMask onboarding @no-mmi', function () { - it('should prevent network requests to basic functionality endpoints when the basic functionality toggle is off', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder({ onboarding: true }).build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - testSpecificMock: mockApis, - }, - async ({ driver, mockedEndpoint: mockedEndpoints }) => { - await importSRPOnboardingFlow({ driver }); - - await driver.clickElement({ - text: 'Manage default privacy settings', - tag: 'button', - }); - await driver.clickElement('[data-testid="category-item-General"]'); - - await driver.clickElement( - '[data-testid="basic-functionality-toggle"] .toggle-button', - ); - - await driver.clickElement('[id="basic-configuration-checkbox"]'); - await driver.clickElement({ text: 'Turn off', tag: 'button' }); - await driver.clickElement('[data-testid="category-back-button"]'); - await driver.clickElement('[data-testid="category-item-Assets"]'); - await driver.clickElement( - '[data-testid="currency-rate-check-toggle"] .toggle-button', - ); - await driver.clickElement('[data-testid="category-back-button"]'); - - // Wait until the onboarding carousel has stopped moving - // otherwise the click has no effect. - await driver.waitForElementToStopMoving( - '[data-testid="privacy-settings-back-button"]', - ); - await driver.clickElement( - '[data-testid="privacy-settings-back-button"]', - ); - - await driver.clickElementAndWaitToDisappear({ - text: 'Done', - tag: 'button', - }); - await driver.clickElement({ - text: 'Next', - tag: 'button', - }); - - // Wait until the onboarding carousel has stopped moving - // otherwise the click has no effect. - await driver.waitForElementToStopMoving({ - text: 'Done', - tag: 'button', - }); - await driver.clickElementAndWaitToDisappear({ - text: 'Done', - tag: 'button', - }); - - await driver.clickElement('[data-testid="network-display"]'); - - await driver.clickElement({ text: 'Ethereum Mainnet', tag: 'p' }); - - // Wait until network is fully switched and refresh tokens before asserting to mitigate flakiness - await driver.assertElementNotPresent('.loading-overlay'); - await driver.clickElement(`[data-testid="import-token-button"]`); - await driver.clickElement('[data-testid="refreshList"]'); - - for (let i = 0; i < mockedEndpoints.length; i += 1) { - const requests = await mockedEndpoints[i].getSeenRequests(); - - assert.equal( - requests.length, - 0, - `${mockedEndpoints[i]} should make requests after onboarding`, - ); - } - }, - ); - }); - - it('should not prevent network requests to basic functionality endpoints when the basic functionality toggle is on', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder({ onboarding: true }).build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - testSpecificMock: mockApis, - }, - async ({ driver, mockedEndpoint: mockedEndpoints }) => { - await importSRPOnboardingFlow({ driver }); - - await driver.clickElement({ - text: 'Manage default privacy settings', - tag: 'button', - }); - await driver.clickElement('[data-testid="category-item-General"]'); - // Wait until the onboarding carousel has stopped moving - // otherwise the click has no effect. - await driver.waitForElementToStopMoving( - '[data-testid="category-back-button"]', - ); - await driver.clickElement('[data-testid="category-back-button"]'); - // Wait until the onboarding carousel has stopped moving - // otherwise the click has no effect. - await driver.waitForElementToStopMoving( - '[data-testid="privacy-settings-back-button"]', - ); - await driver.clickElement( - '[data-testid="privacy-settings-back-button"]', - ); - await driver.clickElement({ text: 'Done', tag: 'button' }); - await driver.clickElement('[data-testid="pin-extension-next"]'); - await driver.clickElement({ text: 'Done', tag: 'button' }); - - await driver.clickElement('[data-testid="network-display"]'); - - await driver.clickElement({ text: 'Ethereum Mainnet', tag: 'p' }); - - // Wait until network is fully switched and refresh tokens before asserting to mitigate flakiness - await driver.assertElementNotPresent('.loading-overlay'); - await driver.clickElement(`[data-testid="import-token-button"]`); - await driver.clickElement('[data-testid="refreshList"]'); - // intended delay to allow for network requests to complete - await driver.delay(1000); - for (let i = 0; i < mockedEndpoints.length; i += 1) { - const requests = await mockedEndpoints[i].getSeenRequests(); - assert.equal( - requests.length, - 1, - `${mockedEndpoints[i]} should make requests after onboarding`, - ); - } - }, - ); - }); -}); diff --git a/test/e2e/tests/privacy/basic-functionality.spec.ts b/test/e2e/tests/privacy/basic-functionality.spec.ts new file mode 100644 index 000000000000..3d438f8d3474 --- /dev/null +++ b/test/e2e/tests/privacy/basic-functionality.spec.ts @@ -0,0 +1,120 @@ +import { strict as assert } from 'assert'; +import { Mockttp } from 'mockttp'; +import { defaultGanacheOptions, withFixtures } from '../../helpers'; +import { METAMASK_STALELIST_URL } from '../phishing-controller/helpers'; +import FixtureBuilder from '../../fixture-builder'; +import HomePage from '../../page-objects/pages/home/homepage'; +import OnboardingCompletePage from '../../page-objects/pages/onboarding/onboarding-complete-page'; +import OnboardingPrivacySettingsPage from '../../page-objects/pages/onboarding/onboarding-privacy-settings-page'; +import { switchToNetworkFlow } from '../../page-objects/flows/network.flow'; +import { + completeImportSRPOnboardingFlow, + importSRPOnboardingFlow, +} from '../../page-objects/flows/onboarding.flow'; + +async function mockApis(mockServer: Mockttp) { + return [ + await mockServer.forGet(METAMASK_STALELIST_URL).thenCallback(() => { + return { + statusCode: 200, + json: [{ fakedata: true }], + }; + }), + await mockServer + .forGet('https://token.api.cx.metamask.io/tokens/1') + .thenCallback(() => { + return { + statusCode: 200, + json: [{ fakedata: true }], + }; + }), + await mockServer + .forGet('https://min-api.cryptocompare.com/data/pricemulti') + .withQuery({ fsyms: 'ETH', tsyms: 'usd' }) + .thenCallback(() => { + return { + statusCode: 200, + json: { + fakedata: 0, + }, + }; + }), + ]; +} + +describe('MetaMask onboarding @no-mmi', function () { + it('should prevent network requests to basic functionality endpoints when the basic functionality toggle is off', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder({ onboarding: true }).build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + testSpecificMock: mockApis, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await importSRPOnboardingFlow({ driver }); + + const onboardingCompletePage = new OnboardingCompletePage(driver); + await onboardingCompletePage.check_pageIsLoaded(); + await onboardingCompletePage.check_walletReadyMessageIsDisplayed(); + await onboardingCompletePage.navigateToDefaultPrivacySettings(); + + const onboardingPrivacySettingsPage = new OnboardingPrivacySettingsPage( + driver, + ); + await onboardingPrivacySettingsPage.toggleBasicFunctionalitySettings(); + await onboardingPrivacySettingsPage.toggleAssetsSettings(); + await onboardingPrivacySettingsPage.navigateBackToOnboardingCompletePage(); + + await onboardingCompletePage.check_pageIsLoaded(); + await onboardingCompletePage.completeOnboarding(); + + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + + await switchToNetworkFlow(driver, 'Ethereum Mainnet'); + await homePage.refreshErc20TokenList(); + + for (const mockedEndpoint of mockedEndpoints) { + const requests = await mockedEndpoint.getSeenRequests(); + assert.equal( + requests.length, + 0, + `${mockedEndpoint} should make requests after onboarding`, + ); + } + }, + ); + }); + + it('should not prevent network requests to basic functionality endpoints when the basic functionality toggle is on', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder({ onboarding: true }).build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + testSpecificMock: mockApis, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await completeImportSRPOnboardingFlow({ driver }); + + const homePage = new HomePage(driver); + await homePage.check_pageIsLoaded(); + + await switchToNetworkFlow(driver, 'Ethereum Mainnet'); + await homePage.refreshErc20TokenList(); + + // intended delay to allow for network requests to complete + await driver.delay(1000); + for (const mockedEndpoint of mockedEndpoints) { + const requests = await mockedEndpoint.getSeenRequests(); + assert.equal( + requests.length, + 1, + `${mockedEndpoint} should make requests after onboarding`, + ); + } + }, + ); + }); +}); diff --git a/test/e2e/tests/privacy/onboarding-infura-call-privacy.spec.ts b/test/e2e/tests/privacy/onboarding-infura-call-privacy.spec.ts index f1bdc08166b7..aca018eb52ee 100644 --- a/test/e2e/tests/privacy/onboarding-infura-call-privacy.spec.ts +++ b/test/e2e/tests/privacy/onboarding-infura-call-privacy.spec.ts @@ -2,7 +2,7 @@ import assert from 'assert'; import { Mockttp, MockedEndpoint } from 'mockttp'; import { withFixtures, regularDelayMs } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import OnboardingCompletePage from '../../page-objects/pages/onboarding/onboarding-complete-page'; import { importSRPOnboardingFlow, diff --git a/test/e2e/tests/privacy/onboarding-token-price-call-privacy.spec.ts b/test/e2e/tests/privacy/onboarding-token-price-call-privacy.spec.ts index f565c0bb354e..7085c1317610 100644 --- a/test/e2e/tests/privacy/onboarding-token-price-call-privacy.spec.ts +++ b/test/e2e/tests/privacy/onboarding-token-price-call-privacy.spec.ts @@ -2,7 +2,7 @@ import assert from 'assert'; import { Mockttp, MockedEndpoint } from 'mockttp'; import { withFixtures, regularDelayMs } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import OnboardingCompletePage from '../../page-objects/pages/onboarding/onboarding-complete-page'; import { importSRPOnboardingFlow, diff --git a/test/e2e/tests/privacy/polling.spec.ts b/test/e2e/tests/privacy/polling.spec.ts index b63e1bce6191..b91a72e9d23e 100644 --- a/test/e2e/tests/privacy/polling.spec.ts +++ b/test/e2e/tests/privacy/polling.spec.ts @@ -5,7 +5,7 @@ import { expect } from '@playwright/test'; import FixtureBuilder from '../../fixture-builder'; import { defaultGanacheOptions, withFixtures } from '../../helpers'; import { Mockttp } from '../../mock-e2e'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; const infuraMainnetUrl = diff --git a/test/e2e/tests/remote-feature-flag/mock-data.ts b/test/e2e/tests/remote-feature-flag/mock-data.ts new file mode 100644 index 000000000000..5d05dc9367f9 --- /dev/null +++ b/test/e2e/tests/remote-feature-flag/mock-data.ts @@ -0,0 +1,4 @@ +export const MOCK_REMOTE_FEATURE_FLAGS_RESPONSE = { + feature1: true, + feature2: false, +}; diff --git a/test/e2e/tests/remote-feature-flag/remote-feature-flag.spec.ts b/test/e2e/tests/remote-feature-flag/remote-feature-flag.spec.ts new file mode 100644 index 000000000000..d8d6878e37c4 --- /dev/null +++ b/test/e2e/tests/remote-feature-flag/remote-feature-flag.spec.ts @@ -0,0 +1,42 @@ +import { strict as assert } from 'assert'; +import { Suite } from 'mocha'; +import { getCleanAppState, withFixtures } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import { TestSuiteArguments } from '../confirmations/transactions/shared'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; +import { MOCK_REMOTE_FEATURE_FLAGS_RESPONSE } from './mock-data'; + +describe('Remote feature flag', function (this: Suite) { + it('should be fetched when basic functionality toggle is on', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + title: this.test?.fullTitle(), + }, + async ({ driver }: TestSuiteArguments) => { + await loginWithBalanceValidation(driver); + const uiState = await getCleanAppState(driver); + assert.deepStrictEqual( + uiState.metamask.remoteFeatureFlags, + MOCK_REMOTE_FEATURE_FLAGS_RESPONSE, + ); + }, + ); + }); + + it('should not be fetched when basic functionality toggle is off', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withUseBasicFunctionalityDisabled() + .build(), + title: this.test?.fullTitle(), + }, + async ({ driver }: TestSuiteArguments) => { + await loginWithBalanceValidation(driver); + const uiState = await getCleanAppState(driver); + assert.deepStrictEqual(uiState.metamask.remoteFeatureFlags, {}); + }, + ); + }); +}); diff --git a/test/e2e/tests/request-queuing/sendTx-revokePermissions.spec.js b/test/e2e/tests/request-queuing/sendTx-revokePermissions.spec.js deleted file mode 100644 index 363f7c94cc74..000000000000 --- a/test/e2e/tests/request-queuing/sendTx-revokePermissions.spec.js +++ /dev/null @@ -1,58 +0,0 @@ -const FixtureBuilder = require('../../fixture-builder'); -const { - withFixtures, - openDapp, - unlockWallet, - DAPP_URL, - defaultGanacheOptions, -} = require('../../helpers'); -const { PAGES } = require('../../webdriver/driver'); - -describe('Request Queuing', function () { - it('should clear tx confirmation when revokePermission is called from origin dapp', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withPreferencesControllerUseRequestQueueEnabled() - .withSelectedNetworkControllerPerDomain() - .build(), - ganacheOptions: { - ...defaultGanacheOptions, - }, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - // Navigate to extension home screen - await driver.navigate(PAGES.HOME); - - // Open Dapp One - await openDapp(driver, undefined, DAPP_URL); - - // wallet_revokePermissions request - const revokePermissionsRequest = JSON.stringify({ - jsonrpc: '2.0', - method: 'wallet_revokePermissions', - params: [ - { - eth_accounts: {}, - }, - ], - }); - - await driver.executeScript( - `return window.ethereum.request(${revokePermissionsRequest})`, - ); - - // Should have cleared the tx confirmation - await driver.waitUntilXWindowHandles(2); - - // Cleared eth_accounts account label - await driver.findElement({ xpath: '//span[@id="accounts"][.=""]' }); - }, - ); - }); -}); diff --git a/test/e2e/tests/request-queuing/sendTx-revokePermissions.spec.ts b/test/e2e/tests/request-queuing/sendTx-revokePermissions.spec.ts new file mode 100644 index 000000000000..9f5454404806 --- /dev/null +++ b/test/e2e/tests/request-queuing/sendTx-revokePermissions.spec.ts @@ -0,0 +1,76 @@ +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; +import TestDapp from '../../page-objects/pages/test-dapp'; +import TransactionConfirmation from '../../page-objects/pages/confirmations/redesign/transaction-confirmation'; +import { Ganache } from '../../seeder/ganache'; +import { Driver } from '../../webdriver/driver'; +import { DEFAULT_FIXTURE_ACCOUNT } from '../../constants'; +import FixtureBuilder from '../../fixture-builder'; +import { + withFixtures, + defaultGanacheOptions, + WINDOW_TITLES, +} from '../../helpers'; + +describe('Request Queuing', function () { + // TODO: add a new spec which checks that after revoking and connecting again + // a pending tx is still closed when using revokePermissions. + // To be done once this bug is fixed: #29272 + it('should clear tx confirmation when revokePermission is called from origin dapp', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withPreferencesControllerUseRequestQueueEnabled() + .withSelectedNetworkControllerPerDomain() + .build(), + ganacheOptions: { + ...defaultGanacheOptions, + }, + title: this.test?.fullTitle(), + }, + async ({ + driver, + ganacheServer, + }: { + driver: Driver; + ganacheServer?: Ganache; + }) => { + await loginWithBalanceValidation(driver, ganacheServer); + + // Open test dapp + const testDapp = new TestDapp(driver); + await testDapp.openTestDappPage(); + await testDapp.check_connectedAccounts(DEFAULT_FIXTURE_ACCOUNT); + + // Trigger a tx + await testDapp.clickSimpleSendButton(); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + const transactionConfirmation = new TransactionConfirmation(driver); + await transactionConfirmation.check_dappInitiatedHeadingTitle(); + + // wallet_revokePermissions request + const revokePermissionsRequest = JSON.stringify({ + jsonrpc: '2.0', + method: 'wallet_revokePermissions', + params: [ + { + eth_accounts: {}, + }, + ], + }); + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.executeScript( + `return window.ethereum.request(${revokePermissionsRequest})`, + ); + + // Should have cleared the tx confirmation + await driver.waitUntilXWindowHandles(2); + + // Cleared eth_accounts account label + await testDapp.check_connectedAccounts(DEFAULT_FIXTURE_ACCOUNT, false); + }, + ); + }); +}); diff --git a/test/e2e/tests/responsive-ui/metamask-responsive-ui.spec.js b/test/e2e/tests/responsive-ui/metamask-responsive-ui.spec.js index c1ff9f3477ab..54236d84f2f5 100644 --- a/test/e2e/tests/responsive-ui/metamask-responsive-ui.spec.js +++ b/test/e2e/tests/responsive-ui/metamask-responsive-ui.spec.js @@ -11,165 +11,234 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('MetaMask Responsive UI', function () { - it('Creating a new wallet @no-mmi', async function () { - const driverOptions = { constrainWindowSize: true }; - - await withFixtures( - { - fixtures: new FixtureBuilder({ onboarding: true }).build(), - driverOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await driver.navigate(); - - // agree to terms of use - await driver.clickElement('[data-testid="onboarding-terms-checkbox"]'); - - // welcome - await driver.clickElement('[data-testid="onboarding-create-wallet"]'); - - // metrics - await driver.clickElement('[data-testid="metametrics-no-thanks"]'); - - // create password - await driver.fill( - '[data-testid="create-password-new"]', - 'correct horse battery staple', - ); - await driver.fill( - '[data-testid="create-password-confirm"]', - 'correct horse battery staple', - ); - await driver.clickElement('[data-testid="create-password-terms"]'); - await driver.clickElement('[data-testid="create-password-wallet"]'); - - // secure wallet - await driver.clickElement('[data-testid="secure-wallet-recommended"]'); - - // review - await driver.clickElement('[data-testid="recovery-phrase-reveal"]'); - const chipTwo = await ( - await driver.findElement('[data-testid="recovery-phrase-chip-2"]') - ).getText(); - const chipThree = await ( - await driver.findElement('[data-testid="recovery-phrase-chip-3"]') - ).getText(); - const chipSeven = await ( - await driver.findElement('[data-testid="recovery-phrase-chip-7"]') - ).getText(); - await driver.clickElement('[data-testid="recovery-phrase-next"]'); - - // confirm - await driver.fill('[data-testid="recovery-phrase-input-2"]', chipTwo); - await driver.fill('[data-testid="recovery-phrase-input-3"]', chipThree); - await driver.fill('[data-testid="recovery-phrase-input-7"]', chipSeven); - await driver.clickElement('[data-testid="recovery-phrase-confirm"]'); - - // complete - await driver.clickElement('[data-testid="onboarding-complete-done"]'); - - // pin extension - await driver.clickElement('[data-testid="pin-extension-next"]'); - await driver.clickElement('[data-testid="pin-extension-done"]'); - await driver.assertElementNotPresent('.loading-overlay__spinner'); - // assert balance - await driver.waitForSelector({ - css: '[data-testid="eth-overview__primary-currency"]', - text: '0', - }); - }, - ); - }); + describe('Old confirmation screens', function () { + it('Send Transaction from responsive window', async function () { + const driverOptions = { constrainWindowSize: true }; + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + driverOptions, + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Send ETH from inside MetaMask + // starts to send a transaction + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + const inputAmount = await driver.fill('input[placeholder="0"]', '1'); + + const inputValue = await inputAmount.getProperty('value'); + assert.equal(inputValue, '1'); + await driver.clickElement({ text: 'Continue', tag: 'button' }); - it('Importing existing wallet from lock page', async function () { - const driverOptions = { constrainWindowSize: true }; - - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - driverOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await driver.navigate(); - - // Import Secret Recovery Phrase - await driver.waitForSelector({ - tag: 'span', - text: 'Localhost 8545', - }); - await driver.clickElement({ - css: '.unlock-page__link', - text: 'Forgot password?', - }); - - await driver.pasteIntoField( - '[data-testid="import-srp__srp-word-0"]', - TEST_SEED_PHRASE_TWO, - ); - - await driver.fill('#password', 'correct horse battery staple'); - await driver.fill('#confirm-password', 'correct horse battery staple'); - await driver.press('#confirm-password', driver.Key.ENTER); - - // balance renders - await locateAccountBalanceDOM(driver, ganacheServer); - }, - ); + // wait for transaction value to be rendered and confirm + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '1.000042', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // finds the transaction in the transactions list + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1 ETH', + }); + }, + ); + }); }); - it('Send Transaction from responsive window', async function () { - const driverOptions = { constrainWindowSize: true }; - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - driverOptions, - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Send ETH from inside MetaMask - // starts to send a transaction - await openActionMenuAndStartSendFlow(driver); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - const inputAmount = await driver.fill('input[placeholder="0"]', '1'); - - const inputValue = await inputAmount.getProperty('value'); - assert.equal(inputValue, '1'); - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // wait for transaction value to be rendered and confirm - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '1.000042', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // finds the transaction in the transactions list - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', + describe('Redesigned confirmation screens', function () { + it('Creating a new wallet @no-mmi', async function () { + const driverOptions = { constrainWindowSize: true }; + + await withFixtures( + { + fixtures: new FixtureBuilder({ onboarding: true }).build(), + driverOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await driver.navigate(); + + // agree to terms of use + await driver.clickElement( + '[data-testid="onboarding-terms-checkbox"]', + ); + + // welcome + await driver.clickElement('[data-testid="onboarding-create-wallet"]'); + + // metrics + await driver.clickElement('[data-testid="metametrics-no-thanks"]'); + + // create password + await driver.fill( + '[data-testid="create-password-new"]', + 'correct horse battery staple', + ); + await driver.fill( + '[data-testid="create-password-confirm"]', + 'correct horse battery staple', + ); + await driver.clickElement('[data-testid="create-password-terms"]'); + await driver.clickElement('[data-testid="create-password-wallet"]'); + + // secure wallet + await driver.clickElement( + '[data-testid="secure-wallet-recommended"]', + ); + + // review + await driver.clickElement('[data-testid="recovery-phrase-reveal"]'); + const chipTwo = await ( + await driver.findElement('[data-testid="recovery-phrase-chip-2"]') + ).getText(); + const chipThree = await ( + await driver.findElement('[data-testid="recovery-phrase-chip-3"]') + ).getText(); + const chipSeven = await ( + await driver.findElement('[data-testid="recovery-phrase-chip-7"]') + ).getText(); + await driver.clickElement('[data-testid="recovery-phrase-next"]'); + + // confirm + await driver.fill('[data-testid="recovery-phrase-input-2"]', chipTwo); + await driver.fill( + '[data-testid="recovery-phrase-input-3"]', + chipThree, + ); + await driver.fill( + '[data-testid="recovery-phrase-input-7"]', + chipSeven, + ); + await driver.clickElement('[data-testid="recovery-phrase-confirm"]'); + + // complete + await driver.clickElement('[data-testid="onboarding-complete-done"]'); + + // pin extension + await driver.clickElement('[data-testid="pin-extension-next"]'); + await driver.clickElement('[data-testid="pin-extension-done"]'); + await driver.assertElementNotPresent('.loading-overlay__spinner'); + // assert balance + await driver.waitForSelector({ + css: '[data-testid="eth-overview__primary-currency"]', + text: '0', + }); + }, + ); + }); + + it('Importing existing wallet from lock page', async function () { + const driverOptions = { constrainWindowSize: true }; + + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + driverOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await driver.navigate(); + + // Import Secret Recovery Phrase + await driver.waitForSelector({ + tag: 'p', + text: 'Localhost 8545', + }); + await driver.clickElement({ + css: '.unlock-page__link', + text: 'Forgot password?', + }); + + await driver.pasteIntoField( + '[data-testid="import-srp__srp-word-0"]', + TEST_SEED_PHRASE_TWO, + ); + + await driver.fill('#password', 'correct horse battery staple'); + await driver.fill( + '#confirm-password', + 'correct horse battery staple', + ); + await driver.press('#confirm-password', driver.Key.ENTER); + + // balance renders + await locateAccountBalanceDOM(driver, ganacheServer); + }, + ); + }); + + it('Send Transaction from responsive window', async function () { + const driverOptions = { constrainWindowSize: true }; + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + driverOptions, + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Send ETH from inside MetaMask + // starts to send a transaction + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + const inputAmount = await driver.fill('input[placeholder="0"]', '1'); + + const inputValue = await inputAmount.getProperty('value'); + assert.equal(inputValue, '1'); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // wait for transaction value to be rendered and confirm + await driver.waitForSelector({ + css: 'h2', + text: '1 ETH', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // finds the transaction in the transactions list + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', ); - return confirmedTxes.length === 1; - }, 10000); - - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-1 ETH', - }); - }, - ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1 ETH', + }); + }, + ); + }); }); }); diff --git a/test/e2e/tests/settings/change-language.spec.ts b/test/e2e/tests/settings/change-language.spec.ts index 1bd9915a33da..234f83eb1271 100644 --- a/test/e2e/tests/settings/change-language.spec.ts +++ b/test/e2e/tests/settings/change-language.spec.ts @@ -1,21 +1,17 @@ import { strict as assert } from 'assert'; import { Suite } from 'mocha'; - import { Driver } from '../../webdriver/driver'; -import { - defaultGanacheOptions, - withFixtures, - unlockWallet, -} from '../../helpers'; +import { withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; +import AdvancedSettings from '../../page-objects/pages/settings/advanced-settings'; +import GeneralSettings from '../../page-objects/pages/settings/general-settings'; +import HeaderNavbar from '../../page-objects/pages/header-navbar'; +import Homepage from '../../page-objects/pages/home/homepage'; +import SendTokenPage from '../../page-objects/pages/send/send-token-page'; +import SettingsPage from '../../page-objects/pages/settings/settings-page'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; const selectors = { - accountOptionsMenuButton: '[data-testid="account-options-menu-button"]', - settingsOption: { text: 'Settings', tag: 'div' }, - localeSelect: '[data-testid="locale-select"]', - ethOverviewSend: '[data-testid="eth-overview-send"]', - ensInput: '[data-testid="ens-input"]', - nftsTab: '[data-testid="account-overview__nfts-tab"]', labelSpanish: { tag: 'p', text: 'Idioma actual' }, currentLanguageLabel: { tag: 'p', text: 'Current language' }, advanceText: { text: 'Avanceret', tag: 'div' }, @@ -29,50 +25,37 @@ const selectors = { headerText: { text: 'الإعدادات', tag: 'h3' }, }; -async function changeLanguage(driver: Driver, languageIndex: number) { - await driver.clickElement(selectors.accountOptionsMenuButton); - await driver.clickElement(selectors.settingsOption); - - const dropdownElement = await driver.findElement(selectors.localeSelect); - await dropdownElement.click(); - - const options = await dropdownElement.findElements({ css: 'option' }); - await options[languageIndex].click(); -} - describe('Settings - general tab @no-mmi', function (this: Suite) { it('validate the change language functionality', async function () { - let languageIndex = 10; - await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, - async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - await changeLanguage(driver, languageIndex); + await loginWithBalanceValidation(driver); + await new HeaderNavbar(driver).openSettingsPage(); + const generalSettings = new GeneralSettings(driver); + await generalSettings.check_pageIsLoaded(); - // Validate the label changes to Spanish + // Change language to Spanish and validate that the word has changed correctly + await generalSettings.changeLanguage('Español'); const isLanguageLabelChanged = await driver.isElementPresent( selectors.labelSpanish, ); assert.equal(isLanguageLabelChanged, true, 'Language did not change'); + // Refresh the page and validate that the language is still Spanish await driver.refresh(); - - // Change back to English and verify that the word is correctly changed back to English - languageIndex = 9; - - const dropdownElement = await driver.findElement( - selectors.localeSelect, + await generalSettings.check_pageIsLoaded(); + assert.equal( + await driver.isElementPresent(selectors.labelSpanish), + true, + 'Language did not change after refresh', ); - await dropdownElement.click(); - const options = await dropdownElement.findElements({ css: 'option' }); - await options[languageIndex].click(); + // Change language back to English and validate that the word has changed correctly + await generalSettings.changeLanguage('English'); const isLabelTextChanged = await driver.isElementPresent( selectors.currentLanguageLabel, ); @@ -82,21 +65,22 @@ describe('Settings - general tab @no-mmi', function (this: Suite) { }); it('validate "Dansk" language on page navigation', async function () { - const languageIndex = 6; await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, - async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - await changeLanguage(driver, languageIndex); - - await driver.assertElementNotPresent('.loading-overlay__spinner'); + await loginWithBalanceValidation(driver); + await new HeaderNavbar(driver).openSettingsPage(); + const generalSettings = new GeneralSettings(driver); + await generalSettings.check_pageIsLoaded(); + // Select "Dansk" language + await generalSettings.changeLanguage('Dansk'); await driver.clickElement(selectors.advanceText); + const advancedSettings = new AdvancedSettings(driver); + await advancedSettings.check_pageIsLoaded(); // Confirm that the language change is reflected in search box water text const isWaterTextChanged = await driver.isElementPresent( @@ -132,22 +116,30 @@ describe('Settings - general tab @no-mmi', function (this: Suite) { }); it('validate "Deutsch" language on error messages', async function () { - const languageIndex = 7; await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, - async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - await changeLanguage(driver, languageIndex); - await driver.navigate(); - await driver.clickElement(selectors.ethOverviewSend); - await driver.pasteIntoField( - selectors.ensInput, - // use wrong checksum address; other inputs don't show error until snaps name-lookup has happened + await loginWithBalanceValidation(driver); + await new HeaderNavbar(driver).openSettingsPage(); + const generalSettings = new GeneralSettings(driver); + await generalSettings.check_pageIsLoaded(); + + // Select "Deutsch" language + await generalSettings.changeLanguage('Deutsch'); + await new SettingsPage(driver).closeSettingsPage(); + + const homepage = new Homepage(driver); + await homepage.check_pageIsLoaded(); + await homepage.check_expectedBalanceIsDisplayed(); + await homepage.startSendFlow(); + + const sendToPage = new SendTokenPage(driver); + await sendToPage.check_pageIsLoaded(); + // use wrong address for recipient to allow error message to show + await sendToPage.fillRecipient( '0xAAAA6BF26964aF9D7eEd9e03E53415D37aA96045', ); @@ -165,18 +157,23 @@ describe('Settings - general tab @no-mmi', function (this: Suite) { }); it('validate "मानक हिन्दी" language on tooltips', async function () { - const languageIndex = 19; await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, - async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - await changeLanguage(driver, languageIndex); - await driver.navigate(); + await loginWithBalanceValidation(driver); + await new HeaderNavbar(driver).openSettingsPage(); + const generalSettings = new GeneralSettings(driver); + await generalSettings.check_pageIsLoaded(); + + // Select "मानक हिन्दी" language + await generalSettings.changeLanguage('मानक हिन्दी'); + await new SettingsPage(driver).closeSettingsPage(); + const homepage = new Homepage(driver); + await homepage.check_pageIsLoaded(); + await homepage.check_expectedBalanceIsDisplayed(); // Validate the account tooltip const isAccountTooltipChanged = await driver.isElementPresent( @@ -202,20 +199,24 @@ describe('Settings - general tab @no-mmi', function (this: Suite) { }); it('validate "Magyar" language change on hypertext', async function () { - const languageIndex = 23; await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, - async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - // selects "Magyar" language - await changeLanguage(driver, languageIndex); - await driver.navigate(); - await driver.clickElement(selectors.nftsTab); + await loginWithBalanceValidation(driver); + await new HeaderNavbar(driver).openSettingsPage(); + const generalSettings = new GeneralSettings(driver); + await generalSettings.check_pageIsLoaded(); + + // Select "Magyar" language + await generalSettings.changeLanguage('Magyar'); + await new SettingsPage(driver).closeSettingsPage(); + const homepage = new Homepage(driver); + await homepage.check_pageIsLoaded(); + await homepage.check_expectedBalanceIsDisplayed(); + await homepage.goToNftTab(); // Validate the hypertext const isHyperTextChanged = await driver.isElementPresent( @@ -231,18 +232,20 @@ describe('Settings - general tab @no-mmi', function (this: Suite) { }); it('validate "العربية" language change on page indent', async function () { - const languageIndex = 1; await withFixtures( { fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, title: this.test?.fullTitle(), }, async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - await changeLanguage(driver, languageIndex); + await loginWithBalanceValidation(driver); + await new HeaderNavbar(driver).openSettingsPage(); + const generalSettings = new GeneralSettings(driver); + await generalSettings.check_pageIsLoaded(); + + // Select "العربية" language and validate that the header text has changed + await generalSettings.changeLanguage('العربية'); - // Validate the header text const isHeaderTextChanged = await driver.isElementPresent( selectors.headerText, ); diff --git a/test/e2e/tests/settings/settings-security-reveal-srp.spec.ts b/test/e2e/tests/settings/settings-security-reveal-srp.spec.ts index 6ee57ae02490..eb9739e67bce 100644 --- a/test/e2e/tests/settings/settings-security-reveal-srp.spec.ts +++ b/test/e2e/tests/settings/settings-security-reveal-srp.spec.ts @@ -2,7 +2,7 @@ import { withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; import { E2E_SRP } from '../../default-fixture'; import HeaderNavbar from '../../page-objects/pages/header-navbar'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import PrivacySettings from '../../page-objects/pages/settings/privacy-settings'; import SettingsPage from '../../page-objects/pages/settings/settings-page'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; diff --git a/test/e2e/tests/signature/personal-sign.spec.js b/test/e2e/tests/signature/personal-sign.spec.js index e4864a84db47..092a9518ba01 100644 --- a/test/e2e/tests/signature/personal-sign.spec.js +++ b/test/e2e/tests/signature/personal-sign.spec.js @@ -1,4 +1,5 @@ const { strict: assert } = require('assert'); +const { By } = require('selenium-webdriver'); const { defaultGanacheOptions, withFixtures, @@ -11,99 +12,204 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('Personal sign', function () { - it('can initiate and confirm a personal sign', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - const addresses = await ganacheServer.getAccounts(); - const publicAddress = addresses[0]; - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - await openDapp(driver); - await driver.clickElement('#personalSign'); - - await driver.waitUntilXWindowHandles(3); - const windowHandles = await driver.getAllWindowHandles(); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - - const personalMessageRow = await driver.findElement( - '.request-signature__row-value', - ); - const personalMessage = await personalMessageRow.getText(); - assert.equal(personalMessage, 'Example `personal_sign` message'); - - await driver.clickElement('[data-testid="page-container-footer-next"]'); - - await verifyAndAssertPersonalMessage(driver, publicAddress); - }, - ); + describe('Old confirmation screens', function () { + it('can initiate and confirm a personal sign', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + await openDapp(driver); + await driver.clickElement('#personalSign'); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + const personalMessageRow = await driver.findElement( + '.request-signature__row-value', + ); + const personalMessage = await personalMessageRow.getText(); + assert.equal(personalMessage, 'Example `personal_sign` message'); + + await driver.clickElement( + '[data-testid="page-container-footer-next"]', + ); + + await verifyAndAssertPersonalMessage(driver, publicAddress); + }, + ); + }); + + it('can queue multiple personal signs and confirm', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + await openDapp(driver); + // Create personal sign + await driver.clickElement('#personalSign'); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + + // Switch to Dapp + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + + // Create second personal sign + await driver.clickElement('#personalSign'); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.waitForSelector({ + text: 'Reject 2 requests', + tag: 'button', + }); + + const personalMessageRow = await driver.findElement( + '.request-signature__row-value', + ); + const personalMessage = await personalMessageRow.getText(); + assert.equal(personalMessage, 'Example `personal_sign` message'); + + // Confirm first personal sign + await driver.clickElement( + '[data-testid="page-container-footer-next"]', + ); + await driver.delay(regularDelayMs); + // Confirm second personal sign + await driver.clickElement( + '[data-testid="page-container-footer-next"]', + ); + + await verifyAndAssertPersonalMessage(driver, publicAddress); + }, + ); + }); }); - it('can queue multiple personal signs and confirm', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - const addresses = await ganacheServer.getAccounts(); - const publicAddress = addresses[0]; - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - await openDapp(driver); - // Create personal sign - await driver.clickElement('#personalSign'); - - await driver.waitUntilXWindowHandles(3); - const windowHandles = await driver.getAllWindowHandles(); - - // Switch to Dapp - await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); - - // Create second personal sign - await driver.clickElement('#personalSign'); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - - await driver.waitForSelector({ - text: 'Reject 2 requests', - tag: 'button', - }); - - const personalMessageRow = await driver.findElement( - '.request-signature__row-value', - ); - const personalMessage = await personalMessageRow.getText(); - assert.equal(personalMessage, 'Example `personal_sign` message'); - - // Confirm first personal sign - await driver.clickElement('[data-testid="page-container-footer-next"]'); - await driver.delay(regularDelayMs); - // Confirm second personal sign - await driver.clickElement('[data-testid="page-container-footer-next"]'); - - await verifyAndAssertPersonalMessage(driver, publicAddress); - }, - ); + describe('Redesigned confirmation screens', function () { + it('can initiate and confirm a personal sign', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + + await openDapp(driver); + await driver.clickElement('#personalSign'); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.findElement({ + css: 'p', + text: 'Example `personal_sign` message', + }); + + await driver.clickElement('[data-testid="confirm-footer-button"]'); + + await verifyAndAssertPersonalMessage(driver, publicAddress); + }, + ); + }); + + it('can queue multiple personal signs and confirm', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + + await openDapp(driver); + // Create personal sign + await driver.clickElement('#personalSign'); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + + // Switch to Dapp + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + + // Create second personal sign + await driver.clickElement('#personalSign'); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.waitForSelector( + By.xpath("//p[normalize-space(.)='1 of 2']"), + ); + + await driver.waitForSelector({ + text: 'Reject all', + tag: 'button', + }); + + await driver.findElement({ + css: 'p', + text: 'Example `personal_sign` message', + }); + + // Confirm first personal sign + await driver.clickElement('[data-testid="confirm-footer-button"]'); + await driver.delay(regularDelayMs); + // Confirm second personal sign + await driver.clickElement('[data-testid="confirm-footer-button"]'); + + await verifyAndAssertPersonalMessage(driver, publicAddress); + }, + ); + }); }); }); diff --git a/test/e2e/tests/signature/signature-request.spec.js b/test/e2e/tests/signature/signature-request.spec.js index 99fcb61c5067..716ee1f98d95 100644 --- a/test/e2e/tests/signature/signature-request.spec.js +++ b/test/e2e/tests/signature/signature-request.spec.js @@ -1,4 +1,5 @@ const { strict: assert } = require('assert'); +const { By } = require('selenium-webdriver'); const { withFixtures, regularDelayMs, @@ -63,267 +64,543 @@ const testData = [ ]; describe('Sign Typed Data Signature Request', function () { - testData.forEach((data) => { - it(`can initiate and confirm a Signature Request of ${data.type}`, async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - const addresses = await ganacheServer.getAccounts(); - const publicAddress = addresses[0]; - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - await openDapp(driver); - - // creates a sign typed data signature request - await driver.clickElement(data.buttonId); - - await driver.waitUntilXWindowHandles(3); - let windowHandles = await driver.getAllWindowHandles(); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - - await verifyAndAssertSignTypedData( - driver, - data.type, - data.verifyAndAssertMessage.titleClass, - data.verifyAndAssertMessage.originClass, - data.verifyAndAssertMessage.messageClass, - data.expectedMessage, - ); - - // Approve signing typed data - await finalizeSignatureRequest( - driver, - data.type, - '[data-testid="signature-request-scroll-button"]', - 'Sign', - ); - await driver.waitUntilXWindowHandles(2); - windowHandles = await driver.getAllWindowHandles(); - - // switch to the Dapp and verify the signed address - await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); - await driver.clickElement(data.verifyId); - const recoveredAddress = await driver.findElement( - data.verifyResultId, - ); - - assert.equal(await recoveredAddress.getText(), publicAddress); - }, - ); + describe('Old confirmation screens', function () { + testData.forEach((data) => { + it(`can initiate and confirm a Signature Request of ${data.type}`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await verifyAndAssertSignTypedData( + driver, + data.type, + data.verifyAndAssertMessage.titleClass, + data.verifyAndAssertMessage.originClass, + data.verifyAndAssertMessage.messageClass, + data.expectedMessage, + ); + + // Approve signing typed data + await finalizeSignatureRequest( + driver, + '[data-testid="signature-request-scroll-button"]', + 'Sign', + ); + await driver.waitUntilXWindowHandles(2); + windowHandles = await driver.getAllWindowHandles(); + + // switch to the Dapp and verify the signed address + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + await driver.clickElement(data.verifyId); + const recoveredAddress = await driver.findElement( + data.verifyResultId, + ); + + assert.equal(await recoveredAddress.getText(), publicAddress); + }, + ); + }); }); - }); - testData.forEach((data) => { - it(`can queue multiple Signature Requests of ${data.type} and confirm`, async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - const addresses = await ganacheServer.getAccounts(); - const publicAddress = addresses[0]; - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - await openDapp(driver); - - // creates multiple sign typed data signature requests - await driver.clickElement(data.buttonId); - - await driver.waitUntilXWindowHandles(3); - const windowHandles = await driver.getAllWindowHandles(); - // switches to Dapp - await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); - // creates second sign typed data signature request - await driver.clickElement(data.buttonId); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - - await driver.waitForSelector({ - text: 'Reject 2 requests', - tag: 'button', - }); - - await verifyAndAssertSignTypedData( - driver, - data.type, - data.verifyAndAssertMessage.titleClass, - data.verifyAndAssertMessage.originClass, - data.verifyAndAssertMessage.messageClass, - data.expectedMessage, - ); - - // approve first signature request - await finalizeSignatureRequest( - driver, - data.type, - '[data-testid="signature-request-scroll-button"]', - 'Sign', - ); - await driver.waitUntilXWindowHandles(3); - - // approve second signature request - await finalizeSignatureRequest( - driver, - data.type, - '[data-testid="signature-request-scroll-button"]', - 'Sign', - ); - await driver.waitUntilXWindowHandles(2); - - // switch to the Dapp and verify the signed address for each request - await driver.switchToWindowWithTitle('E2E Test Dapp'); - await driver.clickElement(data.verifyId); - const recoveredAddress = await driver.findElement( - data.verifyResultId, - ); - assert.equal(await recoveredAddress.getText(), publicAddress); - }, - ); + testData.forEach((data) => { + it(`can queue multiple Signature Requests of ${data.type} and confirm`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + await openDapp(driver); + + // creates multiple sign typed data signature requests + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + // switches to Dapp + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + // creates second sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.waitForSelector({ + text: 'Reject 2 requests', + tag: 'button', + }); + + await verifyAndAssertSignTypedData( + driver, + data.type, + data.verifyAndAssertMessage.titleClass, + data.verifyAndAssertMessage.originClass, + data.verifyAndAssertMessage.messageClass, + data.expectedMessage, + ); + + // approve first signature request + await finalizeSignatureRequest( + driver, + '[data-testid="signature-request-scroll-button"]', + 'Sign', + ); + await driver.waitUntilXWindowHandles(3); + + // approve second signature request + await finalizeSignatureRequest( + driver, + '[data-testid="signature-request-scroll-button"]', + 'Sign', + ); + await driver.waitUntilXWindowHandles(2); + + // switch to the Dapp and verify the signed address for each request + await driver.switchToWindowWithTitle('E2E Test Dapp'); + await driver.clickElement(data.verifyId); + const recoveredAddress = await driver.findElement( + data.verifyResultId, + ); + assert.equal(await recoveredAddress.getText(), publicAddress); + }, + ); + }); + }); + + testData.forEach((data) => { + it(`can initiate and reject a Signature Request of ${data.type}`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + // Reject signing typed data + await finalizeSignatureRequest( + driver, + '[data-testid="signature-request-scroll-button"]', + 'Reject', + ); + await driver.waitUntilXWindowHandles(2); + windowHandles = await driver.getAllWindowHandles(); + + // switch to the Dapp and verify the rejection was successful + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + + await driver.waitForSelector(data.verifyRejectionResultId); + const rejectionResult = await driver.findElement( + data.verifyRejectionResultId, + ); + + assert.equal( + await rejectionResult.getText(), + data.rejectSignatureMessage, + ); + }, + ); + }); }); - }); - testData.forEach((data) => { - it(`can initiate and reject a Signature Request of ${data.type}`, async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - await openDapp(driver); - - // creates a sign typed data signature request - await driver.clickElement(data.buttonId); - - await driver.waitUntilXWindowHandles(3); - let windowHandles = await driver.getAllWindowHandles(); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - - // Reject signing typed data - await finalizeSignatureRequest( - driver, - data.type, - '[data-testid="signature-request-scroll-button"]', - 'Reject', - ); - await driver.waitUntilXWindowHandles(2); - windowHandles = await driver.getAllWindowHandles(); - - // switch to the Dapp and verify the rejection was successful - await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); - - await driver.waitForSelector(data.verifyRejectionResultId); - const rejectionResult = await driver.findElement( - data.verifyRejectionResultId, - ); - - assert.equal( - await rejectionResult.getText(), - data.rejectSignatureMessage, - ); - }, - ); + testData.forEach((data) => { + it(`can queue multiple Signature Requests of ${data.type} and reject`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedConfirmations(driver); + + await openDapp(driver); + + // creates multiple sign typed data signature requests + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + // switches to Dapp + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + // creates second sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.waitForSelector({ + text: 'Reject 2 requests', + tag: 'button', + }); + + // reject first signature request + await finalizeSignatureRequest( + driver, + '[data-testid="signature-request-scroll-button"]', + 'Reject', + ); + await driver.waitUntilXWindowHandles(3); + + // reject second signature request + await finalizeSignatureRequest( + driver, + '[data-testid="signature-request-scroll-button"]', + 'Reject', + ); + await driver.waitUntilXWindowHandles(2); + + // switch to the Dapp and verify the rejection was successful + await driver.switchToWindowWithTitle('E2E Test Dapp'); + + await driver.waitForSelector(data.verifyRejectionResultId); + const rejectionResult = await driver.findElement( + data.verifyRejectionResultId, + ); + assert.equal( + await rejectionResult.getText(), + data.rejectSignatureMessage, + ); + }, + ); + }); }); }); - testData.forEach((data) => { - it(`can queue multiple Signature Requests of ${data.type} and reject`, async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedConfirmations(driver); - - await openDapp(driver); - - // creates multiple sign typed data signature requests - await driver.clickElement(data.buttonId); - - await driver.waitUntilXWindowHandles(3); - const windowHandles = await driver.getAllWindowHandles(); - // switches to Dapp - await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); - // creates second sign typed data signature request - await driver.clickElement(data.buttonId); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); - - await driver.waitForSelector({ - text: 'Reject 2 requests', - tag: 'button', - }); - - // reject first signature request - await finalizeSignatureRequest( - driver, - data.type, - '[data-testid="signature-request-scroll-button"]', - 'Reject', - ); - await driver.waitUntilXWindowHandles(3); - - // reject second signature request - await finalizeSignatureRequest( - driver, - data.type, - '[data-testid="signature-request-scroll-button"]', - 'Reject', - ); - await driver.waitUntilXWindowHandles(2); - - // switch to the Dapp and verify the rejection was successful - await driver.switchToWindowWithTitle('E2E Test Dapp'); - - await driver.waitForSelector(data.verifyRejectionResultId); - const rejectionResult = await driver.findElement( - data.verifyRejectionResultId, - ); - assert.equal( - await rejectionResult.getText(), - data.rejectSignatureMessage, - ); - }, - ); + describe('Redesigned confirmation screens', function () { + testData.forEach((data) => { + it(`can initiate and confirm a Signature Request of ${data.type}`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await verifyAndAssertRedesignedSignTypedData( + driver, + data.expectedMessage, + ); + + // Approve signing typed data + await finalizeSignatureRequest( + driver, + '.confirm-scroll-to-bottom__button', + 'Confirm', + ); + await driver.waitUntilXWindowHandles(2); + windowHandles = await driver.getAllWindowHandles(); + + // switch to the Dapp and verify the signed address + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + await driver.clickElement(data.verifyId); + const recoveredAddress = await driver.findElement( + data.verifyResultId, + ); + + assert.equal(await recoveredAddress.getText(), publicAddress); + }, + ); + }); + }); + + testData.forEach((data) => { + it(`can queue multiple Signature Requests of ${data.type} and confirm`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + const addresses = await ganacheServer.getAccounts(); + const publicAddress = addresses[0]; + await unlockWallet(driver); + + await openDapp(driver); + + // creates multiple sign typed data signature requests + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + // switches to Dapp + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + // creates second sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.waitForSelector( + By.xpath("//div[normalize-space(.)='1 of 2']"), + ); + + await driver.waitForSelector({ + text: 'Reject all', + tag: 'button', + }); + + await verifyAndAssertRedesignedSignTypedData( + driver, + data.expectedMessage, + ); + + // Approve signing typed data + await finalizeSignatureRequest( + driver, + '.confirm-scroll-to-bottom__button', + 'Confirm', + ); + await driver.waitUntilXWindowHandles(3); + + // Approve signing typed data + await finalizeSignatureRequest( + driver, + '.confirm-scroll-to-bottom__button', + 'Confirm', + ); + await driver.waitUntilXWindowHandles(2); + + // switch to the Dapp and verify the signed address for each request + await driver.switchToWindowWithTitle('E2E Test Dapp'); + await driver.clickElement(data.verifyId); + const recoveredAddress = await driver.findElement( + data.verifyResultId, + ); + assert.equal(await recoveredAddress.getText(), publicAddress); + }, + ); + }); + }); + + testData.forEach((data) => { + it(`can initiate and reject a Signature Request of ${data.type}`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + // Reject signing typed data + await finalizeSignatureRequest( + driver, + '.confirm-scroll-to-bottom__button', + 'Cancel', + ); + await driver.waitUntilXWindowHandles(2); + windowHandles = await driver.getAllWindowHandles(); + + // switch to the Dapp and verify the rejection was successful + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + + await driver.waitForSelector(data.verifyRejectionResultId); + const rejectionResult = await driver.findElement( + data.verifyRejectionResultId, + ); + + assert.equal( + await rejectionResult.getText(), + data.rejectSignatureMessage, + ); + }, + ); + }); + }); + + testData.forEach((data) => { + it(`can queue multiple Signature Requests of ${data.type} and reject`, async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await openDapp(driver); + + // creates multiple sign typed data signature requests + await driver.clickElement(data.buttonId); + + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + // switches to Dapp + await driver.switchToWindowWithTitle( + 'E2E Test Dapp', + windowHandles, + ); + // creates second sign typed data signature request + await driver.clickElement(data.buttonId); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.waitForSelector( + By.xpath("//div[normalize-space(.)='1 of 2']"), + ); + + await driver.waitForSelector({ + text: 'Reject all', + tag: 'button', + }); + + // reject first signature request + await finalizeSignatureRequest( + driver, + '.confirm-scroll-to-bottom__button', + 'Cancel', + ); + await driver.waitUntilXWindowHandles(3); + + // reject second signature request + await finalizeSignatureRequest( + driver, + '.confirm-scroll-to-bottom__button', + 'Cancel', + ); + await driver.waitUntilXWindowHandles(2); + + // switch to the Dapp and verify the rejection was successful + await driver.switchToWindowWithTitle('E2E Test Dapp'); + + await driver.waitForSelector(data.verifyRejectionResultId); + const rejectionResult = await driver.findElement( + data.verifyRejectionResultId, + ); + assert.equal( + await rejectionResult.getText(), + data.rejectSignatureMessage, + ); + }, + ); + }); }); }); }); @@ -359,11 +636,27 @@ async function verifyAndAssertSignTypedData( assert.equal(await messages[messageNumber].getText(), expectedMessage); } -async function finalizeSignatureRequest(driver, type, buttonElementId, action) { - if (type !== signatureRequestType.signTypedData) { - await driver.delay(regularDelayMs); - await driver.clickElement(buttonElementId); - } +async function verifyAndAssertRedesignedSignTypedData(driver, expectedMessage) { + await driver.findElement({ + css: 'h2', + text: 'Signature request', + }); + + await driver.findElement({ + css: 'p', + text: '127.0.0.1:8080', + }); + + await driver.findElement({ + css: 'p', + text: expectedMessage, + }); +} + +async function finalizeSignatureRequest(driver, buttonElementId, action) { + await driver.delay(regularDelayMs); + await driver.clickElementSafe(buttonElementId); + await driver.delay(regularDelayMs); await driver.clickElement({ text: action, tag: 'button' }); } diff --git a/test/e2e/tests/smart-transactions/mock-requests-for-swap-test.ts b/test/e2e/tests/smart-transactions/mock-requests-for-swap-test.ts index bf9740c257ad..5792e4ed4d30 100644 --- a/test/e2e/tests/smart-transactions/mock-requests-for-swap-test.ts +++ b/test/e2e/tests/smart-transactions/mock-requests-for-swap-test.ts @@ -11,7 +11,6 @@ const GET_FEES_REQUEST_INCLUDES = { from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', to: '0x881D40237659C251811CEC9c364ef91dC08D300C', value: '0x1bc16d674ec80000', - gas: '0xf4240', nonce: '0x0', }, ], diff --git a/test/e2e/tests/tokens/add-hide-token.spec.ts b/test/e2e/tests/tokens/add-hide-token.spec.ts index 8f85f2d9914e..f6d21430cd18 100644 --- a/test/e2e/tests/tokens/add-hide-token.spec.ts +++ b/test/e2e/tests/tokens/add-hide-token.spec.ts @@ -1,7 +1,7 @@ import { toHex } from '@metamask/controller-utils'; import { withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; -import HomePage from '../../page-objects/pages/homepage'; +import AssetListPage from '../../page-objects/pages/home/asset-list'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; describe('Add hide token', function () { @@ -38,12 +38,12 @@ describe('Add hide token', function () { }, async ({ driver }) => { await loginWithBalanceValidation(driver); - const homepage = new HomePage(driver); - await homepage.check_tokenItemNumber(2); - await homepage.check_tokenAmountIsDisplayed('0 TST'); + const assetListPage = new AssetListPage(driver); + await assetListPage.check_tokenItemNumber(2); + await assetListPage.check_tokenAmountIsDisplayed('0 TST'); - await homepage.hideToken('TST'); - await homepage.check_tokenItemNumber(1); + await assetListPage.hideToken('TST'); + await assetListPage.check_tokenItemNumber(1); }, ); }); diff --git a/test/e2e/tests/tokens/add-multiple-tokens.spec.js b/test/e2e/tests/tokens/add-multiple-tokens.spec.js deleted file mode 100644 index 8be2a430b622..000000000000 --- a/test/e2e/tests/tokens/add-multiple-tokens.spec.js +++ /dev/null @@ -1,114 +0,0 @@ -const { strict: assert } = require('assert'); -const { - withFixtures, - defaultGanacheOptions, - openDapp, - switchToNotificationWindow, - WINDOW_TITLES, - DAPP_URL, - unlockWallet, -} = require('../../helpers'); -const FixtureBuilder = require('../../fixture-builder'); - -describe('Multiple ERC20 Watch Asset', function () { - // TODO: This assertion will change once the method is fixed. - it('should show multiple erc20 watchAsset token list, only confirms one bug', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await openDapp(driver, undefined, DAPP_URL); - - // Create Token 1 - const createToken = await driver.findElement({ - text: 'Create Token', - tag: 'button', - }); - await driver.scrollToElement(createToken); - await driver.clickElement({ text: 'Create Token', tag: 'button' }); - await switchToNotificationWindow(driver); - await driver.findClickableElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // Wait for token 1 address to populate in dapp - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.wait(async () => { - const tokenAddressesElement = await driver.findElement( - '#erc20TokenAddresses', - ); - const tokenAddresses = await tokenAddressesElement.getText(); - return tokenAddresses !== ''; - }, 10000); - - // Create Token 2 - await driver.clickElement({ text: 'Create Token', tag: 'button' }); - await switchToNotificationWindow(driver); - await driver.findClickableElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // Wait for token 2 address to populate in dapp - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.wait(async () => { - const tokenAddressesElement = await driver.findElement( - '#erc20TokenAddresses', - ); - const tokenAddresses = await tokenAddressesElement.getText(); - return tokenAddresses.split(',').length === 2; - }, 10000); - - // Create Token 3 - await driver.clickElement({ text: 'Create Token', tag: 'button' }); - await switchToNotificationWindow(driver); - await driver.findClickableElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // Wait for token 3 address to populate in dapp - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.wait(async () => { - const tokenAddressesElement = await driver.findElement( - '#erc20TokenAddresses', - ); - const tokenAddresses = await tokenAddressesElement.getText(); - return tokenAddresses.split(',').length === 3; - }, 10000); - - // Watch all 3 tokens - await driver.clickElement({ - text: 'Add Token(s) to Wallet', - tag: 'button', - }); - - // Switch to watchAsset notification - await switchToNotificationWindow(driver); - const multipleSuggestedtokens = await driver.findElements( - '.confirm-add-suggested-token__token-list-item', - ); - - // Confirm all 3 tokens are present as suggested token list - assert.equal(multipleSuggestedtokens.length, 3); - await driver.findClickableElement({ text: 'Add token', tag: 'button' }); - await driver.clickElement({ text: 'Add token', tag: 'button' }); - - // Switch to fullscreen extension - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - - // Check all three tokens have been added to the token list. - const addedTokens = await driver.findElements({ - tag: 'span', - text: 'TST', - }); - assert.equal(addedTokens.length, 3); - }, - ); - }); -}); diff --git a/test/e2e/tests/tokens/add-multiple-tokens.spec.ts b/test/e2e/tests/tokens/add-multiple-tokens.spec.ts new file mode 100644 index 000000000000..78daa2531da1 --- /dev/null +++ b/test/e2e/tests/tokens/add-multiple-tokens.spec.ts @@ -0,0 +1,70 @@ +import AddTokensModal from '../../page-objects/pages/dialog/add-tokens'; +import AssetListPage from '../../page-objects/pages/home/asset-list'; +import TestDapp from '../../page-objects/pages/test-dapp'; +import { + withFixtures, + defaultGanacheOptions, + openDapp, + WINDOW_TITLES, + DAPP_URL, + unlockWallet, +} from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import CreateContractModal from '../../page-objects/pages/dialog/create-contract'; + +describe('Multiple ERC20 Watch Asset', function () { + it('should show multiple erc20 watchAsset token list, only confirms one bug', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await openDapp(driver, undefined, DAPP_URL); + const testDapp = new TestDapp(driver); + + // Create multiple tokens + for (let i = 0; i < 3; i++) { + // Create token + await testDapp.findAndClickCreateToken(); + + // Confirm token creation + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + const createContractModal = new CreateContractModal(driver); + await createContractModal.check_pageIsLoaded(); + await createContractModal.clickConfirm(); + + // Wait for token address to populate in dapp + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await testDapp.check_pageIsLoaded(); + await testDapp.check_TokenAddressesCount(i + 1); + } + + // Watch all 3 tokens + // Switch to watchAsset notification + await testDapp.clickAddTokenToWallet(); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + const addTokensPopupModal = new AddTokensModal(driver); + await addTokensPopupModal.check_pageIsLoaded(); + await addTokensPopupModal.check_SuggestedTokensCount(3); + await addTokensPopupModal.confirmAddTokens(); + + // Switch to fullscreen extension + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + + // Check all three tokens have been added to the token list. + const tokenList = new AssetListPage(driver); + await tokenList.check_tokenItemNumber(4); // 3 tokens plus ETH + await tokenList.check_tokenIsDisplayed('Ethereum'); + await tokenList.check_tokenIsDisplayed('TST'); + }, + ); + }); +}); diff --git a/test/e2e/tests/tokens/add-token-using-search.ts b/test/e2e/tests/tokens/add-token-using-search.ts index 79b4715afb91..c1ae188a39b9 100644 --- a/test/e2e/tests/tokens/add-token-using-search.ts +++ b/test/e2e/tests/tokens/add-token-using-search.ts @@ -2,7 +2,7 @@ import { MockedEndpoint, Mockttp } from 'mockttp'; import { defaultGanacheOptions, withFixtures } from '../../helpers'; import FixtureBuilder from '../../fixture-builder'; import { CHAIN_IDS } from '../../../../shared/constants/network'; -import HomePage from '../../page-objects/pages/homepage'; +import AssetListPage from '../../page-objects/pages/home/asset-list'; import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; describe('Add existing token using search', function () { @@ -56,10 +56,10 @@ describe('Add existing token using search', function () { }, async ({ driver }) => { await loginWithoutBalanceValidation(driver); - const homepage = new HomePage(driver); - await homepage.check_tokenAmountIsDisplayed('25 BNB'); - await homepage.importTokenBySearch('BAT'); - await homepage.check_tokenAmountInTokenDetailsModal( + const assetListPage = new AssetListPage(driver); + await assetListPage.check_tokenAmountIsDisplayed('25 BNB'); + await assetListPage.importTokenBySearch('BAT'); + await assetListPage.check_tokenAmountInTokenDetailsModal( 'Basic Attention Token', '0 BAT', ); diff --git a/test/e2e/tests/tokens/custom-token-send-transfer.spec.js b/test/e2e/tests/tokens/custom-token-send-transfer.spec.js index 0c5498a82cca..16ba368e16ce 100644 --- a/test/e2e/tests/tokens/custom-token-send-transfer.spec.js +++ b/test/e2e/tests/tokens/custom-token-send-transfer.spec.js @@ -1,4 +1,7 @@ const { strict: assert } = require('assert'); +const { + mockedSourcifyTokenSend, +} = require('../confirmations/transactions/erc20-token-send-redesign.spec'); const { withFixtures, defaultGanacheOptions, @@ -18,215 +21,393 @@ const recipientAddress = '0x2f318C334780961FB129D2a6c30D0763d9a5C970'; describe('Transfer custom tokens @no-mmi', function () { const smartContract = SMART_CONTRACTS.HST; - it('send custom tokens from extension customizing gas values', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().withTokensControllerERC20().build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // go to custom tokens view on extension, perform send tokens - await driver.clickElement({ - css: '[data-testid="multichain-token-list-item-value"]', - text: '10 TST', - }); - await driver.delay(500); - await driver.clickElement('[data-testid="eth-overview-send"]'); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - recipientAddress, - ); - await driver.waitForSelector({ - css: '.ens-input__selected-input__title', - text: '0x2f318...5C970', - }); - await driver.fill('input[placeholder="0"]', '1'); - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // check transaction details - await driver.waitForSelector({ - text: '1 TST', - tag: 'h1', - }); - await driver.waitForSelector({ - text: 'Transfer', - css: '.confirm-page-container-summary__action__name', - }); - const estimatedGasFee = await driver.findElements( - '.currency-display-component__text', - ); - assert.notEqual( - await estimatedGasFee[1].getText(), - '0', - 'Estimated gas fee should not be 0', - ); - - // check function name and hex data details in hex tab - await clickNestedButton(driver, 'Hex'); - await driver.waitForSelector({ - text: 'Transfer', - tag: 'span', - }); - await driver.waitForSelector({ - tag: 'p', - text: '0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97', - }); - - // edit gas fee - await clickNestedButton(driver, 'Details'); - await driver.clickElement({ text: 'Edit', tag: 'button' }); - await editGasFeeForm(driver, '60000', '10'); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // check that transaction has completed correctly and is displayed in the activity list - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Send TST', - }); - await driver.waitForSelector( - { - css: '.transaction-list__completed-transactions [data-testid="transaction-list-item-primary-currency"]', - text: '-1 TST', - }, - { timeout: 10000 }, - ); - }, - ); - }); - it('transfer custom tokens from dapp customizing gas values', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withTokensControllerERC20() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, contractRegistry }) => { - const contractAddress = await contractRegistry.getContractAddress( + describe('Old confirmation screens', function () { + it('send custom tokens from extension customizing gas values', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().withTokensControllerERC20().build(), + ganacheOptions: defaultGanacheOptions, smartContract, - ); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // transfer token from dapp - await openDapp(driver, contractAddress); - await driver.delay(veryLargeDelayMs); - - await driver.clickElement({ text: 'Transfer Tokens', tag: 'button' }); - - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.waitForSelector({ text: '1.5 TST', tag: 'h1' }); - - // edit gas fee - await driver.clickElement({ text: 'Edit', tag: 'button' }); - await editGasFeeForm(driver, '60000', '10'); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // in extension, check that transaction has completed correctly and is displayed in the activity list - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await clickNestedButton(driver, 'Activity'); - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-1.5 TST', - }); - - // this selector helps prevent flakiness. it allows driver to wait until send transfer is "confirmed" - await driver.waitForSelector({ - text: 'Confirmed', - tag: 'div', - }); - - // check token amount is correct after transaction - await clickNestedButton(driver, 'Tokens'); - const tokenAmount = await driver.findElement( - { + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // go to custom tokens view on extension, perform send tokens + await driver.clickElement({ + css: '[data-testid="multichain-token-list-item-value"]', + text: '10 TST', + }); + await driver.delay(500); + await driver.clickElement('[data-testid="eth-overview-send"]'); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + recipientAddress, + ); + await driver.waitForSelector({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + await driver.fill('input[placeholder="0"]', '1'); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // check transaction details + await driver.waitForSelector({ + text: '1 TST', + tag: 'h1', + }); + await driver.waitForSelector({ + text: 'Transfer', + css: '.confirm-page-container-summary__action__name', + }); + const estimatedGasFee = await driver.findElements( + '.currency-display-component__text', + ); + assert.notEqual( + await estimatedGasFee[1].getText(), + '0', + 'Estimated gas fee should not be 0', + ); + + // check function name and hex data details in hex tab + await clickNestedButton(driver, 'Hex'); + await driver.waitForSelector({ + text: 'Transfer', + tag: 'span', + }); + await driver.waitForSelector({ + tag: 'p', + text: '0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97', + }); + + // edit gas fee + await clickNestedButton(driver, 'Details'); + await driver.clickElement({ text: 'Edit', tag: 'button' }); + await editGasFeeForm(driver, '60000', '10'); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // check that transaction has completed correctly and is displayed in the activity list + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Send TST', + }); + await driver.waitForSelector( + { + css: '.transaction-list__completed-transactions [data-testid="transaction-list-item-primary-currency"]', + text: '-1 TST', + }, + { timeout: 10000 }, + ); + }, + ); + }); + + it('transfer custom tokens from dapp customizing gas values', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, contractRegistry }) => { + const contractAddress = await contractRegistry.getContractAddress( + smartContract, + ); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // transfer token from dapp + await openDapp(driver, contractAddress); + await driver.delay(veryLargeDelayMs); + + await driver.clickElement({ text: 'Transfer Tokens', tag: 'button' }); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ text: '1.5 TST', tag: 'h1' }); + + // edit gas fee + await driver.clickElement({ text: 'Edit', tag: 'button' }); + await editGasFeeForm(driver, '60000', '10'); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // in extension, check that transaction has completed correctly and is displayed in the activity list + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'Activity'); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1.5 TST', + }); + + // this selector helps prevent flakiness. it allows driver to wait until send transfer is "confirmed" + await driver.waitForSelector({ + text: 'Confirmed', + tag: 'div', + }); + + // check token amount is correct after transaction + await clickNestedButton(driver, 'Tokens'); + await driver.waitForSelector({ css: '[data-testid="multichain-token-list-item-value"]', text: '8.5 TST', - }, - { timeout: 10000 }, - ); - assert.ok(tokenAmount, 'Token amount is not correct'); - }, - ); + }); + }, + ); + }); + + it('transfer custom tokens from dapp without specifying gas', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, contractRegistry }) => { + const contractAddress = await contractRegistry.getContractAddress( + smartContract, + ); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // transfer token from dapp + await openDapp(driver, contractAddress); + await driver.delay(veryLargeDelayMs); + await driver.clickElement({ + text: 'Transfer Tokens Without Gas', + tag: 'button', + }); + await switchToNotificationWindow(driver); + await driver.waitForSelector({ text: '1.5 TST', tag: 'h1' }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // in extension, check that transaction has completed correctly and is displayed in the activity list + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'Activity'); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1.5 TST', + }); + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Send TST', + }); + + // this selector helps prevent flakiness. it allows driver to wait until send transfer is "confirmed" + await driver.waitForSelector({ + text: 'Confirmed', + tag: 'div', + }); + + // check token amount is correct after transaction + await clickNestedButton(driver, 'Tokens'); + await driver.waitForSelector({ + css: '[data-testid="multichain-token-list-item-value"]', + text: '8.5 TST', + }); + }, + ); + }); }); - it('transfer custom tokens from dapp without specifying gas', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withTokensControllerERC20() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, contractRegistry }) => { - const contractAddress = await contractRegistry.getContractAddress( + describe('Redesigned confirmation screens', function () { + it('send custom tokens from extension customizing gas values', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().withTokensControllerERC20().build(), + ganacheOptions: defaultGanacheOptions, smartContract, - ); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // transfer token from dapp - await openDapp(driver, contractAddress); - await driver.delay(veryLargeDelayMs); - await driver.clickElement({ - text: 'Transfer Tokens Without Gas', - tag: 'button', - }); - await switchToNotificationWindow(driver); - await driver.waitForSelector({ text: '1.5 TST', tag: 'h1' }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // in extension, check that transaction has completed correctly and is displayed in the activity list - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await clickNestedButton(driver, 'Activity'); - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-1.5 TST', - }); - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Send TST', - }); - - // this selector helps prevent flakiness. it allows driver to wait until send transfer is "confirmed" - await driver.waitForSelector({ - text: 'Confirmed', - tag: 'div', - }); - - // check token amount is correct after transaction - await clickNestedButton(driver, 'Tokens'); - const tokenAmount = await driver.findElement( - { + title: this.test.fullTitle(), + testSpecificMock: mocks, + }, + async ({ driver }) => { + await unlockWallet(driver); + + // go to custom tokens view on extension, perform send tokens + await driver.clickElement({ + css: '[data-testid="multichain-token-list-item-value"]', + text: '10 TST', + }); + await driver.delay(500); + await driver.clickElement('[data-testid="eth-overview-send"]'); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + recipientAddress, + ); + await driver.waitForSelector({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + await driver.fill('input[placeholder="0"]', '1'); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // check transaction details + await driver.waitForSelector({ + text: '1 TST', + tag: 'h2', + }); + + // edit gas fee + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await editGasFeeForm(driver, '60000', '10'); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // check that transaction has completed correctly and is displayed in the activity list + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Send TST', + }); + await driver.waitForSelector( + { + css: '.transaction-list__completed-transactions [data-testid="transaction-list-item-primary-currency"]', + text: '-1 TST', + }, + { timeout: 10000 }, + ); + }, + ); + }); + + it('transfer custom tokens from dapp customizing gas values', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + testSpecificMock: mocks, + }, + async ({ driver, contractRegistry }) => { + const contractAddress = await contractRegistry.getContractAddress( + smartContract, + ); + await unlockWallet(driver); + + // transfer token from dapp + await openDapp(driver, contractAddress); + await driver.delay(veryLargeDelayMs); + + await driver.clickElement({ text: 'Transfer Tokens', tag: 'button' }); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ text: '1.5 TST', tag: 'h2' }); + + // edit gas fee + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await editGasFeeForm(driver, '60000', '10'); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // in extension, check that transaction has completed correctly and is displayed in the activity list + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'Activity'); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1.5 TST', + }); + + // this selector helps prevent flakiness. it allows driver to wait until send transfer is "confirmed" + await driver.waitForSelector({ + text: 'Confirmed', + tag: 'div', + }); + + // check token amount is correct after transaction + await clickNestedButton(driver, 'Tokens'); + await driver.waitForSelector({ + css: '[data-testid="multichain-token-list-item-value"]', + text: '8.5 TST', + }); + }, + ); + }); + + it('transfer custom tokens from dapp without specifying gas', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + testSpecificMock: mocks, + }, + async ({ driver, contractRegistry }) => { + const contractAddress = await contractRegistry.getContractAddress( + smartContract, + ); + await unlockWallet(driver); + + // transfer token from dapp + await openDapp(driver, contractAddress); + await driver.delay(veryLargeDelayMs); + await driver.clickElement({ + text: 'Transfer Tokens Without Gas', + tag: 'button', + }); + await switchToNotificationWindow(driver); + await driver.waitForSelector({ text: '1.5 TST', tag: 'h2' }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // in extension, check that transaction has completed correctly and is displayed in the activity list + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'Activity'); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1.5 TST', + }); + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Send TST', + }); + + // this selector helps prevent flakiness. it allows driver to wait until send transfer is "confirmed" + await driver.waitForSelector({ + text: 'Confirmed', + tag: 'div', + }); + + // check token amount is correct after transaction + await clickNestedButton(driver, 'Tokens'); + await driver.waitForSelector({ css: '[data-testid="multichain-token-list-item-value"]', text: '8.5 TST', - }, - { timeout: 10000 }, - ); - assert.ok(tokenAmount, 'Token amount is not correct'); - }, - ); + }); + }, + ); + }); + + async function mocks(server) { + return [await mockedSourcifyTokenSend(server)]; + } }); }); diff --git a/test/e2e/tests/tokens/nft/auto-detect-nft.spec.ts b/test/e2e/tests/tokens/nft/auto-detect-nft.spec.ts index c70a3860dd63..a1bc9005a2f3 100644 --- a/test/e2e/tests/tokens/nft/auto-detect-nft.spec.ts +++ b/test/e2e/tests/tokens/nft/auto-detect-nft.spec.ts @@ -1,7 +1,8 @@ import { withFixtures } from '../../../helpers'; import FixtureBuilder from '../../../fixture-builder'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; -import Homepage from '../../../page-objects/pages/homepage'; +import Homepage from '../../../page-objects/pages/home/homepage'; +import NFTListPage from '../../../page-objects/pages/home/nft-list'; import PrivacySettings from '../../../page-objects/pages/settings/privacy-settings'; import SettingsPage from '../../../page-objects/pages/settings/settings-page'; import { loginWithBalanceValidation } from '../../../page-objects/flows/login.flow'; @@ -39,10 +40,11 @@ describe('NFT detection', function () { await homepage.check_pageIsLoaded(); await homepage.check_expectedBalanceIsDisplayed(); await homepage.goToNftTab(); - await homepage.check_nftNameIsDisplayed( + const nftListPage = new NFTListPage(driver); + await nftListPage.check_nftNameIsDisplayed( 'ENS: Ethereum Name Service (1)', ); - await homepage.check_nftImageIsDisplayed(); + await nftListPage.check_nftImageIsDisplayed(); }, ); }); diff --git a/test/e2e/tests/tokens/nft/erc721-interaction.spec.js b/test/e2e/tests/tokens/nft/erc721-interaction.spec.js index 8b634ffc3ce3..ecd614f1b8a4 100644 --- a/test/e2e/tests/tokens/nft/erc721-interaction.spec.js +++ b/test/e2e/tests/tokens/nft/erc721-interaction.spec.js @@ -11,551 +11,1028 @@ const { const { SMART_CONTRACTS } = require('../../../seeder/smart-contracts'); const FixtureBuilder = require('../../../fixture-builder'); -describe('ERC721 NFTs testdapp interaction', function () { - const smartContract = SMART_CONTRACTS.NFTS; - - it('should add NFTs to state by parsing tx logs without having to click on watch NFT', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // mint NFTs - await driver.fill('#mintAmountInput', '5'); - await driver.clickElement({ text: 'Mint', tag: 'button' }); - - // Notification - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.waitForSelector({ - css: '.confirm-page-container-summary__action__name', - text: 'Deposit', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Deposit', - }); - - // verify the mint transaction has finished - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.waitForSelector({ - css: '#nftsStatus', - text: 'Mint completed', - }); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await clickNestedButton(driver, 'NFTs'); - await driver.findElement({ text: 'TestDappNFTs (5)' }); - const nftsListItemsFirstCheck = await driver.findElements( - '.nft-item__container', - ); - assert.equal(nftsListItemsFirstCheck.length, 5); - }, - ); - }); - - it('should prompt users to add their NFTs to their wallet (one by one) @no-mmi', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // mint NFT - await driver.fill('#mintAmountInput', '5'); - await driver.clickElement({ text: 'Mint', tag: 'button' }); - - // Notification - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.waitForSelector({ - css: '.confirm-page-container-summary__action__name', - text: 'Deposit', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Deposit', - }); - - // verify the mint transaction has finished - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - const nftsMintStatus = await driver.findElement({ - css: '#nftsStatus', - text: 'Mint completed', - }); - assert.equal(await nftsMintStatus.isDisplayed(), true); - - // watch 3 of the nfts - await driver.fill('#watchNFTInput', '1'); - await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); - await driver.fill('#watchNFTInput', '2'); - await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); - await driver.fill('#watchNFTInput', '3'); - await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); - - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // avoid race condition - await driver.waitForSelector({ - css: '.confirm-add-suggested-nft__nft-tokenId', - text: '#3', - }); - - // confirm watchNFT - await driver.waitForSelector({ - css: '.mm-text--heading-lg', - text: 'Add suggested NFTs', - }); - await driver.clickElement({ text: 'Add NFTs', tag: 'button' }); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await clickNestedButton(driver, 'NFTs'); - // Changed this check from 3 to 6, because after mint all nfts has been added to state, - await driver.findElement({ text: 'TestDappNFTs (6)' }); - const nftsListItemsFirstCheck = await driver.findElements( - '.nft-item__container', - ); - assert.equal(nftsListItemsFirstCheck.length, 6); - - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.fill('#watchNFTInput', '4'); - - await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); - await driver.fill('#watchNFTInput', '5'); - await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); - await driver.fill('#watchNFTInput', '6'); - await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); - - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // avoid race condition - await driver.waitForSelector({ - css: '.confirm-add-suggested-nft__nft-tokenId', - text: '#6', - }); - - // confirm watchNFT - await driver.waitForSelector({ - css: '.mm-text--heading-lg', - text: 'Add suggested NFTs', - }); - await driver.clickElement({ text: 'Add NFTs', tag: 'button' }); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await clickNestedButton(driver, 'NFTs'); - await driver.findElement({ text: 'TestDappNFTs (6)' }); - const nftsListItemsSecondCheck = await driver.findElements( - '.nft-item__container', - ); - assert.equal(nftsListItemsSecondCheck.length, 6); - }, - ); - }); +// describe('Old confirmation screens', function () { +// // ... +// }); - it('should prompt users to add their NFTs to their wallet (all at once)', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // mint NFT - await driver.fill('#mintAmountInput', '5'); - await driver.clickElement({ text: 'Mint', tag: 'button' }); - - // Notification - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.waitForSelector({ - css: '.confirm-page-container-summary__action__name', - text: 'Deposit', - }); - await driver.clickElementAndWaitForWindowToClose({ - text: 'Confirm', - tag: 'button', - }); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - - // We need to wait until the transaction is confirmed before looking for the tx - // otherwise the element becomes stale, as it updates from 'pending' to 'confirmed' - await driver.waitForSelector('.transaction-status-label--confirmed'); - - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Deposit', - }); - // verify the mint transaction has finished - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - await driver.waitForSelector({ - css: '#nftsStatus', - text: 'Mint completed', - }); - - // watch all nfts - await driver.clickElement({ text: 'Watch all NFTs', tag: 'button' }); - - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // confirm watchNFT - await driver.waitForSelector({ - css: '.mm-text--heading-lg', - text: 'Add suggested NFTs', - }); - - await driver.findElements('.confirm-add-suggested-nft__nft-list-item'); - const suggestedNftListItems = await driver.findElements( - '.confirm-add-suggested-nft__nft-list-item', - ); - // there are 6 nfts to add because one is minted as part of the fixture - assert.equal(suggestedNftListItems.length, 6); - - // remove one nft from the list - const removeButtons = await driver.findElements( - '.confirm-add-suggested-nft__nft-remove', - ); - await removeButtons[0].click(); - - await driver.clickElementAndWaitForWindowToClose({ - text: 'Add NFTs', - tag: 'button', - }); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await clickNestedButton(driver, 'NFTs'); - await driver.findElement({ text: 'TestDappNFTs (5)' }); - const nftsListItemsSecondCheck = await driver.findElements( - '.nft-item__container', - ); - - assert.equal(nftsListItemsSecondCheck.length, 5); - }, - ); - }); - - it('should transfer a single ERC721 NFT from one account to another', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // Click Transfer - await driver.fill('#transferTokenInput', '1'); - await driver.clickElement('#transferFromButton'); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // Confirm transfer - await driver.waitForSelector({ - css: '.mm-text--heading-md', - text: 'TestDappNFTs', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - - // Verify transaction - await driver.findElement({ text: 'Send TDN' }); - }, - ); - }); +// describe('Redesigned confirmation screens', function () { +// // ... +// }); - it('should approve an address to transfer a single ERC721 NFT', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // Click Approve - const approveInput = await driver.findElement('#approveTokenInput'); - await approveInput.clear(); - await approveInput.sendKeys('1'); - await driver.clickElement('#approveButton'); - - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // Verify dialog - const title = await driver.findElement( - '[data-testid="confirm-approve-title"]', - ); - await driver.clickElement({ - text: 'View full transaction details', - css: '.confirm-approve-content__small-blue-text', - }); - const [func] = await driver.findElements( - '.confirm-approve-content__data .confirm-approve-content__small-text', - ); - assert.equal( - await title.getText(), - 'Allow access to and transfer of your TestDappNFTs (#1)?', - ); - assert.equal(await func.getText(), 'Function: Approve'); - - // Confirm approval - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', - ); - - // Verify transaction - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Approve TDN spending cap', - }); - }, - ); - }); +describe('ERC721 NFTs testdapp interaction', function () { + const smartContract = SMART_CONTRACTS.NFTS; - it('should enable approval for a third party address to manage all ERC721 NFTs @no-mmi', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // Enable Set approval for all - await driver.clickElement('#setApprovalForAllButton'); - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // Verify dialog - const title = await driver.findElement( - '[data-testid="confirm-approve-title"]', - ); - await driver.clickElement({ - text: 'View full transaction details', - css: '.confirm-approve-content__small-blue-text', - }); - const [func, params] = await driver.findElements( - '.confirm-approve-content__data .confirm-approve-content__small-text', - ); - assert.equal( - await title.getText(), - 'Allow access to and transfer of all your TestDappNFTs?', - ); - assert.equal(await func.getText(), 'Function: SetApprovalForAll'); - assert.equal(await params.getText(), 'Parameters: true'); - - // Confirm enabling set approval for all - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement({ text: 'Approve', tag: 'button' }); - - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - - // Verify transaction - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Approve TDN with no spend limit', - }); - }, - ); + describe('Old confirmation screens', function () { + it('should add NFTs to state by parsing tx logs without having to click on watch NFT', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // mint NFTs + await driver.fill('#mintAmountInput', '5'); + await driver.clickElement({ text: 'Mint', tag: 'button' }); + + // Notification + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ + css: '.confirm-page-container-summary__action__name', + text: 'Deposit', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Deposit', + }); + + // verify the mint transaction has finished + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.waitForSelector({ + css: '#nftsStatus', + text: 'Mint completed', + }); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + await driver.findElement({ text: 'TestDappNFTs (5)' }); + const nftsListItemsFirstCheck = await driver.findElements( + '.nft-item__container', + ); + assert.equal(nftsListItemsFirstCheck.length, 5); + }, + ); + }); + + it('should prompt users to add their NFTs to their wallet (one by one) @no-mmi', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // mint NFT + await driver.fill('#mintAmountInput', '5'); + await driver.clickElement({ text: 'Mint', tag: 'button' }); + + // Notification + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ + css: '.confirm-page-container-summary__action__name', + text: 'Deposit', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Deposit', + }); + + // verify the mint transaction has finished + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + const nftsMintStatus = await driver.findElement({ + css: '#nftsStatus', + text: 'Mint completed', + }); + assert.equal(await nftsMintStatus.isDisplayed(), true); + + // watch 3 of the nfts + await driver.fill('#watchNFTInput', '1'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '2'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '3'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // avoid race condition + await driver.waitForSelector({ + css: '.confirm-add-suggested-nft__nft-tokenId', + text: '#3', + }); + + // confirm watchNFT + await driver.waitForSelector({ + css: '.mm-text--heading-lg', + text: 'Add suggested NFTs', + }); + await driver.clickElement({ text: 'Add NFTs', tag: 'button' }); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + // Changed this check from 3 to 6, because after mint all nfts has been added to state, + await driver.findElement({ text: 'TestDappNFTs (6)' }); + const nftsListItemsFirstCheck = await driver.findElements( + '.nft-item__container', + ); + assert.equal(nftsListItemsFirstCheck.length, 6); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.fill('#watchNFTInput', '4'); + + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '5'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '6'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // avoid race condition + await driver.waitForSelector({ + css: '.confirm-add-suggested-nft__nft-tokenId', + text: '#6', + }); + + // confirm watchNFT + await driver.waitForSelector({ + css: '.mm-text--heading-lg', + text: 'Add suggested NFTs', + }); + await driver.clickElement({ text: 'Add NFTs', tag: 'button' }); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + await driver.findElement({ text: 'TestDappNFTs (6)' }); + const nftsListItemsSecondCheck = await driver.findElements( + '.nft-item__container', + ); + assert.equal(nftsListItemsSecondCheck.length, 6); + }, + ); + }); + + it('should prompt users to add their NFTs to their wallet (all at once)', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // mint NFT + await driver.fill('#mintAmountInput', '5'); + await driver.clickElement({ text: 'Mint', tag: 'button' }); + + // Notification + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ + css: '.confirm-page-container-summary__action__name', + text: 'Deposit', + }); + await driver.clickElementAndWaitForWindowToClose({ + text: 'Confirm', + tag: 'button', + }); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + + // We need to wait until the transaction is confirmed before looking for the tx + // otherwise the element becomes stale, as it updates from 'pending' to 'confirmed' + await driver.waitForSelector('.transaction-status-label--confirmed'); + + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Deposit', + }); + // verify the mint transaction has finished + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.waitForSelector({ + css: '#nftsStatus', + text: 'Mint completed', + }); + + // watch all nfts + await driver.clickElement({ text: 'Watch all NFTs', tag: 'button' }); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // confirm watchNFT + await driver.waitForSelector({ + css: '.mm-text--heading-lg', + text: 'Add suggested NFTs', + }); + + await driver.findElements( + '.confirm-add-suggested-nft__nft-list-item', + ); + const suggestedNftListItems = await driver.findElements( + '.confirm-add-suggested-nft__nft-list-item', + ); + // there are 6 nfts to add because one is minted as part of the fixture + assert.equal(suggestedNftListItems.length, 6); + + // remove one nft from the list + const removeButtons = await driver.findElements( + '.confirm-add-suggested-nft__nft-remove', + ); + await removeButtons[0].click(); + + await driver.clickElementAndWaitForWindowToClose({ + text: 'Add NFTs', + tag: 'button', + }); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + await driver.findElement({ text: 'TestDappNFTs (5)' }); + const nftsListItemsSecondCheck = await driver.findElements( + '.nft-item__container', + ); + + assert.equal(nftsListItemsSecondCheck.length, 5); + }, + ); + }); + + it('should transfer a single ERC721 NFT from one account to another', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Click Transfer + await driver.fill('#transferTokenInput', '1'); + await driver.clickElement('#transferFromButton'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Confirm transfer + await driver.waitForSelector({ + css: '.mm-text--heading-md', + text: 'TestDappNFTs', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.findElement({ text: 'Send TDN' }); + }, + ); + }); + + it('should approve an address to transfer a single ERC721 NFT', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Click Approve + const approveInput = await driver.findElement('#approveTokenInput'); + await approveInput.clear(); + await approveInput.sendKeys('1'); + await driver.clickElement('#approveButton'); + + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Verify dialog + const title = await driver.findElement( + '[data-testid="confirm-approve-title"]', + ); + await driver.clickElement({ + text: 'View full transaction details', + css: '.confirm-approve-content__small-blue-text', + }); + const [func] = await driver.findElements( + '.confirm-approve-content__data .confirm-approve-content__small-text', + ); + assert.equal( + await title.getText(), + 'Allow access to and transfer of your TestDappNFTs (#1)?', + ); + assert.equal(await func.getText(), 'Function: Approve'); + + // Confirm approval + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Approve TDN spending cap', + }); + }, + ); + }); + + it('should enable approval for a third party address to manage all ERC721 NFTs @no-mmi', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Enable Set approval for all + await driver.clickElement('#setApprovalForAllButton'); + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Verify dialog + const title = await driver.findElement( + '[data-testid="confirm-approve-title"]', + ); + await driver.clickElement({ + text: 'View full transaction details', + css: '.confirm-approve-content__small-blue-text', + }); + const [func, params] = await driver.findElements( + '.confirm-approve-content__data .confirm-approve-content__small-text', + ); + assert.equal( + await title.getText(), + 'Allow access to and transfer of all your TestDappNFTs?', + ); + assert.equal(await func.getText(), 'Function: SetApprovalForAll'); + assert.equal(await params.getText(), 'Parameters: true'); + + // Confirm enabling set approval for all + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement({ text: 'Approve', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Approve TDN with no spend limit', + }); + }, + ); + }); + + it('should disable approval for a third party address to manage all ERC721 NFTs @no-mmi', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Disable Set approval for all + await driver.clickElement('#revokeButton'); + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Verify dialog + const title = await driver.findElement( + '[data-testid="confirm-approve-title"]', + ); + await driver.clickElement({ + text: 'View full transaction details', + css: '.confirm-approve-content__small-blue-text', + }); + const [func, params] = await driver.findElements( + '.confirm-approve-content__data .confirm-approve-content__small-text', + ); + const proceedWithCautionIsDisplayed = await driver.isElementPresent( + '.dialog--error', + ); + assert.equal( + await title.getText(), + 'Revoke permission to access and transfer all of your TestDappNFTs?', + ); + assert.equal(await func.getText(), 'Function: SetApprovalForAll'); + assert.equal(await params.getText(), 'Parameters: false'); + assert.equal(proceedWithCautionIsDisplayed, false); + + // Confirm disabling set approval for all + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Approve TDN with no spend limit', + }); + }, + ); + }); }); - it('should disable approval for a third party address to manage all ERC721 NFTs @no-mmi', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, _, contractRegistry }) => { - const contract = contractRegistry.getContractAddress(smartContract); - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Open Dapp and wait for deployed contract - await openDapp(driver, contract); - await driver.findClickableElement('#deployButton'); - - // Disable Set approval for all - await driver.clickElement('#revokeButton'); - await driver.waitUntilXWindowHandles(3); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // Verify dialog - const title = await driver.findElement( - '[data-testid="confirm-approve-title"]', - ); - await driver.clickElement({ - text: 'View full transaction details', - css: '.confirm-approve-content__small-blue-text', - }); - const [func, params] = await driver.findElements( - '.confirm-approve-content__data .confirm-approve-content__small-text', - ); - const proceedWithCautionIsDisplayed = await driver.isElementPresent( - '.dialog--error', - ); - assert.equal( - await title.getText(), - 'Revoke permission to access and transfer all of your TestDappNFTs?', - ); - assert.equal(await func.getText(), 'Function: SetApprovalForAll'); - assert.equal(await params.getText(), 'Parameters: false'); - assert.equal(proceedWithCautionIsDisplayed, false); - - // Confirm disabling set approval for all - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', - ); - - // Verify transaction - await driver.waitForSelector({ - css: '[data-testid="activity-list-item-action"]', - text: 'Approve TDN with no spend limit', - }); - }, - ); + describe('Redesigned confirmation screens', function () { + it('should add NFTs to state by parsing tx logs without having to click on watch NFT', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // mint NFTs + await driver.fill('#mintAmountInput', '5'); + await driver.clickElement({ text: 'Mint', tag: 'button' }); + + // Notification + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Deposit', + }); + + // verify the mint transaction has finished + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.waitForSelector({ + css: '#nftsStatus', + text: 'Mint completed', + }); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + await driver.findElement({ text: 'TestDappNFTs (5)' }); + const nftsListItemsFirstCheck = await driver.findElements( + '.nft-item__container', + ); + assert.equal(nftsListItemsFirstCheck.length, 5); + }, + ); + }); + + it('should prompt users to add their NFTs to their wallet (one by one) @no-mmi', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // mint NFT + await driver.fill('#mintAmountInput', '5'); + await driver.clickElement({ text: 'Mint', tag: 'button' }); + + // Notification + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Deposit', + }); + + // verify the mint transaction has finished + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + const nftsMintStatus = await driver.findElement({ + css: '#nftsStatus', + text: 'Mint completed', + }); + assert.equal(await nftsMintStatus.isDisplayed(), true); + + // watch 3 of the nfts + await driver.fill('#watchNFTInput', '1'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '2'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '3'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // avoid race condition + await driver.waitForSelector({ + css: '.confirm-add-suggested-nft__nft-tokenId', + text: '#3', + }); + + // confirm watchNFT + await driver.waitForSelector({ + css: '.mm-text--heading-lg', + text: 'Add suggested NFTs', + }); + await driver.clickElement({ text: 'Add NFTs', tag: 'button' }); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + // Changed this check from 3 to 6, because after mint all nfts has been added to state, + await driver.findElement({ text: 'TestDappNFTs (6)' }); + const nftsListItemsFirstCheck = await driver.findElements( + '.nft-item__container', + ); + assert.equal(nftsListItemsFirstCheck.length, 6); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.fill('#watchNFTInput', '4'); + + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '5'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + await driver.fill('#watchNFTInput', '6'); + await driver.clickElement({ text: 'Watch NFT', tag: 'button' }); + + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // avoid race condition + await driver.waitForSelector({ + css: '.confirm-add-suggested-nft__nft-tokenId', + text: '#6', + }); + + // confirm watchNFT + await driver.waitForSelector({ + css: '.mm-text--heading-lg', + text: 'Add suggested NFTs', + }); + await driver.clickElement({ text: 'Add NFTs', tag: 'button' }); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + await driver.findElement({ text: 'TestDappNFTs (6)' }); + const nftsListItemsSecondCheck = await driver.findElements( + '.nft-item__container', + ); + assert.equal(nftsListItemsSecondCheck.length, 6); + }, + ); + }); + + it('should prompt users to add their NFTs to their wallet (all at once)', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // mint NFT + await driver.fill('#mintAmountInput', '5'); + await driver.clickElement({ text: 'Mint', tag: 'button' }); + + // Notification + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.clickElementAndWaitForWindowToClose({ + text: 'Confirm', + tag: 'button', + }); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + + // We need to wait until the transaction is confirmed before looking for the tx + // otherwise the element becomes stale, as it updates from 'pending' to 'confirmed' + await driver.waitForSelector('.transaction-status-label--confirmed'); + + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Deposit', + }); + // verify the mint transaction has finished + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + await driver.waitForSelector({ + css: '#nftsStatus', + text: 'Mint completed', + }); + + // watch all nfts + await driver.clickElement({ text: 'Watch all NFTs', tag: 'button' }); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // confirm watchNFT + await driver.waitForSelector({ + css: '.mm-text--heading-lg', + text: 'Add suggested NFTs', + }); + + await driver.findElements( + '.confirm-add-suggested-nft__nft-list-item', + ); + const suggestedNftListItems = await driver.findElements( + '.confirm-add-suggested-nft__nft-list-item', + ); + // there are 6 nfts to add because one is minted as part of the fixture + assert.equal(suggestedNftListItems.length, 6); + + // remove one nft from the list + const removeButtons = await driver.findElements( + '.confirm-add-suggested-nft__nft-remove', + ); + await removeButtons[0].click(); + + await driver.clickElementAndWaitForWindowToClose({ + text: 'Add NFTs', + tag: 'button', + }); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await clickNestedButton(driver, 'NFTs'); + await driver.findElement({ text: 'TestDappNFTs (5)' }); + const nftsListItemsSecondCheck = await driver.findElements( + '.nft-item__container', + ); + + assert.equal(nftsListItemsSecondCheck.length, 5); + }, + ); + }); + + it('should transfer a single ERC721 NFT from one account to another', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Click Transfer + await driver.fill('#transferTokenInput', '1'); + await driver.clickElement('#transferFromButton'); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Confirm transfer + await driver.waitForSelector({ + css: 'h2', + text: 'TestDappNFTs', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.findElement({ text: 'Send TDN' }); + }, + ); + }); + + it('should approve an address to transfer a single ERC721 NFT', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Click Approve + const approveInput = await driver.findElement('#approveTokenInput'); + await approveInput.clear(); + await approveInput.sendKeys('1'); + await driver.clickElement('#approveButton'); + + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Confirm approval + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Approve TDN spending cap', + }); + }, + ); + }); + + it('should enable approval for a third party address to manage all ERC721 NFTs @no-mmi', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Enable Set approval for all + await driver.clickElement('#setApprovalForAllButton'); + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Confirm enabling set approval for all + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Approve TDN with no spend limit', + }); + }, + ); + }); + + it('should disable approval for a third party address to manage all ERC721 NFTs @no-mmi', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await unlockWallet(driver); + + // Open Dapp and wait for deployed contract + await openDapp(driver, contract); + await driver.findClickableElement('#deployButton'); + + // Disable Set approval for all + await driver.clickElement('#revokeButton'); + await driver.waitUntilXWindowHandles(3); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Confirm disabling set approval for all + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', + ); + + // Verify transaction + await driver.waitForSelector({ + css: '[data-testid="activity-list-item-action"]', + text: 'Approve TDN with no spend limit', + }); + }, + ); + }); }); }); diff --git a/test/e2e/tests/tokens/nft/import-nft.spec.ts b/test/e2e/tests/tokens/nft/import-nft.spec.ts index bc709ba463c0..5983d1002035 100644 --- a/test/e2e/tests/tokens/nft/import-nft.spec.ts +++ b/test/e2e/tests/tokens/nft/import-nft.spec.ts @@ -3,7 +3,8 @@ import { SMART_CONTRACTS } from '../../../seeder/smart-contracts'; import FixtureBuilder from '../../../fixture-builder'; import AccountListPage from '../../../page-objects/pages/account-list-page'; import HeaderNavbar from '../../../page-objects/pages/header-navbar'; -import Homepage from '../../../page-objects/pages/homepage'; +import Homepage from '../../../page-objects/pages/home/homepage'; +import NftListPage from '../../../page-objects/pages/home/nft-list'; import { loginWithBalanceValidation } from '../../../page-objects/flows/login.flow'; describe('Import NFT', function () { @@ -27,11 +28,11 @@ describe('Import NFT', function () { const homepage = new Homepage(driver); await homepage.goToNftTab(); - await homepage.importNft(contractAddress, '1'); - await homepage.check_successImportNftMessageIsDisplayed(); - - await homepage.check_nftNameIsDisplayed('TestDappNFTs'); - await homepage.check_nftImageIsDisplayed(); + const nftList = new NftListPage(driver); + await nftList.importNft(contractAddress, '1'); + await nftList.check_successImportNftMessageIsDisplayed(); + await nftList.check_nftNameIsDisplayed('TestDappNFTs'); + await nftList.check_nftImageIsDisplayed(); }, ); }); @@ -55,10 +56,11 @@ describe('Import NFT', function () { // Import a NFT and check that it is displayed in the NFT tab on homepage const homepage = new Homepage(driver); await homepage.goToNftTab(); - await homepage.importNft(contractAddress, '1'); - await homepage.check_successImportNftMessageIsDisplayed(); - await homepage.check_nftNameIsDisplayed('TestDappNFTs'); - await homepage.check_nftImageIsDisplayed(); + const nftList = new NftListPage(driver); + await nftList.importNft(contractAddress, '1'); + await nftList.check_successImportNftMessageIsDisplayed(); + await nftList.check_nftNameIsDisplayed('TestDappNFTs'); + await nftList.check_nftImageIsDisplayed(); // Create new account with default name Account 2 const headerNavbar = new HeaderNavbar(driver); @@ -76,8 +78,8 @@ describe('Import NFT', function () { await accountListPage.switchToAccount('Account 1'); await headerNavbar.check_accountLabel('Account 1'); await homepage.check_localBlockchainBalanceIsDisplayed(ganacheServer); - await homepage.check_nftNameIsDisplayed('TestDappNFTs'); - await homepage.check_nftImageIsDisplayed(); + await nftList.check_nftNameIsDisplayed('TestDappNFTs'); + await nftList.check_nftImageIsDisplayed(); }, ); }); @@ -98,9 +100,8 @@ describe('Import NFT', function () { contractRegistry.getContractAddress(smartContract); await loginWithBalanceValidation(driver, ganacheServer); - const homepage = new Homepage(driver); - await homepage.goToNftTab(); - await homepage.importNft( + await new Homepage(driver).goToNftTab(); + await new NftListPage(driver).importNft( contractAddress, '2', 'NFT can’t be added as the ownership details do not match. Make sure you have entered correct information.', diff --git a/test/e2e/tests/tokens/nft/send-nft.spec.js b/test/e2e/tests/tokens/nft/send-nft.spec.js index 13cb310f1416..af0d0d596337 100644 --- a/test/e2e/tests/tokens/nft/send-nft.spec.js +++ b/test/e2e/tests/tokens/nft/send-nft.spec.js @@ -177,7 +177,7 @@ describe('Send NFT', function () { await driver.fill('input[placeholder="0"]', '0'); assert.ok( await driver.findElement({ - text: '1 token. Cannot send negative or zero amounts of asset.', + text: '1 NFT. Cannot send negative or zero amounts of asset.', tag: 'p', }), ); diff --git a/test/e2e/tests/tokens/token-details.spec.ts b/test/e2e/tests/tokens/token-details.spec.ts index c882c7c8b4b4..5424f1d02367 100644 --- a/test/e2e/tests/tokens/token-details.spec.ts +++ b/test/e2e/tests/tokens/token-details.spec.ts @@ -102,6 +102,9 @@ describe('Token Details', function () { async ({ driver }: { driver: Driver }) => { await unlockWallet(driver); await importToken(driver); + await driver.clickElement( + '.actionable-message__message button[aria-label="Close"]', + ); await openTokenDetails(driver); await verifyToken(driver); }, @@ -157,6 +160,9 @@ describe('Token Details', function () { async ({ driver }: { driver: Driver }) => { await unlockWallet(driver); await importToken(driver); + await driver.clickElement( + '.actionable-message__message button[aria-label="Close"]', + ); await openTokenDetails(driver); await verifyToken(driver); diff --git a/test/e2e/tests/tokens/watch-asset-call-add-token.ts b/test/e2e/tests/tokens/watch-asset-call-add-token.ts index 35c66dda8ce6..b1dc4ae98746 100644 --- a/test/e2e/tests/tokens/watch-asset-call-add-token.ts +++ b/test/e2e/tests/tokens/watch-asset-call-add-token.ts @@ -6,7 +6,7 @@ import { import FixtureBuilder from '../../fixture-builder'; import { SMART_CONTRACTS } from '../../seeder/smart-contracts'; import AddTokenConfirmation from '../../page-objects/pages/confirmations/redesign/add-token-confirmations'; -import HomePage from '../../page-objects/pages/homepage'; +import AssetListPage from '../../page-objects/pages/home/asset-list'; import TestDapp from '../../page-objects/pages/test-dapp'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; @@ -55,7 +55,7 @@ describe('Add token using wallet_watchAsset', function () { await driver.switchToWindowWithTitle( WINDOW_TITLES.ExtensionInFullScreenView, ); - await new HomePage(driver).check_tokenAmountIsDisplayed('0 TST'); + await new AssetListPage(driver).check_tokenAmountIsDisplayed('0 TST'); }, ); }); @@ -102,7 +102,7 @@ describe('Add token using wallet_watchAsset', function () { await driver.switchToWindowWithTitle( WINDOW_TITLES.ExtensionInFullScreenView, ); - await new HomePage(driver).check_tokenItemNumber(1); + await new AssetListPage(driver).check_tokenItemNumber(1); }, ); }); diff --git a/test/e2e/tests/transaction/change-assets.spec.js b/test/e2e/tests/transaction/change-assets.spec.js index f6a997c164e9..33944f7a2160 100644 --- a/test/e2e/tests/transaction/change-assets.spec.js +++ b/test/e2e/tests/transaction/change-assets.spec.js @@ -10,360 +10,721 @@ const { SMART_CONTRACTS } = require('../../seeder/smart-contracts'); const { tEn } = require('../../../lib/i18n-helpers'); describe('Change assets', function () { - it('sends the correct asset when switching from native currency to NFT', async function () { - const smartContract = SMART_CONTRACTS.NFTS; - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().withNftControllerERC721().build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Wait for balance to load - await driver.delay(500); - - // Click the Send button - await driver.clickElement('[data-testid="eth-overview-send"]'); - - // Chose a recipient - await driver.clickElement('.multichain-account-list-item'); - - // Populate an amount, continue - await driver.clickElement('[data-testid="currency-input"]'); - await driver.press('[data-testid="currency-input"]', '2'); - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Validate the send amount - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '2.000042', - }); - - // Click edit - await driver.clickElement( - '[data-testid="confirm-page-back-edit-button"]', - ); - - // Open the Amount modal - await driver.clickElement('.asset-picker__symbol'); - - // Choose an NFT instead - await driver.clickElement({ css: 'button', text: 'NFTs' }); - await driver.clickElement('[data-testid="nft-default-image"]'); - - // Validate that an NFT is chosen in the AssetAmountPicker - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'TDN', - }); - await driver.waitForSelector({ css: 'p', text: '#1' }); - - // Click continue - await driver.assertElementNotPresent('.mm-modal-content'); - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Ensure NFT is showing - await driver.waitForSelector( - '.confirm-page-container-summary__title img', - ); - await driver.waitForSelector({ css: 'h3', text: 'Test Dapp NFTs #1' }); - - // Send it! - await driver.clickElement({ text: 'Confirm', css: 'button' }); - - // Ensure it was sent - await driver.waitForSelector({ - css: 'p', - text: 'Send Test Dapp NFTs #1', - }); - }, - ); + describe('Old confirmation screens', function () { + it('sends the correct asset when switching from native currency to NFT', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().withNftControllerERC721().build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Wait for balance to load + await driver.delay(500); + + // Click the Send button + await driver.clickElement('[data-testid="eth-overview-send"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '2'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Validate the send amount + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '2.000042', + }); + + // Click edit + await driver.clickElement( + '[data-testid="confirm-page-back-edit-button"]', + ); + + // Open the Amount modal + await driver.clickElement('.asset-picker__symbol'); + + // Choose an NFT instead + await driver.clickElement({ css: 'button', text: 'NFTs' }); + await driver.clickElement('[data-testid="nft-default-image"]'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + + // Click continue + await driver.assertElementNotPresent('.mm-modal-content'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Ensure NFT is showing + await driver.waitForSelector( + '.confirm-page-container-summary__title img', + ); + await driver.waitForSelector({ + css: 'h3', + text: 'Test Dapp NFTs #1', + }); + + // Send it! + await driver.clickElement({ text: 'Confirm', css: 'button' }); + + // Ensure it was sent + await driver.waitForSelector({ + css: 'p', + text: 'Send Test Dapp NFTs #1', + }); + }, + ); + }); + + it('sends the correct asset when switching from ERC20 to NFT', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + const tokenContract = SMART_CONTRACTS.HST; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withTokensControllerERC20() + .withNftControllerERC721() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract: [smartContract, tokenContract], + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Click the Send button + await driver.clickElement({ + css: '[data-testid="multichain-token-list-button"] p', + text: 'TST', + }); + + // Wait for balance to load + await driver.delay(500); + + await driver.clickElement('[data-testid="eth-overview-send"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '0'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Validate the send amount + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '0.00008455', + }); + + // Click edit + await driver.clickElement( + '[data-testid="confirm-page-back-edit-button"]', + ); + + // Open the Amount modal + await driver.clickElement('.asset-picker__symbol'); + + // Choose an NFT instead + await driver.clickElement({ css: 'button', text: 'NFTs' }); + await driver.clickElement('[data-testid="nft-default-image"]'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + + // Click continue + await driver.assertElementNotPresent('.mm-modal-content'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Ensure NFT is showing + await driver.waitForSelector( + '.confirm-page-container-summary__title img', + ); + await driver.waitForSelector({ + css: 'h3', + text: 'Test Dapp NFTs #1', + }); + + // Send it! + await driver.clickElement({ text: 'Confirm', css: 'button' }); + + // Ensure it was sent + await driver.waitForSelector({ + css: 'p', + text: 'Send Test Dapp NFTs #1', + }); + }, + ); + }); + + it('sends the correct asset when switching from NFT to native currency', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().withNftControllerERC721().build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Choose the nft + await driver.clickElement( + '[data-testid="account-overview__nfts-tab"]', + ); + await driver.clickElement('[data-testid="nft-default-image"]'); + await driver.clickElement('[data-testid="nft-send-button"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Ensure NFT is showing + await driver.waitForSelector( + '.confirm-page-container-summary__title img', + ); + await driver.waitForSelector({ + css: 'h3', + text: 'Test Dapp NFTs #1', + }); + + // Click edit + await driver.clickElement( + '[data-testid="confirm-page-back-edit-button"]', + ); + + // Open the Amount modal + await driver.clickElement('.asset-picker__symbol'); + + // Choose tokens + await driver.clickElement({ css: 'button', text: 'Tokens' }); + await driver.clickElement( + '[data-testid="multichain-token-list-button"]', + ); + + // Ensure correct token selected + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'ETH', + }); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '2'); + await driver.assertElementNotPresent('.mm-modal-content'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Validate the send amount + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '2.000042', + }); + + // Send it! + await driver.clickElement({ text: 'Confirm', css: 'button' }); + + // Ensure it was sent + await driver.waitForSelector({ css: 'p', text: 'Send' }); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-2 ETH', + }); + }, + ); + }); + + it('changes to native currency when switching accounts during a NFT send', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withNftControllerERC721() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Create second account + await driver.clickElement('[data-testid="account-menu-icon"]'); + await driver.clickElement( + '[data-testid="multichain-account-menu-popover-action-button"]', + ); + await driver.clickElement( + '[data-testid="multichain-account-menu-popover-add-account"]', + ); + await driver.fill('[placeholder="Account 2"]', 'Account 2'); + await driver.clickElement({ text: tEn('addAccount'), tag: 'button' }); + + // Go back to Account 1 + await driver.clickElement('[data-testid="account-menu-icon"]'); + await driver.clickElement({ + css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, + text: 'Account 1', + }); + + // Choose the nft + await driver.clickElement( + '[data-testid="account-overview__nfts-tab"]', + ); + await driver.clickElement('[data-testid="nft-default-image"]'); + await driver.clickElement('[data-testid="nft-send-button"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + + // Switch to Account 2 + await driver.clickElement('[data-testid="send-page-account-picker"]'); + await driver.clickElement({ + css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, + text: 'Account 2', + }); + + // Ensure that the AssetPicker shows native currency and 0 value + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'ETH', + }); + + // Go back to Account 1 + await driver.clickElement('[data-testid="send-page-account-picker"]'); + await driver.clickElement({ + css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, + text: 'Account 1', + }); + + // Ensure that the AssetPicker shows native currency and 0 value + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'ETH', + }); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '2'); + + // Make sure hex data is cleared after switching assets + const hexDataLocator = await driver.findElement( + '[data-testid="send-hex-textarea"]', + ); + const hexDataValue = await hexDataLocator.getProperty('value'); + assert.equal( + hexDataValue, + '', + 'Hex data has not been cleared after switching assets.', + ); + + // Make sure gas is updated by resetting amount and hex data + // Note: this is needed until the race condition is fixed on the wallet level (issue #25243) + await driver.fill('[data-testid="currency-input"]', '2.000042'); + await hexDataLocator.fill('0x'); + await hexDataLocator.fill(''); + + // Go to the last confirmation screen + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Validate the send amount + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '2.000042', + }); + }, + ); + }); }); - it('sends the correct asset when switching from ERC20 to NFT', async function () { - const smartContract = SMART_CONTRACTS.NFTS; - const tokenContract = SMART_CONTRACTS.HST; - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withTokensControllerERC20() - .withNftControllerERC721() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract: [smartContract, tokenContract], - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Click the Send button - await driver.clickElement({ - css: '[data-testid="multichain-token-list-button"] span', - text: 'TST', - }); - - // Wait for balance to load - await driver.delay(500); - - await driver.clickElement('[data-testid="eth-overview-send"]'); - - // Chose a recipient - await driver.clickElement('.multichain-account-list-item'); - - // Populate an amount, continue - await driver.clickElement('[data-testid="currency-input"]'); - await driver.press('[data-testid="currency-input"]', '0'); - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Validate the send amount - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '0.00008455', - }); - - // Click edit - await driver.clickElement( - '[data-testid="confirm-page-back-edit-button"]', - ); - - // Open the Amount modal - await driver.clickElement('.asset-picker__symbol'); - - // Choose an NFT instead - await driver.clickElement({ css: 'button', text: 'NFTs' }); - await driver.clickElement('[data-testid="nft-default-image"]'); - - // Validate that an NFT is chosen in the AssetAmountPicker - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'TDN', - }); - await driver.waitForSelector({ css: 'p', text: '#1' }); - - // Click continue - await driver.assertElementNotPresent('.mm-modal-content'); - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Ensure NFT is showing - await driver.waitForSelector( - '.confirm-page-container-summary__title img', - ); - await driver.waitForSelector({ css: 'h3', text: 'Test Dapp NFTs #1' }); - - // Send it! - await driver.clickElement({ text: 'Confirm', css: 'button' }); - - // Ensure it was sent - await driver.waitForSelector({ - css: 'p', - text: 'Send Test Dapp NFTs #1', - }); - }, - ); - }); - - it('sends the correct asset when switching from NFT to native currency', async function () { - const smartContract = SMART_CONTRACTS.NFTS; - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder().withNftControllerERC721().build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Choose the nft - await driver.clickElement('[data-testid="account-overview__nfts-tab"]'); - await driver.clickElement('[data-testid="nft-default-image"]'); - await driver.clickElement('[data-testid="nft-send-button"]'); - - // Chose a recipient - await driver.clickElement('.multichain-account-list-item'); - - // Validate that an NFT is chosen in the AssetAmountPicker - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'TDN', - }); - await driver.waitForSelector({ css: 'p', text: '#1' }); - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Ensure NFT is showing - await driver.waitForSelector( - '.confirm-page-container-summary__title img', - ); - await driver.waitForSelector({ css: 'h3', text: 'Test Dapp NFTs #1' }); - - // Click edit - await driver.clickElement( - '[data-testid="confirm-page-back-edit-button"]', - ); - - // Open the Amount modal - await driver.clickElement('.asset-picker__symbol'); - - // Choose tokens - await driver.clickElement({ css: 'button', text: 'Tokens' }); - await driver.clickElement( - '[data-testid="multichain-token-list-button"]', - ); - - // Ensure correct token selected - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'ETH', - }); - - // Populate an amount, continue - await driver.clickElement('[data-testid="currency-input"]'); - await driver.press('[data-testid="currency-input"]', '2'); - await driver.assertElementNotPresent('.mm-modal-content'); - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Validate the send amount - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '2.000042', - }); - - // Send it! - await driver.clickElement({ text: 'Confirm', css: 'button' }); - - // Ensure it was sent - await driver.waitForSelector({ css: 'p', text: 'Send' }); - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-2 ETH', - }); - }, - ); - }); - - it('changes to native currency when switching accounts during a NFT send', async function () { - const smartContract = SMART_CONTRACTS.NFTS; - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withNftControllerERC721() - .withPreferencesController({ - featureFlags: { - sendHexData: true, - }, - }) - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Create second account - await driver.clickElement('[data-testid="account-menu-icon"]'); - await driver.clickElement( - '[data-testid="multichain-account-menu-popover-action-button"]', - ); - await driver.clickElement( - '[data-testid="multichain-account-menu-popover-add-account"]', - ); - await driver.fill('[placeholder="Account 2"]', 'Account 2'); - await driver.clickElement({ text: tEn('addAccount'), tag: 'button' }); - - // Go back to Account 1 - await driver.clickElement('[data-testid="account-menu-icon"]'); - await driver.clickElement({ - css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, - text: 'Account 1', - }); - - // Choose the nft - await driver.clickElement('[data-testid="account-overview__nfts-tab"]'); - await driver.clickElement('[data-testid="nft-default-image"]'); - await driver.clickElement('[data-testid="nft-send-button"]'); - - // Chose a recipient - await driver.clickElement('.multichain-account-list-item'); - - // Validate that an NFT is chosen in the AssetAmountPicker - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'TDN', - }); - await driver.waitForSelector({ css: 'p', text: '#1' }); - - // Switch to Account 2 - await driver.clickElement('[data-testid="send-page-account-picker"]'); - await driver.clickElement({ - css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, - text: 'Account 2', - }); - - // Ensure that the AssetPicker shows native currency and 0 value - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'ETH', - }); - - // Go back to Account 1 - await driver.clickElement('[data-testid="send-page-account-picker"]'); - await driver.clickElement({ - css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, - text: 'Account 1', - }); - - // Ensure that the AssetPicker shows native currency and 0 value - await driver.waitForSelector({ - css: '.asset-picker__symbol', - text: 'ETH', - }); - - // Populate an amount, continue - await driver.clickElement('[data-testid="currency-input"]'); - await driver.press('[data-testid="currency-input"]', '2'); - - // Make sure hex data is cleared after switching assets - const hexDataLocator = await driver.findElement( - '[data-testid="send-hex-textarea"]', - ); - const hexDataValue = await hexDataLocator.getProperty('value'); - assert.equal( - hexDataValue, - '', - 'Hex data has not been cleared after switching assets.', - ); - - // Make sure gas is updated by resetting amount and hex data - // Note: this is needed until the race condition is fixed on the wallet level (issue #25243) - await driver.fill('[data-testid="currency-input"]', '2.000042'); - await hexDataLocator.fill('0x'); - await hexDataLocator.fill(''); - - // Go to the last confirmation screen - await driver.clickElement({ text: 'Continue', css: 'button' }); - - // Validate the send amount - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '2.000042', - }); - }, - ); + describe('Redesigned confirmation screens', function () { + it('sends the correct asset when switching from native currency to NFT', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().withNftControllerERC721().build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Wait for balance to load + await driver.delay(500); + + // Click the Send button + await driver.clickElement('[data-testid="eth-overview-send"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '2'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Click edit + await driver.clickElement( + '[data-testid="wallet-initiated-header-back-button"]', + ); + + // Open the Amount modal + await driver.clickElement('.asset-picker__symbol'); + + // Choose an NFT instead + await driver.clickElement({ css: 'button', text: 'NFTs' }); + await driver.clickElement('[data-testid="nft-default-image"]'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + + // Click continue + await driver.assertElementNotPresent('.mm-modal-content'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Ensure NFT is showing + await driver.waitForSelector('[data-testid="nft-default-image"]'); + await driver.waitForSelector({ + css: 'h2', + text: 'Test Dapp NFTs #1', + }); + + // Send it! + await driver.clickElement({ text: 'Confirm', css: 'button' }); + + // Ensure it was sent + await driver.waitForSelector({ + css: 'p', + text: 'Send Test Dapp NFTs #1', + }); + }, + ); + }); + + it('sends the correct asset when switching from ERC20 to NFT', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + const tokenContract = SMART_CONTRACTS.HST; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withTokensControllerERC20() + .withNftControllerERC721() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract: [smartContract, tokenContract], + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Click the Send button + await driver.clickElement({ + css: '[data-testid="multichain-token-list-button"] p', + text: 'TST', + }); + + // Wait for balance to load + await driver.delay(500); + + await driver.clickElement('[data-testid="eth-overview-send"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '0'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Click edit + await driver.clickElement( + '[data-testid="wallet-initiated-header-back-button"]', + ); + + // Open the Amount modal + await driver.clickElement('.asset-picker__symbol'); + + // Choose an NFT instead + await driver.clickElement({ css: 'button', text: 'NFTs' }); + await driver.clickElement('[data-testid="nft-default-image"]'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + + // Click continue + await driver.assertElementNotPresent('.mm-modal-content'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Ensure NFT is showing + await driver.waitForSelector('[data-testid="nft-default-image"]'); + await driver.waitForSelector({ + css: 'h2', + text: 'Test Dapp NFTs #1', + }); + + // Send it! + await driver.clickElement({ text: 'Confirm', css: 'button' }); + + // Ensure it was sent + await driver.waitForSelector({ + css: 'p', + text: 'Send Test Dapp NFTs #1', + }); + }, + ); + }); + + it('sends the correct asset when switching from NFT to native currency', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().withNftControllerERC721().build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Choose the nft + await driver.clickElement( + '[data-testid="account-overview__nfts-tab"]', + ); + await driver.clickElement('[data-testid="nft-default-image"]'); + await driver.clickElement('[data-testid="nft-send-button"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Ensure NFT is showing + await driver.waitForSelector('[data-testid="nft-default-image"]'); + await driver.waitForSelector({ + css: 'h2', + text: 'Test Dapp NFTs #1', + }); + + // Click edit + await driver.clickElement( + '[data-testid="wallet-initiated-header-back-button"]', + ); + + // Open the Amount modal + await driver.clickElement('.asset-picker__symbol'); + + // Choose tokens + await driver.clickElement({ css: 'button', text: 'Tokens' }); + await driver.clickElement( + '[data-testid="multichain-token-list-button"]', + ); + + // Ensure correct token selected + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'ETH', + }); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '2'); + await driver.assertElementNotPresent('.mm-modal-content'); + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Validate the send amount + await driver.waitForSelector({ + css: 'h2', + text: '2', + }); + + // Send it! + await driver.clickElement({ text: 'Confirm', css: 'button' }); + + // Ensure it was sent + await driver.waitForSelector({ css: 'p', text: 'Send' }); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-2 ETH', + }); + }, + ); + }); + + it('changes to native currency when switching accounts during a NFT send', async function () { + const smartContract = SMART_CONTRACTS.NFTS; + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withNftControllerERC721() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Create second account + await driver.clickElement('[data-testid="account-menu-icon"]'); + await driver.clickElement( + '[data-testid="multichain-account-menu-popover-action-button"]', + ); + await driver.clickElement( + '[data-testid="multichain-account-menu-popover-add-account"]', + ); + await driver.fill('[placeholder="Account 2"]', 'Account 2'); + await driver.clickElement({ text: tEn('addAccount'), tag: 'button' }); + + // Go back to Account 1 + await driver.clickElement('[data-testid="account-menu-icon"]'); + await driver.clickElement({ + css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, + text: 'Account 1', + }); + + // Choose the nft + await driver.clickElement( + '[data-testid="account-overview__nfts-tab"]', + ); + await driver.clickElement('[data-testid="nft-default-image"]'); + await driver.clickElement('[data-testid="nft-send-button"]'); + + // Chose a recipient + await driver.clickElement('.multichain-account-list-item'); + + // Validate that an NFT is chosen in the AssetAmountPicker + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'TDN', + }); + await driver.waitForSelector({ css: 'p', text: '#1' }); + + // Switch to Account 2 + await driver.clickElement('[data-testid="send-page-account-picker"]'); + await driver.clickElement({ + css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, + text: 'Account 2', + }); + + // Ensure that the AssetPicker shows native currency and 0 value + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'ETH', + }); + + // Go back to Account 1 + await driver.clickElement('[data-testid="send-page-account-picker"]'); + await driver.clickElement({ + css: `.multichain-account-list-item .multichain-account-list-item__account-name__button`, + text: 'Account 1', + }); + + // Ensure that the AssetPicker shows native currency and 0 value + await driver.waitForSelector({ + css: '.asset-picker__symbol', + text: 'ETH', + }); + + // Populate an amount, continue + await driver.clickElement('[data-testid="currency-input"]'); + await driver.press('[data-testid="currency-input"]', '2'); + + // Make sure hex data is cleared after switching assets + const hexDataLocator = await driver.findElement( + '[data-testid="send-hex-textarea"]', + ); + const hexDataValue = await hexDataLocator.getProperty('value'); + assert.equal( + hexDataValue, + '', + 'Hex data has not been cleared after switching assets.', + ); + + // Make sure gas is updated by resetting amount and hex data + // Note: this is needed until the race condition is fixed on the wallet level (issue #25243) + await driver.fill('[data-testid="currency-input"]', '2.000042'); + await hexDataLocator.fill('0x'); + await hexDataLocator.fill(''); + + // Go to the last confirmation screen + await driver.clickElement({ text: 'Continue', css: 'button' }); + + // Validate the send amount + await driver.waitForSelector({ + css: 'h2', + text: '2 ETH', + }); + }, + ); + }); }); }); diff --git a/test/e2e/tests/transaction/edit-gas-fee.spec.js b/test/e2e/tests/transaction/edit-gas-fee.spec.js index 3e7655750594..4e30fb8c0be1 100644 --- a/test/e2e/tests/transaction/edit-gas-fee.spec.js +++ b/test/e2e/tests/transaction/edit-gas-fee.spec.js @@ -14,228 +14,456 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('Editing Confirm Transaction', function () { - it('allows selecting high, medium, low gas estimates on edit gas fee popover @no-mmi', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createInternalTransaction(driver); - - await driver.findElement({ - css: '.currency-display-component__text', - text: '1', - }); - - // update estimates to high - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - await driver.waitForSelector({ - text: 'sec', - tag: 'span', - }); - await driver.clickElement( - '[data-testid="edit-gas-fee-item-high"] > span:first-child', - ); - - await driver.waitForSelector({ - text: 'Aggressive', - }); - - // update estimates to medium - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - await driver.clickElement( - '[data-testid="edit-gas-fee-item-medium"] > span:first-child', - ); - - await driver.waitForSelector({ - text: 'Market', - }); - - // update estimates to low - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - await driver.clickElement( - '[data-testid="edit-gas-fee-item-low"] > span:first-child', - ); - - await driver.waitForSelector({ - text: 'Slow', - }); - await driver.waitForSelector('[data-testid="low-gas-fee-alert"]'); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '[data-testid="transaction-list-item-primary-currency"]', - ); - assert.equal(txValues.length, 1); - assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); - }, - ); - }); + describe('Old confirmation screens', function () { + it('allows selecting high, medium, low gas estimates on edit gas fee popover @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: '.currency-display-component__text', + text: '1', + }); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.waitForSelector({ + text: 'sec', + tag: 'span', + }); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-high"] > span:first-child', + ); + + await driver.waitForSelector({ + text: 'Aggressive', + }); + + // update estimates to medium + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-medium"] > span:first-child', + ); + + await driver.waitForSelector({ + text: 'Market', + }); - it('allows accessing advance gas fee popover from edit gas fee popover', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createInternalTransaction(driver); - - await driver.findElement({ - css: '.currency-display-component__text', - text: '1', - }); - - // update estimates to high - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - await driver.waitForSelector({ - text: 'sec', - tag: 'span', - }); - await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); - - // enter max fee - await driver.fill('[data-testid="base-fee-input"]', '8.5'); - - // enter priority fee - await driver.fill('[data-testid="priority-fee-input"]', '8.5'); - - // save default values - await driver.clickElement('input[type="checkbox"]'); - - // edit gas limit - await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); - await driver.fill('[data-testid="gas-limit-input"]', '100000'); - - // Submit gas fee changes - await driver.clickElement({ text: 'Save', tag: 'button' }); - - // has correct updated value on the confirm screen the transaction - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '0.00085', - }); - await driver.waitForSelector({ - css: '.currency-display-component__suffix', - text: 'ETH', - }); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '[data-testid="transaction-list-item-primary-currency"]', - ); - assert.equal(txValues.length, 1); - assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); - }, - ); + // update estimates to low + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-low"] > span:first-child', + ); + + await driver.waitForSelector({ + text: 'Slow', + }); + await driver.waitForSelector('[data-testid="low-gas-fee-alert"]'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('allows accessing advance gas fee popover from edit gas fee popover', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: '.currency-display-component__text', + text: '1', + }); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.waitForSelector({ + text: 'sec', + tag: 'span', + }); + await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); + + // enter max fee + await driver.fill('[data-testid="base-fee-input"]', '8.5'); + + // enter priority fee + await driver.fill('[data-testid="priority-fee-input"]', '8.5'); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + + // edit gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.fill('[data-testid="gas-limit-input"]', '100000'); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '0.00085', + }); + await driver.waitForSelector({ + css: '.currency-display-component__suffix', + text: 'ETH', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('should use dapp suggested estimates for transaction coming from dapp @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + // login to extension + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createDappTransaction(driver, { + maxFeePerGas: '0x2000000000', + maxPriorityFeePerGas: '0x1000000000', + }); + + // check transaction in extension popup + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ + text: 'Site suggested', + }); + + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + // -- should render the popover with no error + // this is to test in MV3 a racing issue when request for suggestedGasFees is not fetched properly + // some data would not be defined yet + await driver.waitForSelector('.edit-gas-fee-popover'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-dappSuggested"]', + ); + + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '0.001'); + + // has correct updated value on the confirm screen the transaction + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '0.00185144', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // transaction should correct values in activity tab + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-0.001\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); }); - it('should use dapp suggested estimates for transaction coming from dapp @no-mmi', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - dapp: true, - }, - async ({ driver }) => { - // login to extension - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createDappTransaction(driver, { - maxFeePerGas: '0x2000000000', - maxPriorityFeePerGas: '0x1000000000', - }); - - // check transaction in extension popup - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - await driver.waitForSelector({ - text: 'Site suggested', - }); - - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - // -- should render the popover with no error - // this is to test in MV3 a racing issue when request for suggestedGasFees is not fetched properly - // some data would not be defined yet - await driver.waitForSelector('.edit-gas-fee-popover'); - await driver.clickElement( - '[data-testid="edit-gas-fee-item-dappSuggested"]', - ); - - const transactionAmounts = await driver.findElements( - '.currency-display-component__text', - ); - const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '0.001'); - - // has correct updated value on the confirm screen the transaction - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '0.00185144', - }); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - // transaction should correct values in activity tab - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '[data-testid="transaction-list-item-primary-currency"]', - ); - assert.equal(txValues.length, 1); - assert.ok(/-0.001\s*ETH/u.test(await txValues[0].getText())); - }, - ); + describe('Redesigned confirmation screens', function () { + it('allows selecting high, medium, low gas estimates on edit gas fee popover @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: 'h2', + text: '1 ETH', + }); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.waitForSelector({ + text: 'sec', + tag: 'span', + }); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-high"] > span:first-child', + ); + + await driver.waitForSelector({ + text: 'Aggressive', + }); + + // update estimates to medium + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-medium"] > span:first-child', + ); + + await driver.waitForSelector({ + text: 'Market', + }); + + // update estimates to low + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-low"] > span:first-child', + ); + + await driver.waitForSelector({ + text: 'Slow', + }); + await driver.waitForSelector('[data-testid="inline-alert"]'); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('allows accessing advance gas fee popover from edit gas fee popover', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: 'h2', + text: '1 ETH', + }); + + // update estimates to high + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.waitForSelector({ + text: 'sec', + tag: 'span', + }); + await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); + + // enter max fee + await driver.fill('[data-testid="base-fee-input"]', '8.5'); + + // enter priority fee + await driver.fill('[data-testid="priority-fee-input"]', '8.5'); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + + // edit gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.fill('[data-testid="gas-limit-input"]', '100000'); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + await driver.waitForSelector({ + css: '[data-testid="first-gas-field"]', + text: '0.0008 ETH', + }); + + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$1.44', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('should use dapp suggested estimates for transaction coming from dapp @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + // login to extension + await unlockWallet(driver); + + await createDappTransaction(driver, { + maxFeePerGas: '0x2000000000', + maxPriorityFeePerGas: '0x1000000000', + }); + + // check transaction in extension popup + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + await driver.waitForSelector({ + text: 'Site suggested', + }); + + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + // -- should render the popover with no error + // this is to test in MV3 a racing issue when request for suggestedGasFees is not fetched properly + // some data would not be defined yet + await driver.waitForSelector('.edit-gas-fee-popover'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-dappSuggested"]', + ); + + await driver.findElements({ + css: 'h2', + text: '0.001 ETH', + }); + + // has correct updated value on the confirm screen the transaction + await driver.waitForSelector({ + css: '[data-testid="first-gas-field"]', + text: '0.0019', + }); + + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$3.15', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // transaction should correct values in activity tab + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-0.001\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); }); }); diff --git a/test/e2e/tests/transaction/ens.spec.ts b/test/e2e/tests/transaction/ens.spec.ts index 3291287ab5a4..b36765475b62 100644 --- a/test/e2e/tests/transaction/ens.spec.ts +++ b/test/e2e/tests/transaction/ens.spec.ts @@ -4,7 +4,7 @@ import { defaultGanacheOptions, withFixtures } from '../../helpers'; import { Driver } from '../../webdriver/driver'; import FixtureBuilder from '../../fixture-builder'; import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; -import HomePage from '../../page-objects/pages/homepage'; +import HomePage from '../../page-objects/pages/home/homepage'; import SendTokenPage from '../../page-objects/pages/send/send-token-page'; import { mockServerJsonRpc } from '../ppom/mocks/mock-server-json-rpc'; import { mockMultiNetworkBalancePolling } from '../../mock-balance-polling/mock-balance-polling'; diff --git a/test/e2e/tests/transaction/gas-estimates.spec.js b/test/e2e/tests/transaction/gas-estimates.spec.js index f12275ad4d9f..77027bc67901 100644 --- a/test/e2e/tests/transaction/gas-estimates.spec.js +++ b/test/e2e/tests/transaction/gas-estimates.spec.js @@ -17,237 +17,488 @@ describe('Gas estimates generated by MetaMask', function () { hardfork: 'london', }); - describe('Send on a network that is EIP-1559 compatible', function () { - it('show expected gas defaults', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: postLondonGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openActionMenuAndStartSendFlow(driver); - - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - await driver.fill('input[placeholder="0"]', '1'); - - await driver.clickElement({ css: 'button', text: 'Continue' }); - - // Check that the gas estimation is what we expect - await driver.findElement({ - cass: '[data-testid="confirm-gas-display"]', - text: '0.00043983', - }); - }, - ); - }); + describe('Old confirmation screens', function () { + describe('Send on a network that is EIP-1559 compatible', function () { + it('show expected gas defaults', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: postLondonGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="confirm-gas-display"]', + text: '0.00043983', + }); + }, + ); + }); + + it('show expected gas defaults when API is down', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: postLondonGanacheOptions, + testSpecificMock: (mockServer) => { + mockServer + .forGet(`${GAS_API_BASE_URL}/networks/1337/suggestedGasFees`) + .thenCallback(() => { + return { + json: { + error: 'cannot get gas prices for chain id 1337', + }, + statusCode: 503, + }; + }); + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="confirm-gas-display"]', + text: '0.00043983', + }); + }, + ); + }); + + it('show expected gas defaults when the network is not supported', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: postLondonGanacheOptions, + testSpecificMock: (mockServer) => { + mockServer + .forGet(`${GAS_API_BASE_URL}/networks/1337/suggestedGasFees`) + .thenCallback(() => { + return { + statusCode: 422, + }; + }); + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); - it('show expected gas defaults when API is down', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: postLondonGanacheOptions, - testSpecificMock: (mockServer) => { - mockServer - .forGet(`${GAS_API_BASE_URL}/networks/1337/suggestedGasFees`) - .thenCallback(() => { - return { - json: { - error: 'cannot get gas prices for chain id 1337', - }, - statusCode: 503, - }; - }); - }, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openActionMenuAndStartSendFlow(driver); - - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - await driver.fill('input[placeholder="0"]', '1'); - - await driver.clickElement({ css: 'button', text: 'Continue' }); - - // Check that the gas estimation is what we expect - await driver.findElement({ - cass: '[data-testid="confirm-gas-display"]', - text: '0.00043983', - }); - }, - ); + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="confirm-gas-display"]', + text: '0.00043983', + }); + }, + ); + }); }); - it('show expected gas defaults when the network is not supported', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: postLondonGanacheOptions, - testSpecificMock: (mockServer) => { - mockServer - .forGet(`${GAS_API_BASE_URL}/networks/1337/suggestedGasFees`) - .thenCallback(() => { - return { - statusCode: 422, - }; - }); - }, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openActionMenuAndStartSendFlow(driver); - - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - await driver.fill('input[placeholder="0"]', '1'); - - await driver.clickElement({ css: 'button', text: 'Continue' }); - - // Check that the gas estimation is what we expect - await driver.findElement({ - cass: '[data-testid="confirm-gas-display"]', - text: '0.00043983', - }); - }, - ); + describe('Send on a network that is not EIP-1559 compatible', function () { + it('show expected gas defaults on a network supported by legacy gas API', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: { + ...preLondonGanacheOptions, + chainId: parseInt(CHAIN_IDS.BSC, 16), + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="confirm-gas-display"]', + text: '0.000042', + }); + }, + ); + }); + + it('show expected gas defaults on a network supported by legacy gas API when that API is down', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: { + ...preLondonGanacheOptions, + chainId: parseInt(CHAIN_IDS.BSC, 16), + }, + testSpecificMock: (mockServer) => { + mockServer + .forGet( + `${GAS_API_BASE_URL}/networks/${parseInt( + CHAIN_IDS.BSC, + 16, + )}/gasPrices`, + ) + .thenCallback(() => { + return { + statusCode: 422, + }; + }); + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="confirm-gas-display"]', + text: '0.000042', + }); + }, + ); + }); + + it('show expected gas defaults on a network not supported by legacy gas API', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: preLondonGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="confirm-gas-display"]', + text: '0.000042', + }); + }, + ); + }); }); }); - describe('Send on a network that is not EIP-1559 compatible', function () { - it('show expected gas defaults on a network supported by legacy gas API', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: { - ...preLondonGanacheOptions, - chainId: parseInt(CHAIN_IDS.BSC, 16), - }, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openActionMenuAndStartSendFlow(driver); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - await driver.fill('input[placeholder="0"]', '1'); - - await driver.clickElement({ css: 'button', text: 'Continue' }); - - // Check that the gas estimation is what we expect - await driver.findElement({ - cass: '[data-testid="confirm-gas-display"]', - text: '0.000042', - }); - }, - ); - }); + describe('Redesigned confirmation screens', function () { + describe('Send on a network that is EIP-1559 compatible', function () { + it('show expected gas defaults', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: postLondonGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0.0004 ETH', + }); + + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$0.75', + }); + }, + ); + }); + + it('show expected gas defaults when API is down', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: postLondonGanacheOptions, + testSpecificMock: (mockServer) => { + mockServer + .forGet(`${GAS_API_BASE_URL}/networks/1337/suggestedGasFees`) + .thenCallback(() => { + return { + json: { + error: 'cannot get gas prices for chain id 1337', + }, + statusCode: 503, + }; + }); + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); - it('show expected gas defaults on a network supported by legacy gas API when that API is down', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: { - ...preLondonGanacheOptions, - chainId: parseInt(CHAIN_IDS.BSC, 16), - }, - testSpecificMock: (mockServer) => { - mockServer - .forGet( - `${GAS_API_BASE_URL}/networks/${parseInt( - CHAIN_IDS.BSC, - 16, - )}/gasPrices`, - ) - .thenCallback(() => { - return { - statusCode: 422, - }; - }); - }, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openActionMenuAndStartSendFlow(driver); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - await driver.fill('input[placeholder="0"]', '1'); - - await driver.clickElement({ css: 'button', text: 'Continue' }); - - // Check that the gas estimation is what we expect - await driver.findElement({ - cass: '[data-testid="confirm-gas-display"]', - text: '0.000042', - }); - }, - ); + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0 ETH', + }); + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$0.07', + }); + }, + ); + }); + + it('show expected gas defaults when the network is not supported', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: postLondonGanacheOptions, + testSpecificMock: (mockServer) => { + mockServer + .forGet(`${GAS_API_BASE_URL}/networks/1337/suggestedGasFees`) + .thenCallback(() => { + return { + statusCode: 422, + }; + }); + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0 ETH', + }); + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$0.07', + }); + }, + ); + }); }); - it('show expected gas defaults on a network not supported by legacy gas API', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: preLondonGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await openActionMenuAndStartSendFlow(driver); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - - await driver.fill('input[placeholder="0"]', '1'); - - await driver.clickElement({ css: 'button', text: 'Continue' }); - - // Check that the gas estimation is what we expect - await driver.findElement({ - cass: '[data-testid="confirm-gas-display"]', - text: '0.000042', - }); - }, - ); + describe('Send on a network that is not EIP-1559 compatible', function () { + it('show expected gas defaults on a network supported by legacy gas API', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: { + ...preLondonGanacheOptions, + chainId: parseInt(CHAIN_IDS.BSC, 16), + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0 ETH', + }); + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$0.07', + }); + }, + ); + }); + + it('show expected gas defaults on a network supported by legacy gas API when that API is down', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: { + ...preLondonGanacheOptions, + chainId: parseInt(CHAIN_IDS.BSC, 16), + }, + testSpecificMock: (mockServer) => { + mockServer + .forGet( + `${GAS_API_BASE_URL}/networks/${parseInt( + CHAIN_IDS.BSC, + 16, + )}/gasPrices`, + ) + .thenCallback(() => { + return { + statusCode: 422, + }; + }); + }, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0 ETH', + }); + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$0.07', + }); + }, + ); + }); + + it('show expected gas defaults on a network not supported by legacy gas API', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: preLondonGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + await driver.fill('input[placeholder="0"]', '1'); + + await driver.clickElement({ css: 'button', text: 'Continue' }); + + // Check that the gas estimation is what we expect + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0 ETH', + }); + await driver.waitForSelector({ + css: '[data-testid="native-currency"]', + text: '$0.07', + }); + }, + ); + }); }); }); }); diff --git a/test/e2e/tests/transaction/incoming-transactions.spec.ts b/test/e2e/tests/transaction/incoming-transactions.spec.ts new file mode 100644 index 000000000000..e31d35c12841 --- /dev/null +++ b/test/e2e/tests/transaction/incoming-transactions.spec.ts @@ -0,0 +1,199 @@ +import { Mockttp } from 'mockttp'; +import { loginWithoutBalanceValidation } from '../../page-objects/flows/login.flow'; +import { Driver } from '../../webdriver/driver'; +import { DEFAULT_FIXTURE_ACCOUNT } from '../../constants'; +import { withFixtures } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import { switchToNetworkFlow } from '../../page-objects/flows/network.flow'; +import HomePage from '../../page-objects/pages/home/homepage'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; + +const TIMESTAMP_MOCK = 1234; + +const RESPONSE_STANDARD_MOCK = { + hash: '0x1', + timestamp: new Date(TIMESTAMP_MOCK).toISOString(), + chainId: 1, + blockNumber: 1, + blockHash: '0x2', + gas: 1, + gasUsed: 1, + gasPrice: '1', + effectiveGasPrice: '1', + nonce: 1, + cumulativeGasUsed: 1, + methodId: null, + value: '1230000000000000000', + to: DEFAULT_FIXTURE_ACCOUNT.toLowerCase(), + from: '0x2', + isError: false, + valueTransfers: [], +}; + +const RESPONSE_STANDARD_2_MOCK = { + ...RESPONSE_STANDARD_MOCK, + hash: '0x2', + value: '2340000000000000000', + timestamp: new Date(TIMESTAMP_MOCK - 1).toISOString(), +}; + +const RESPONSE_TOKEN_TRANSFER_MOCK = { + ...RESPONSE_STANDARD_MOCK, + to: '0x2', + valueTransfers: [ + { + contractAddress: '0x123', + decimal: 18, + symbol: 'ABC', + from: '0x2', + to: DEFAULT_FIXTURE_ACCOUNT.toLowerCase(), + amount: '4560000000000000000', + }, + ], +}; + +const RESPONSE_OUTGOING_MOCK = { + ...RESPONSE_STANDARD_MOCK, + from: DEFAULT_FIXTURE_ACCOUNT.toLowerCase(), + to: '0x2', +}; + +async function mockAccountsApi( + mockServer: Mockttp, + { + cursor, + transactions, + }: { cursor?: string; transactions?: Record[] } = {}, +) { + return [ + await mockServer + .forGet( + `https://accounts.api.cx.metamask.io/v1/accounts/${DEFAULT_FIXTURE_ACCOUNT.toLowerCase()}/transactions`, + ) + .withQuery(cursor ? { cursor } : {}) + .thenCallback(() => ({ + statusCode: 200, + json: { + data: transactions ?? [ + RESPONSE_STANDARD_MOCK, + RESPONSE_STANDARD_2_MOCK, + ], + pageInfo: { hasNextPage: false }, + }, + })), + ]; +} + +describe('Incoming Transactions', function () { + it('adds standard incoming transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withIncomingTransactionsPreferences(true) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: mockAccountsApi, + }, + async ({ driver }: { driver: Driver }) => { + const activityList = await changeNetworkAndGoToActivity(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(2); + + await activityList.check_txAction('Receive', 1); + await activityList.check_txAmountInActivity('1.23 ETH', 1); + + await activityList.check_txAction('Receive', 2); + await activityList.check_txAmountInActivity('2.34 ETH', 2); + }, + ); + }); + + it('ignores token transfer transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withIncomingTransactionsPreferences(true) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: (server: Mockttp) => + mockAccountsApi(server, { + transactions: [ + RESPONSE_STANDARD_MOCK, + RESPONSE_TOKEN_TRANSFER_MOCK, + ], + }), + }, + async ({ driver }: { driver: Driver }) => { + const activityList = await changeNetworkAndGoToActivity(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(1); + }, + ); + }); + + it('ignores outgoing transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withIncomingTransactionsPreferences(true) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: (server: Mockttp) => + mockAccountsApi(server, { + transactions: [RESPONSE_STANDARD_MOCK, RESPONSE_OUTGOING_MOCK], + }), + }, + async ({ driver }: { driver: Driver }) => { + const activityList = await changeNetworkAndGoToActivity(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(1); + }, + ); + }); + + it('does nothing if preference disabled', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withIncomingTransactionsPreferences(false) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: mockAccountsApi, + }, + async ({ driver }: { driver: Driver }) => { + const activityList = await changeNetworkAndGoToActivity(driver); + await driver.delay(2000); + await activityList.check_noTxInActivity(); + }, + ); + }); + + it('ignores duplicate transactions already in state', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withIncomingTransactionsPreferences(true) + .withTransactions([ + { + hash: RESPONSE_STANDARD_MOCK.hash, + txParams: { from: RESPONSE_STANDARD_MOCK.from }, + }, + ]) + .build(), + title: this.test?.fullTitle(), + testSpecificMock: mockAccountsApi, + }, + async ({ driver }: { driver: Driver }) => { + const activityList = await changeNetworkAndGoToActivity(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(1); + }, + ); + }); +}); + +async function changeNetworkAndGoToActivity(driver: Driver) { + await loginWithoutBalanceValidation(driver); + await switchToNetworkFlow(driver, 'Ethereum Mainnet'); + + const homepage = new HomePage(driver); + await homepage.goToActivityList(); + + return new ActivityListPage(driver); +} diff --git a/test/e2e/tests/transaction/multiple-transactions.spec.js b/test/e2e/tests/transaction/multiple-transactions.spec.js index b7ad05b3a93d..b85937f5b6bd 100644 --- a/test/e2e/tests/transaction/multiple-transactions.spec.js +++ b/test/e2e/tests/transaction/multiple-transactions.spec.js @@ -11,127 +11,252 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('Multiple transactions', function () { - it('creates multiple queued transactions, then confirms', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // initiates a transaction from the dapp - await openDapp(driver); - // creates first transaction - await createDappTransaction(driver); - await driver.waitUntilXWindowHandles(3); - - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // creates second transaction - await createDappTransaction(driver); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // confirms second transaction - await driver.waitForSelector({ - text: 'Reject 2 transactions', - tag: 'a', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // wait for the "Reject 2 transactions" to disappear - await driver.assertElementNotPresent( - '.page-container__footer-secondary a', - ); - - // confirms first transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.delay(regularDelayMs); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(2)', - ); - - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', - ); - - assert.equal(confirmedTxes.length, 2); - }, - ); + describe('Old confirmation screens', function () { + it('creates multiple queued transactions, then confirms', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // initiates a transaction from the dapp + await openDapp(driver); + // creates first transaction + await createDappTransaction(driver); + await driver.waitUntilXWindowHandles(3); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // creates second transaction + await createDappTransaction(driver); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // confirms second transaction + await driver.waitForSelector({ + text: 'Reject 2 transactions', + tag: 'a', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for the "Reject 2 transactions" to disappear + await driver.assertElementNotPresent( + '.page-container__footer-secondary a', + ); + + // confirms first transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.delay(regularDelayMs); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(2)', + ); + + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + + assert.equal(confirmedTxes.length, 2); + }, + ); + }); + + it('creates multiple queued transactions, then rejects', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // initiates a transaction from the dapp + await openDapp(driver); + // creates first transaction + await createDappTransaction(driver); + await driver.waitUntilXWindowHandles(3); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // creates second transaction + await createDappTransaction(driver); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // rejects second transaction + await driver.waitForSelector({ + text: 'Reject 2 transactions', + tag: 'a', + }); + await driver.clickElement({ text: 'Reject', tag: 'button' }); + await driver.assertElementNotPresent('.loading-overlay__spinner'); + // rejects first transaction + await driver.clickElement({ text: 'Reject', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.delay(regularDelayMs); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + + const isTransactionListEmpty = + await driver.isElementPresentAndVisible( + '.transaction-list__empty-text', + ); + assert.equal(isTransactionListEmpty, true); + + // The previous isTransactionListEmpty wait already serves as the guard here for the assertElementNotPresent + await driver.assertElementNotPresent( + '.transaction-list__completed-transactions .activity-list-item', + ); + }, + ); + }); }); - it('creates multiple queued transactions, then rejects', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // initiates a transaction from the dapp - await openDapp(driver); - // creates first transaction - await createDappTransaction(driver); - await driver.waitUntilXWindowHandles(3); - - await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); - - // creates second transaction - await createDappTransaction(driver); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - // rejects second transaction - await driver.waitForSelector({ - text: 'Reject 2 transactions', - tag: 'a', - }); - await driver.clickElement({ text: 'Reject', tag: 'button' }); - await driver.assertElementNotPresent('.loading-overlay__spinner'); - // rejects first transaction - await driver.clickElement({ text: 'Reject', tag: 'button' }); - - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await driver.delay(regularDelayMs); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - - const isTransactionListEmpty = await driver.isElementPresentAndVisible( - '.transaction-list__empty-text', - ); - assert.equal(isTransactionListEmpty, true); - - // The previous isTransactionListEmpty wait already serves as the guard here for the assertElementNotPresent - await driver.assertElementNotPresent( - '.transaction-list__completed-transactions .activity-list-item', - ); - }, - ); + describe('Redesigned confirmation screens', function () { + it('creates multiple queued transactions, then confirms', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // initiates a transaction from the dapp + await openDapp(driver); + // creates first transaction + await createDappTransaction(driver); + await driver.waitUntilXWindowHandles(3); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // creates second transaction + await createDappTransaction(driver); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // confirms second transaction + await driver.waitForSelector({ + text: 'Reject all', + tag: 'button', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // wait for the "Reject 2 transactions" to disappear + await driver.assertElementNotPresent( + '.page-container__footer-secondary a', + ); + + // confirms first transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.delay(regularDelayMs); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(2)', + ); + + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + + assert.equal(confirmedTxes.length, 2); + }, + ); + }); + + it('creates multiple queued transactions, then rejects', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // initiates a transaction from the dapp + await openDapp(driver); + // creates first transaction + await createDappTransaction(driver); + await driver.waitUntilXWindowHandles(3); + + await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp); + + // creates second transaction + await createDappTransaction(driver); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // rejects second transaction + await driver.waitForSelector({ + text: 'Reject all', + tag: 'button', + }); + await driver.clickElement({ text: 'Cancel', tag: 'button' }); + await driver.assertElementNotPresent('.loading-overlay__spinner'); + // rejects first transaction + await driver.clickElement({ text: 'Cancel', tag: 'button' }); + + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await driver.delay(regularDelayMs); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + + const isTransactionListEmpty = + await driver.isElementPresentAndVisible( + '.transaction-list__empty-text', + ); + assert.equal(isTransactionListEmpty, true); + + // The previous isTransactionListEmpty wait already serves as the guard here for the assertElementNotPresent + await driver.assertElementNotPresent( + '.transaction-list__completed-transactions .activity-list-item', + ); + }, + ); + }); }); }); diff --git a/test/e2e/tests/transaction/navigate-transactions.spec.js b/test/e2e/tests/transaction/navigate-transactions.spec.js index 16e8f9374cb5..eb8465fb47a7 100644 --- a/test/e2e/tests/transaction/navigate-transactions.spec.js +++ b/test/e2e/tests/transaction/navigate-transactions.spec.js @@ -1,3 +1,6 @@ +const { + default: Confirmation, +} = require('../../page-objects/pages/confirmations/redesign/confirmation'); const { createDappTransaction, } = require('../../page-objects/flows/transaction'); @@ -19,169 +22,324 @@ const FixtureBuilder = require('../../fixture-builder'); const TRANSACTION_COUNT = 4; describe('Navigate transactions', function () { - it('should navigate the unapproved transactions', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesControllerTxSimulationsDisabled() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - dapp: true, - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createMultipleTransactions(driver, TRANSACTION_COUNT); - - const navigation = new ConfirmationNavigation(driver); - - await navigation.clickNextPage(); - await navigation.check_pageNumbers(2, 4); - - await navigation.clickNextPage(); - await navigation.check_pageNumbers(3, 4); - - await navigation.clickNextPage(); - await navigation.check_pageNumbers(4, 4); - - await navigation.clickFirstPage(); - await navigation.check_pageNumbers(1, 4); - - await navigation.clickLastPage(); - await navigation.check_pageNumbers(4, 4); - - await navigation.clickPreviousPage(); - await navigation.check_pageNumbers(3, 4); - - await navigation.clickPreviousPage(); - await navigation.check_pageNumbers(2, 4); - }, - ); - }); - - it('should add a transaction while the confirm page is in focus', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .withPreferencesControllerTxSimulationsDisabled() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createMultipleTransactions(driver, TRANSACTION_COUNT); - - const navigation = new ConfirmationNavigation(driver); - - await navigation.clickNextPage(); - await navigation.check_pageNumbers(2, 4); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - - // add transaction - await openDapp(driver); - await driver.clickElement({ text: 'Send', tag: 'button' }); - await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); - - await navigation.check_pageNumbers(2, 5); - }, - ); - }); - - it('should reject and remove an unapproved transaction', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesControllerTxSimulationsDisabled() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - dapp: true, - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createMultipleTransactions(driver, TRANSACTION_COUNT); - - // reject transaction - await driver.clickElement({ text: 'Reject', tag: 'button' }); - - const navigation = new ConfirmationNavigation(driver); - await navigation.check_pageNumbers(1, 3); - }, - ); - }); - - it('should confirm and remove an unapproved transaction', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesControllerTxSimulationsDisabled() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - dapp: true, - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createMultipleTransactions(driver, TRANSACTION_COUNT); - - // confirm transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - const navigation = new ConfirmationNavigation(driver); - await navigation.check_pageNumbers(1, 3); - }, - ); + describe('Old confirmation screens', function () { + it('should navigate the unapproved transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createMultipleTransactions(driver, TRANSACTION_COUNT); + + const navigation = new ConfirmationNavigation(driver); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(2, 4); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(3, 4); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(4, 4); + + await navigation.clickFirstPage(); + await navigation.check_pageNumbers(1, 4); + + await navigation.clickLastPage(); + await navigation.check_pageNumbers(4, 4); + + await navigation.clickPreviousPage(); + await navigation.check_pageNumbers(3, 4); + + await navigation.clickPreviousPage(); + await navigation.check_pageNumbers(2, 4); + }, + ); + }); + + it('should add a transaction while the confirm page is in focus', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withPreferencesControllerTxSimulationsDisabled() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createMultipleTransactions(driver, TRANSACTION_COUNT); + + const navigation = new ConfirmationNavigation(driver); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(2, 4); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + + // add transaction + await openDapp(driver); + await driver.clickElement({ text: 'Send', tag: 'button' }); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + await navigation.check_pageNumbers(2, 5); + }, + ); + }); + + it('should reject and remove an unapproved transaction', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createMultipleTransactions(driver, TRANSACTION_COUNT); + + // reject transaction + await driver.clickElement({ text: 'Reject', tag: 'button' }); + + const navigation = new ConfirmationNavigation(driver); + await navigation.check_pageNumbers(1, 3); + }, + ); + }); + + it('should confirm and remove an unapproved transaction', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createMultipleTransactions(driver, TRANSACTION_COUNT); + + // confirm transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + const navigation = new ConfirmationNavigation(driver); + await navigation.check_pageNumbers(1, 3); + }, + ); + }); + + it('should reject and remove all unapproved transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver, ganacheServer }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createMultipleTransactions(driver, TRANSACTION_COUNT); + + // reject transactions + await driver.clickElement({ text: 'Reject 4', tag: 'a' }); + await driver.clickElement({ text: 'Reject all', tag: 'button' }); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await locateAccountBalanceDOM(driver, ganacheServer); + }, + ); + }); }); - it('should reject and remove all unapproved transactions', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesControllerTxSimulationsDisabled() - .withPermissionControllerConnectedToTestDapp() - .build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - dapp: true, - }, - async ({ driver, ganacheServer }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createMultipleTransactions(driver, TRANSACTION_COUNT); - - // reject transactions - await driver.clickElement({ text: 'Reject 4', tag: 'a' }); - await driver.clickElement({ text: 'Reject all', tag: 'button' }); - - await driver.switchToWindowWithTitle( - WINDOW_TITLES.ExtensionInFullScreenView, - ); - await locateAccountBalanceDOM(driver, ganacheServer); - }, - ); + describe('Redesigned confirmation screens', function () { + it('should navigate the unapproved transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createRedesignedMultipleTransactions(driver, TRANSACTION_COUNT); + + const navigation = new Confirmation(driver); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(2, 4); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(3, 4); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(4, 4); + + await navigation.clickPreviousPage(); + await navigation.check_pageNumbers(3, 4); + + await navigation.clickPreviousPage(); + await navigation.check_pageNumbers(2, 4); + + await navigation.clickPreviousPage(); + await navigation.check_pageNumbers(1, 4); + }, + ); + }); + + it('should add a transaction while the confirm page is in focus', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withPreferencesControllerTxSimulationsDisabled() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createRedesignedMultipleTransactions(driver, TRANSACTION_COUNT); + + const navigation = new Confirmation(driver); + + await navigation.clickNextPage(); + await navigation.check_pageNumbers(2, 4); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + + // add transaction + await openDapp(driver); + await driver.clickElement({ text: 'Send', tag: 'button' }); + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + await navigation.check_pageNumbers(2, 5); + }, + ); + }); + + it('should reject and remove an unapproved transaction', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createRedesignedMultipleTransactions(driver, TRANSACTION_COUNT); + + // reject transaction + await driver.clickElement({ text: 'Cancel', tag: 'button' }); + + const navigation = new Confirmation(driver); + await navigation.check_pageNumbers(1, 3); + }, + ); + }); + + it('should confirm and remove an unapproved transaction', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createRedesignedMultipleTransactions(driver, TRANSACTION_COUNT); + + // confirm transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + const navigation = new Confirmation(driver); + await navigation.check_pageNumbers(1, 3); + }, + ); + }); + + it('should reject and remove all unapproved transactions', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerTxSimulationsDisabled() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + dapp: true, + }, + async ({ driver, ganacheServer }) => { + await unlockWallet(driver); + + await createRedesignedMultipleTransactions(driver, TRANSACTION_COUNT); + + // reject transactions + await driver.clickElement({ text: 'Reject all', tag: 'button' }); + + await driver.switchToWindowWithTitle( + WINDOW_TITLES.ExtensionInFullScreenView, + ); + await locateAccountBalanceDOM(driver, ganacheServer); + }, + ); + }); }); }); @@ -198,3 +356,17 @@ async function createMultipleTransactions(driver, count) { text: '0.001', }); } + +async function createRedesignedMultipleTransactions(driver, count) { + for (let i = 0; i < count; i++) { + await createDappTransaction(driver); + } + + await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog); + + // Wait until total amount is loaded to mitigate flakiness on reject + await driver.findElement({ + tag: 'h2', + text: '0.001 ETH', + }); +} diff --git a/test/e2e/tests/transaction/send-edit.spec.js b/test/e2e/tests/transaction/send-edit.spec.js index 8d19d6d071b1..2180d65b3ec4 100644 --- a/test/e2e/tests/transaction/send-edit.spec.js +++ b/test/e2e/tests/transaction/send-edit.spec.js @@ -13,168 +13,357 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('Editing Confirm Transaction', function () { - it('goes back from confirm page to edit eth value, gas price and gas limit', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().withConversionRateDisabled().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedTransactionConfirmations(driver); - await createInternalTransaction(driver); - - await driver.findElement({ - css: '.currency-display-component__text', - text: '1', - }); - - await driver.findElement({ - css: '.currency-display-component__text', - text: '1.000042', - }); - - await driver.clickElement( - '.confirm-page-container-header__back-button', - ); - - const inputAmount = await driver.findElement('input[placeholder="0"]'); - - await inputAmount.press(driver.Key.BACK_SPACE); - await inputAmount.press('2'); - await inputAmount.press('.'); - await inputAmount.press('2'); - - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - await driver.clickElement({ text: 'Edit', tag: 'button' }); - - const [gasLimitInput, gasPriceInput] = await driver.findElements( - 'input[type="number"]', - ); - await gasPriceInput.fill('8'); - await gasLimitInput.fill('100000'); - await driver.clickElement({ text: 'Save', tag: 'button' }); - - // has correct updated value on the confirm screen the transaction - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '0.0008', - }); - await driver.waitForSelector({ - css: '.currency-display-component__suffix', - text: 'ETH', - }); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '[data-testid="transaction-list-item-primary-currency"]', - ); - assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); - }, - ); + describe('Old confirmation screens', function () { + it('goes back from confirm page to edit eth value, gas price and gas limit', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().withConversionRateDisabled().build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedTransactionConfirmations(driver); + await createInternalTransaction(driver); + + await driver.findElement({ + css: '.currency-display-component__text', + text: '1', + }); + + await driver.findElement({ + css: '.currency-display-component__text', + text: '1.000042', + }); + + await driver.clickElement( + '.confirm-page-container-header__back-button', + ); + + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', + ); + + await inputAmount.press(driver.Key.BACK_SPACE); + await inputAmount.press('2'); + await inputAmount.press('.'); + await inputAmount.press('2'); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + await driver.clickElement({ text: 'Edit', tag: 'button' }); + + const [gasLimitInput, gasPriceInput] = await driver.findElements( + 'input[type="number"]', + ); + await gasPriceInput.fill('8'); + await gasLimitInput.fill('100000'); + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '0.0008', + }); + await driver.waitForSelector({ + css: '.currency-display-component__suffix', + text: 'ETH', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('goes back from confirm page to edit eth value, baseFee, priorityFee and gas limit - 1559 V2', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().withConversionRateDisabled().build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: '.currency-display-component__text', + text: '1', + }); + + await driver.findElement({ + css: '.currency-display-component__text', + text: '1.00043983', + }); + + await driver.clickElement( + '.confirm-page-container-header__back-button', + ); + + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', + ); + + await inputAmount.press(driver.Key.BACK_SPACE); + await inputAmount.press('2'); + await inputAmount.press('.'); + await inputAmount.press('2'); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // open gas fee popover + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + + await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); + + // enter max fee + await driver.fill('[data-testid="base-fee-input"]', '8'); + + // enter priority fee + await driver.fill('[data-testid="priority-fee-input"]', '8'); + + // edit gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.fill('[data-testid="gas-limit-input"]', '100000'); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '0.0008', + }); + await driver.waitForSelector({ + css: '.currency-display-component__suffix', + text: 'ETH', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); }); - it('goes back from confirm page to edit eth value, baseFee, priorityFee and gas limit - 1559 V2', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().withConversionRateDisabled().build(), - ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await createInternalTransaction(driver); - - await driver.findElement({ - css: '.currency-display-component__text', - text: '1', - }); - - await driver.findElement({ - css: '.currency-display-component__text', - text: '1.00043983', - }); - - await driver.clickElement( - '.confirm-page-container-header__back-button', - ); - - const inputAmount = await driver.findElement('input[placeholder="0"]'); - - await inputAmount.press(driver.Key.BACK_SPACE); - await inputAmount.press('2'); - await inputAmount.press('.'); - await inputAmount.press('2'); - - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // open gas fee popover - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - - await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); - - // enter max fee - await driver.fill('[data-testid="base-fee-input"]', '8'); - - // enter priority fee - await driver.fill('[data-testid="priority-fee-input"]', '8'); - - // edit gas limit - await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); - await driver.fill('[data-testid="gas-limit-input"]', '100000'); - - // save default values - await driver.clickElement('input[type="checkbox"]'); - - // Submit gas fee changes - await driver.clickElement({ text: 'Save', tag: 'button' }); - - // has correct updated value on the confirm screen the transaction - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '0.0008', - }); - await driver.waitForSelector({ - css: '.currency-display-component__suffix', - text: 'ETH', - }); - - // confirms the transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', - ); - return confirmedTxes.length === 1; - }, 10000); - - const txValues = await driver.findElements( - '[data-testid="transaction-list-item-primary-currency"]', - ); - assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); - }, - ); + describe('Redesigned confirmation screens', function () { + it('goes back from confirm page to edit eth value, gas price and gas limit', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().withConversionRateDisabled().build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: 'h2', + text: '1 ETH', + }); + + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0 ETH', + }); + + await driver.findElement({ + css: '[data-testid="native-currency"]', + text: '$0.07', + }); + + await driver.clickElement( + '[data-testid="wallet-initiated-header-back-button"]', + ); + + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', + ); + + await inputAmount.press(driver.Key.BACK_SPACE); + await inputAmount.press('2'); + await inputAmount.press('.'); + await inputAmount.press('2'); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + + const [gasLimitInput, gasPriceInput] = await driver.findElements( + 'input[type="number"]', + ); + await gasPriceInput.fill('8'); + await gasLimitInput.fill('100000'); + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0.0008 ETH', + }); + + await driver.findElement({ + css: '[data-testid="native-currency"]', + text: '$1.36', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); + + it('goes back from confirm page to edit eth value, baseFee, priorityFee and gas limit - 1559 V2', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().withConversionRateDisabled().build(), + ganacheOptions: generateGanacheOptions({ hardfork: 'london' }), + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + // await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await createInternalTransaction(driver); + + await driver.findElement({ + css: 'h2', + text: '1 ETH', + }); + + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0.0004 ETH', + }); + + await driver.findElement({ + css: '[data-testid="native-currency"]', + text: '$0.75', + }); + + await driver.clickElement( + '[data-testid="wallet-initiated-header-back-button"]', + ); + + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', + ); + + await inputAmount.press(driver.Key.BACK_SPACE); + await inputAmount.press('2'); + await inputAmount.press('.'); + await inputAmount.press('2'); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // open gas fee popover + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + + await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); + + // enter max fee + await driver.fill('[data-testid="base-fee-input"]', '8'); + + // enter priority fee + await driver.fill('[data-testid="priority-fee-input"]', '8'); + + // edit gas limit + await driver.clickElement('[data-testid="advanced-gas-fee-edit"]'); + await driver.fill('[data-testid="gas-limit-input"]', '100000'); + + // save default values + await driver.clickElement('input[type="checkbox"]'); + + // Submit gas fee changes + await driver.clickElement({ text: 'Save', tag: 'button' }); + + // has correct updated value on the confirm screen the transaction + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0.0008 ETH', + }); + + await driver.findElement({ + css: '[data-testid="native-currency"]', + text: '$1.36', + }); + + // confirms the transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '[data-testid="transaction-list-item-primary-currency"]', + ); + assert.equal(txValues.length, 1); + assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); }); }); diff --git a/test/e2e/tests/transaction/send-eth.spec.js b/test/e2e/tests/transaction/send-eth.spec.js index 9ee1b58dc170..badeb2d88540 100644 --- a/test/e2e/tests/transaction/send-eth.spec.js +++ b/test/e2e/tests/transaction/send-eth.spec.js @@ -14,244 +14,398 @@ const { const FixtureBuilder = require('../../fixture-builder'); describe('Send ETH', function () { - describe('from inside MetaMask', function () { - it('finds the transaction in the transactions list using default gas', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await openActionMenuAndStartSendFlow(driver); - - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); + describe('Old confirmation screens', function () { + describe('from inside MetaMask', function () { + /* eslint-disable-next-line mocha/max-top-level-suites */ + it('finds the transaction in the transactions list using advanced gas modal', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: defaultGanacheOptions, + defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); - const inputAmount = await driver.findElement( - 'input[placeholder="0"]', - ); + await tempToggleSettingRedesignedTransactionConfirmations(driver); - await inputAmount.press('1'); - await inputAmount.press('0'); - await inputAmount.press('0'); - await inputAmount.press('0'); + await driver.delay(1000); - await driver.findElement({ - css: '[data-testid="send-page-amount-error"]', - text: '. Insufficient funds.', - }); + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); - await inputAmount.press(driver.Key.BACK_SPACE); - await inputAmount.press(driver.Key.BACK_SPACE); - await inputAmount.press(driver.Key.BACK_SPACE); + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', + ); + await inputAmount.press('1'); - await driver.assertElementNotPresent('.send-v2__error-amount', { - waitAtLeastGuard: 100, // A waitAtLeastGuard of 100ms is the best choice here - }); + const inputValue = await inputAmount.getProperty('value'); + assert.equal(inputValue, '1'); - const amountMax = await driver.findClickableElement( - '[data-testid="max-clear-button"]', - ); - await amountMax.click(); + // Continue to next screen + await driver.clickElement({ text: 'Continue', tag: 'button' }); - let inputValue = await inputAmount.getProperty('value'); + await driver.delay(1000); + const transactionAmounts = await driver.findElements( + '.currency-display-component__text', + ); + const transactionAmount = transactionAmounts[0]; + assert.equal(await transactionAmount.getText(), '1'); - assert(Number(inputValue) > 24); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await amountMax.click(); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); - assert.equal(await inputAmount.isEnabled(), true); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1 ETH', + }); + }, + ); + }); - await inputAmount.fill('1'); + describe('from dapp using advanced gas controls', function () { + it('should display the correct gas price on the legacy transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // initiates a send from the dapp + await openDapp(driver); + await driver.clickElement({ text: 'Send', tag: 'button' }); + const windowHandles = await driver.waitUntilXWindowHandles(3); + const extension = windowHandles[0]; + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.assertElementNotPresent( + { text: 'Data', tag: 'li' }, + { findElementGuard: { text: 'Estimated gas fee', tag: 'h6' } }, // make sure the Dialog has loaded + ); + + await driver.clickElement({ text: 'Edit', tag: 'button' }); + await driver.waitForSelector({ + text: '0.00021 ETH', + }); + await driver.clickElement({ + text: 'Edit suggested gas fee', + tag: 'button', + }); + await driver.waitForSelector({ + text: 'Edit priority', + tag: 'header', + }); + await editGasFeeForm(driver, '21000', '100'); + await driver.waitForSelector({ + css: '.transaction-detail-item:nth-of-type(1) h6:nth-of-type(2)', + text: '0.0021 ETH', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindow(extension); + + // finds the transaction in the transactions list + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-0 ETH', + }); + + // the transaction has the expected gas price + await driver.clickElement( + '[data-testid="transaction-list-item-primary-currency"]', + ); + await driver.waitForSelector({ + css: '[data-testid="transaction-breakdown__gas-price"]', + text: '100', + }); + }, + ); + }); + + it('should display correct gas values for EIP-1559 transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: { + ...defaultGanacheOptions, + hardfork: 'london', + }, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // initiates a transaction from the dapp + await openDapp(driver); + await driver.clickElement({ + text: 'Create Token', + tag: 'button', + }); + const windowHandles = await driver.waitUntilXWindowHandles(3); + + const extension = windowHandles[0]; + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.assertElementNotPresent( + { text: 'Data', tag: 'li' }, + { findElementGuard: { text: 'Estimated fee' } }, // make sure the Dialog has loaded + ); + + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-custom"]', + ); + + const baseFeeInput = await driver.findElement( + '[data-testid="base-fee-input"]', + ); + await baseFeeInput.fill('25'); + const priorityFeeInput = await driver.findElement( + '[data-testid="priority-fee-input"]', + ); + await priorityFeeInput.fill('1'); + + await driver.clickElement({ text: 'Save', tag: 'button' }); + + await driver.waitForSelector({ + css: '.currency-display-component__text', + text: '0.0550741', + }); + + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindow(extension); + + // Identify the transaction in the transactions list + await driver.waitForSelector( + '[data-testid="eth-overview__primary-currency"]', + ); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-0 ETH', + }); + + // the transaction has the expected gas value + await driver.clickElement( + '[data-testid="transaction-list-item-primary-currency"]', + ); + + await driver.waitForSelector({ + xpath: "//div[contains(text(), 'Base fee')]", + }); + + const allFeeValues = await driver.findElements( + '.currency-display-component__text', + ); + + /** + * Below lines check that fee values are numeric. + * Because these values change for every e2e run, + * It's better to just check that the values are there and are numeric + */ + assert.equal(allFeeValues.length > 0, true); + + allFeeValues.forEach(async (feeValue) => { + assert.equal(/\d+\.?\d*/u.test(await feeValue.getText()), true); + }); + }, + ); + }); + }); - inputValue = await inputAmount.getProperty('value'); - assert.equal(inputValue, '1'); + describe('to non-contract address with data that matches ERC20 transfer data signature', function () { + it('renders the correct recipient on the confirmation screen', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .withPreferencesControllerPetnamesDisabled() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + await driver.assertElementNotPresent('.loading-overlay__spinner'); + const balance = await driver.findElement( + '[data-testid="eth-overview__primary-currency"]', + ); + assert.ok(/^[\d.]+\sETH$/u.test(await balance.getText())); + + await openActionMenuAndStartSendFlow(driver); + + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0xc427D562164062a23a5cFf596A4a3208e72Acd28', + ); + + await driver.fill( + 'textarea[placeholder="Optional', + '0xa9059cbb0000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C970000000000000000000000000000000000000000000000000000000000000000a', + ); + + await driver.findClickableElement({ + text: 'Continue', + tag: 'button', + }); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + await driver.findClickableElement( + '[data-testid="sender-to-recipient__name"]', + ); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + const recipientAddress = await driver.findElements({ + text: '0xc427D562164062a23a5cFf596A4a3208e72Acd28', + }); + + assert.equal(recipientAddress.length, 1); + }, + ); + }); + }); + }); + }); - // Continue to next screen - await driver.clickElement({ text: 'Continue', tag: 'button' }); + describe('Redesigned confirmation screens', function () { + describe('from inside MetaMask', function () { + it('finds the transaction in the transactions list using default gas', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await openActionMenuAndStartSendFlow(driver); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); - return confirmedTxes.length === 1; - }, 10000); - - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-1 ETH', - }); - }, - ); - }); - - /* eslint-disable-next-line mocha/max-top-level-suites */ - it('finds the transaction in the transactions list using advanced gas modal', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - await driver.delay(1000); - - await openActionMenuAndStartSendFlow(driver); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - ); - const inputAmount = await driver.findElement( - 'input[placeholder="0"]', - ); - await inputAmount.press('1'); + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', + ); - const inputValue = await inputAmount.getProperty('value'); - assert.equal(inputValue, '1'); + await inputAmount.press('1'); + await inputAmount.press('0'); + await inputAmount.press('0'); + await inputAmount.press('0'); - // Continue to next screen - await driver.clickElement({ text: 'Continue', tag: 'button' }); + await driver.findElement({ + css: '[data-testid="send-page-amount-error"]', + text: '. Insufficient funds.', + }); - await driver.delay(1000); - const transactionAmounts = await driver.findElements( - '.currency-display-component__text', - ); - const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '1'); + await inputAmount.press(driver.Key.BACK_SPACE); + await inputAmount.press(driver.Key.BACK_SPACE); + await inputAmount.press(driver.Key.BACK_SPACE); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.assertElementNotPresent('.send-v2__error-amount', { + waitAtLeastGuard: 100, // A waitAtLeastGuard of 100ms is the best choice here + }); - await driver.wait(async () => { - const confirmedTxes = await driver.findElements( - '.transaction-list__completed-transactions .activity-list-item', + const amountMax = await driver.findClickableElement( + '[data-testid="max-clear-button"]', ); - return confirmedTxes.length === 1; - }, 10000); - - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-1 ETH', - }); - }, - ); - }); + await amountMax.click(); - it('finds the transaction in the transactions list when sending to a Multisig Address', async function () { - const smartContract = SMART_CONTRACTS.MULTISIG; - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: { - ...defaultGanacheOptions, - hardfork: 'london', - }, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, contractRegistry, ganacheServer }) => { - const contractAddress = await contractRegistry.getContractAddress( - smartContract, - ); - await logInWithBalanceValidation(driver, ganacheServer); + let inputValue = await inputAmount.getProperty('value'); - // Wait for balance to load - await driver.delay(500); + assert(Number(inputValue) > 24); - await driver.clickElement('[data-testid="eth-overview-send"]'); - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - contractAddress, - ); + await amountMax.click(); - const inputAmount = await driver.findElement( - 'input[placeholder="0"]', - ); - await inputAmount.press('1'); - - // Continue to next screen - await driver.clickElement({ text: 'Continue', tag: 'button' }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); + assert.equal(await inputAmount.isEnabled(), true); - // Go back to home screen to check txn - const balance = await driver.findElement( - '[data-testid="eth-overview__primary-currency"]', - ); + await inputAmount.fill('1'); - assert.ok(/^[\d.]+\sETH$/u.test(await balance.getText())); + inputValue = await inputAmount.getProperty('value'); + assert.equal(inputValue, '1'); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); + // Continue to next screen + await driver.clickElement({ text: 'Continue', tag: 'button' }); - await driver.findElement( - '.transaction-list__completed-transactions .activity-list-item', - ); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); - // The previous findElement already serves as the guard here for the assertElementNotPresent - await driver.assertElementNotPresent( - '.transaction-status-label--failed', - ); - }, - ); - }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); - it('shows no error when cancel transaction when sending via QR code', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await driver.assertElementNotPresent('.loading-overlay__spinner'); - const balance = await driver.findElement( - '[data-testid="eth-overview__primary-currency"]', - ); - assert.ok(/^[\d.]+\sETH$/u.test(await balance.getText())); - - await openActionMenuAndStartSendFlow(driver); - // choose to scan via QR code - await driver.clickElement('[data-testid="ens-qr-scan-button"]'); - await driver.findVisibleElement('[data-testid="qr-scanner-modal"]'); - // cancel action will close the dialog and shut down camera initialization - await driver.waitForSelector({ - css: '.qr-scanner__error', - text: "We couldn't access your camera. Please give it another try.", - }); - await driver.clickElement({ text: 'Cancel', tag: 'button' }); - await driver.assertElementNotPresent( - '[data-testid="qr-scanner-modal"]', - ); - }, - ); - }); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1 ETH', + }); + }, + ); + }); - describe('from dapp using advanced gas controls', function () { - it('should display the correct gas price on the legacy transaction', async function () { + /* eslint-disable-next-line mocha/max-top-level-suites */ + it('finds the transaction in the transactions list using advanced gas modal', async function () { await withFixtures( { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), + fixtures: new FixtureBuilder().build(), ganacheOptions: defaultGanacheOptions, defaultGanacheOptions, title: this.test.fullTitle(), @@ -259,191 +413,113 @@ describe('Send ETH', function () { async ({ driver }) => { await unlockWallet(driver); - await tempToggleSettingRedesignedTransactionConfirmations(driver); + await driver.delay(1000); - // initiates a send from the dapp - await openDapp(driver); - await driver.clickElement({ text: 'Send', tag: 'button' }); - const windowHandles = await driver.waitUntilXWindowHandles(3); - const extension = windowHandles[0]; - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, + await openActionMenuAndStartSendFlow(driver); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); - await driver.assertElementNotPresent( - { text: 'Data', tag: 'li' }, - { findElementGuard: { text: 'Estimated gas fee', tag: 'h6' } }, // make sure the Dialog has loaded + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', ); + await inputAmount.press('1'); - await driver.clickElement({ text: 'Edit', tag: 'button' }); - await driver.waitForSelector({ - text: '0.00021 ETH', - }); - await driver.clickElement({ - text: 'Edit suggested gas fee', - tag: 'button', - }); - await driver.waitForSelector({ - text: 'Edit priority', - tag: 'header', - }); - await editGasFeeForm(driver, '21000', '100'); - await driver.waitForSelector({ - css: '.transaction-detail-item:nth-of-type(1) h6:nth-of-type(2)', - text: '0.0021 ETH', + const inputValue = await inputAmount.getProperty('value'); + assert.equal(inputValue, '1'); + + // Continue to next screen + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + await driver.delay(1000); + + // Transaction Amount + await driver.findElement({ + css: 'h2', + text: '1 ETH', }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindow(extension); - // finds the transaction in the transactions list - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-0 ETH', - }); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .activity-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); - // the transaction has the expected gas price - await driver.clickElement( - '[data-testid="transaction-list-item-primary-currency"]', - ); await driver.waitForSelector({ - css: '[data-testid="transaction-breakdown__gas-price"]', - text: '100', + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-1 ETH', }); }, ); }); - it('should display correct gas values for EIP-1559 transaction', async function () { + it('finds the transaction in the transactions list when sending to a Multisig Address', async function () { + const smartContract = SMART_CONTRACTS.MULTISIG; await withFixtures( { - dapp: true, - fixtures: new FixtureBuilder() - .withPermissionControllerConnectedToTestDapp() - .build(), + fixtures: new FixtureBuilder().build(), ganacheOptions: { ...defaultGanacheOptions, hardfork: 'london', }, + smartContract, title: this.test.fullTitle(), }, - async ({ driver }) => { - await unlockWallet(driver); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // initiates a transaction from the dapp - await openDapp(driver); - await driver.clickElement({ text: 'Create Token', tag: 'button' }); - const windowHandles = await driver.waitUntilXWindowHandles(3); - - const extension = windowHandles[0]; - await driver.switchToWindowWithTitle( - WINDOW_TITLES.Dialog, - windowHandles, - ); + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); - await driver.assertElementNotPresent( - { text: 'Data', tag: 'li' }, - { findElementGuard: { text: 'Estimated fee' } }, // make sure the Dialog has loaded - ); + // Wait for balance to load + await driver.delay(500); - await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); - await driver.clickElement( - '[data-testid="edit-gas-fee-item-custom"]', - ); + await driver.clickElement('[data-testid="eth-overview-send"]'); + await driver.clickElement({ text: 'Account 1', tag: 'button' }); - const baseFeeInput = await driver.findElement( - '[data-testid="base-fee-input"]', - ); - await baseFeeInput.fill('25'); - const priorityFeeInput = await driver.findElement( - '[data-testid="priority-fee-input"]', + const inputAmount = await driver.findElement( + 'input[placeholder="0"]', ); - await priorityFeeInput.fill('1'); - - await driver.clickElement({ text: 'Save', tag: 'button' }); - - await driver.waitForSelector({ - css: '.currency-display-component__text', - text: '0.0550741', - }); + await inputAmount.sendKeys('1'); + // Continue to next screen + await driver.clickElement({ text: 'Continue', tag: 'button' }); await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindow(extension); - // Identify the transaction in the transactions list - await driver.waitForSelector( + // Go back to home screen to check txn + const balance = await driver.findElement( '[data-testid="eth-overview__primary-currency"]', ); + assert.ok(/^[\d.]+\sETH$/u.test(await balance.getText())); + await driver.clickElement( '[data-testid="account-overview__activity-tab"]', ); - await driver.waitForSelector( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - await driver.waitForSelector({ - css: '[data-testid="transaction-list-item-primary-currency"]', - text: '-0 ETH', - }); - // the transaction has the expected gas value - await driver.clickElement( - '[data-testid="transaction-list-item-primary-currency"]', + await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item', ); - await driver.waitForSelector({ - xpath: "//div[contains(text(), 'Base fee')]", - }); - - const allFeeValues = await driver.findElements( - '.currency-display-component__text', + // The previous findElement already serves as the guard here for the assertElementNotPresent + await driver.assertElementNotPresent( + '.transaction-status-label--failed', ); - - /** - * Below lines check that fee values are numeric. - * Because these values change for every e2e run, - * It's better to just check that the values are there and are numeric - */ - assert.equal(allFeeValues.length > 0, true); - - allFeeValues.forEach(async (feeValue) => { - assert.equal(/\d+\.?\d*/u.test(await feeValue.getText()), true); - }); }, ); }); - }); - describe('to non-contract address with data that matches ERC20 transfer data signature', function () { - it('renders the correct recipient on the confirmation screen', async function () { + it('shows no error when cancel transaction when sending via QR code', async function () { await withFixtures( { - fixtures: new FixtureBuilder() - .withPreferencesController({ - featureFlags: { - sendHexData: true, - }, - }) - .withPreferencesControllerPetnamesDisabled() - .build(), + fixtures: new FixtureBuilder().build(), ganacheOptions: defaultGanacheOptions, title: this.test.fullTitle(), }, async ({ driver }) => { await unlockWallet(driver); - await tempToggleSettingRedesignedTransactionConfirmations(driver); - await driver.assertElementNotPresent('.loading-overlay__spinner'); const balance = await driver.findElement( '[data-testid="eth-overview__primary-currency"]', @@ -451,37 +527,254 @@ describe('Send ETH', function () { assert.ok(/^[\d.]+\sETH$/u.test(await balance.getText())); await openActionMenuAndStartSendFlow(driver); - - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - '0xc427D562164062a23a5cFf596A4a3208e72Acd28', + // choose to scan via QR code + await driver.clickElement('[data-testid="ens-qr-scan-button"]'); + await driver.findVisibleElement('[data-testid="qr-scanner-modal"]'); + // cancel action will close the dialog and shut down camera initialization + await driver.waitForSelector({ + css: '.qr-scanner__error', + text: "We couldn't access your camera. Please give it another try.", + }); + await driver.clickElement({ text: 'Cancel', tag: 'button' }); + await driver.assertElementNotPresent( + '[data-testid="qr-scanner-modal"]', ); + }, + ); + }); - await driver.fill( - 'textarea[placeholder="Optional', - '0xa9059cbb0000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C970000000000000000000000000000000000000000000000000000000000000000a', - ); + describe('from dapp using advanced gas controls', function () { + it('should display the correct gas price on the legacy transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: defaultGanacheOptions, + defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // initiates a send from the dapp + await openDapp(driver); + await driver.clickElement({ text: 'Send', tag: 'button' }); + const windowHandles = await driver.waitUntilXWindowHandles(3); + const extension = windowHandles[0]; + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.waitForSelector({ + text: '0.00021 ETH', + }); + await driver.clickElement({ + text: 'Edit suggested gas fee', + tag: 'button', + }); + await driver.waitForSelector({ + text: 'Edit priority', + tag: 'header', + }); + await editGasFeeForm(driver, '21000', '100'); + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0.0021 ETH', + }); + + await driver.findElement({ + css: '[data-testid="native-currency"]', + text: '$3.57', + }); + + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindow(extension); + + // finds the transaction in the transactions list + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-0 ETH', + }); + + // the transaction has the expected gas price + await driver.clickElement( + '[data-testid="transaction-list-item-primary-currency"]', + ); + await driver.waitForSelector({ + css: '[data-testid="transaction-breakdown__gas-price"]', + text: '100', + }); + }, + ); + }); + + it('should display correct gas values for EIP-1559 transaction', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions: { + ...defaultGanacheOptions, + hardfork: 'london', + }, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); + + // initiates a transaction from the dapp + await openDapp(driver); + await driver.clickElement({ + text: 'Create Token', + tag: 'button', + }); + const windowHandles = await driver.waitUntilXWindowHandles(3); + + const extension = windowHandles[0]; + await driver.switchToWindowWithTitle( + WINDOW_TITLES.Dialog, + windowHandles, + ); + + await driver.clickElement('[data-testid="edit-gas-fee-icon"]'); + await driver.clickElement( + '[data-testid="edit-gas-fee-item-custom"]', + ); + + const baseFeeInput = await driver.findElement( + '[data-testid="base-fee-input"]', + ); + await baseFeeInput.fill('25'); + const priorityFeeInput = await driver.findElement( + '[data-testid="priority-fee-input"]', + ); + await priorityFeeInput.fill('1'); + + await driver.clickElement({ text: 'Save', tag: 'button' }); + + await driver.findElement({ + css: '[data-testid="first-gas-field"]', + text: '0.045 ETH', + }); + + await driver.findElement({ + css: '[data-testid="native-currency"]', + text: '$76.57', + }); + + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindow(extension); + + // Identify the transaction in the transactions list + await driver.waitForSelector( + '[data-testid="eth-overview__primary-currency"]', + ); + + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.waitForSelector( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await driver.waitForSelector({ + css: '[data-testid="transaction-list-item-primary-currency"]', + text: '-0 ETH', + }); + + // the transaction has the expected gas value + await driver.clickElement( + '[data-testid="transaction-list-item-primary-currency"]', + ); + + await driver.waitForSelector({ + xpath: "//div[contains(text(), 'Base fee')]", + }); + + const allFeeValues = await driver.findElements( + '.currency-display-component__text', + ); + + /** + * Below lines check that fee values are numeric. + * Because these values change for every e2e run, + * It's better to just check that the values are there and are numeric + */ + assert.equal(allFeeValues.length > 0, true); + + allFeeValues.forEach(async (feeValue) => { + assert.equal(/\d+\.?\d*/u.test(await feeValue.getText()), true); + }); + }, + ); + }); + }); - await driver.findClickableElement({ - text: 'Continue', - tag: 'button', - }); - await driver.clickElement({ text: 'Continue', tag: 'button' }); + describe('to non-contract address with data that matches ERC20 transfer data signature', function () { + it('renders the correct recipient on the confirmation screen', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .withPreferencesControllerPetnamesDisabled() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver }) => { + await unlockWallet(driver); - await driver.findClickableElement( - '[data-testid="sender-to-recipient__name"]', - ); - await driver.clickElement( - '[data-testid="sender-to-recipient__name"]', - ); + await driver.assertElementNotPresent('.loading-overlay__spinner'); + const balance = await driver.findElement( + '[data-testid="eth-overview__primary-currency"]', + ); + assert.ok(/^[\d.]+\sETH$/u.test(await balance.getText())); - const recipientAddress = await driver.findElements({ - text: '0xc427D562164062a23a5cFf596A4a3208e72Acd28', - }); + await openActionMenuAndStartSendFlow(driver); - assert.equal(recipientAddress.length, 1); - }, - ); + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + '0xc427D562164062a23a5cFf596A4a3208e72Acd28', + ); + + await driver.fill( + 'textarea[placeholder="Optional', + '0xa9059cbb0000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C970000000000000000000000000000000000000000000000000000000000000000a', + ); + + await driver.findClickableElement({ + text: 'Continue', + tag: 'button', + }); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + await driver.clickElement('[data-testid="recipient-address"]'); + + const recipientAddress = await driver.findElements({ + text: '0xc427D562164062a23a5cFf596A4a3208e72Acd28', + }); + + assert.equal(recipientAddress.length, 1); + }, + ); + }); }); }); }); diff --git a/test/e2e/tests/transaction/send-hex-address.spec.js b/test/e2e/tests/transaction/send-hex-address.spec.js index b6ad969c6735..64522c706f6b 100644 --- a/test/e2e/tests/transaction/send-hex-address.spec.js +++ b/test/e2e/tests/transaction/send-hex-address.spec.js @@ -11,228 +11,377 @@ const FixtureBuilder = require('../../fixture-builder'); const hexPrefixedAddress = '0x2f318C334780961FB129D2a6c30D0763d9a5C970'; const nonHexPrefixedAddress = hexPrefixedAddress.substring(2); -describe('Send ETH to a 40 character hexadecimal address', function () { - it('should ensure the address is prefixed with 0x when pasted and should send ETH to a valid hexadecimal address', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesControllerPetnamesDisabled() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - // Send ETH - await openActionMenuAndStartSendFlow(driver); - // Paste address without hex prefix - await driver.pasteIntoField( - 'input[placeholder="Enter public address (0x) or domain name"]', - nonHexPrefixedAddress, - ); - await driver.findElement({ - css: '.ens-input__selected-input__title', - text: '0x2f318...5C970', - }); - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // Confirm transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - const sendTransactionListItem = await driver.findElement( - '.transaction-list__completed-transactions .activity-list-item', - ); - await sendTransactionListItem.click(); - await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('[data-testid="sender-to-recipient__name"]'); - - // Verify address in activity log - await driver.findElement({ - css: '.nickname-popover__public-address', - text: hexPrefixedAddress, - }); - }, - ); - }); - it('should ensure the address is prefixed with 0x when typed and should send ETH to a valid hexadecimal address', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder() - .withPreferencesControllerPetnamesDisabled() - .build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - // Send ETH - await openActionMenuAndStartSendFlow(driver); - // Type address without hex prefix - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - nonHexPrefixedAddress, - ); - await driver.findElement({ - css: '.ens-input__selected-input__title', - text: '0x2f318...5C970', - }); - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // Confirm transaction - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.clickElement( - '.transaction-list__completed-transactions .activity-list-item', - ); - await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('[data-testid="sender-to-recipient__name"]'); - - // Verify address in activity log - await driver.findElement({ - css: '.nickname-popover__public-address', - text: hexPrefixedAddress, - }); - }, - ); +describe('Old confirmation screens', function () { + describe('Send ERC20 to a 40 character hexadecimal address', function () { + const smartContract = SMART_CONTRACTS.HST; + + it('should ensure the address is prefixed with 0x when pasted and should send TST to a valid hexadecimal address', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPreferencesControllerPetnamesDisabled() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Send TST + await driver.clickElement( + '[data-testid="account-overview__asset-tab"]', + ); + await driver.clickElement( + '[data-testid="multichain-token-list-button"]', + ); + await driver.clickElement('[data-testid="coin-overview-send"]'); + // Paste address without hex prefix + await driver.pasteIntoField( + 'input[placeholder="Enter public address (0x) or domain name"]', + nonHexPrefixedAddress, + ); + await driver.findElement({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // Confirm transaction + await driver.findElement({ + css: '.confirm-page-container-summary__title', + text: '0', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + const sendTransactionListItem = await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await sendTransactionListItem.click(); + await driver.clickElement({ text: 'Activity log', tag: 'summary' }); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + // Verify address in activity log + await driver.findElement({ + css: '.nickname-popover__public-address', + text: hexPrefixedAddress, + }); + }, + ); + }); + + it('should ensure the address is prefixed with 0x when typed and should send TST to a valid hexadecimal address', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPreferencesControllerPetnamesDisabled() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + await tempToggleSettingRedesignedTransactionConfirmations(driver); + + // Send TST + await driver.clickElement( + '[data-testid="account-overview__asset-tab"]', + ); + await driver.clickElement( + '[data-testid="multichain-token-list-button"]', + ); + await driver.clickElement('[data-testid="coin-overview-send"]'); + + // Type address without hex prefix + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + nonHexPrefixedAddress, + ); + await driver.findElement({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // Confirm transaction + await driver.findElement({ + css: '.confirm-page-container-summary__title', + text: '0', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + const sendTransactionListItem = await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await sendTransactionListItem.click(); + await driver.clickElement({ text: 'Activity log', tag: 'summary' }); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + // Verify address in activity log + await driver.findElement({ + css: '.nickname-popover__public-address', + text: hexPrefixedAddress, + }); + }, + ); + }); }); }); -describe('Send ERC20 to a 40 character hexadecimal address', function () { - const smartContract = SMART_CONTRACTS.HST; - - it('should ensure the address is prefixed with 0x when pasted and should send TST to a valid hexadecimal address', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPreferencesControllerPetnamesDisabled() - .withTokensControllerERC20() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Send TST - await driver.clickElement( - '[data-testid="account-overview__asset-tab"]', - ); - await driver.clickElement( - '[data-testid="multichain-token-list-button"]', - ); - await driver.clickElement('[data-testid="coin-overview-send"]'); - // Paste address without hex prefix - await driver.pasteIntoField( - 'input[placeholder="Enter public address (0x) or domain name"]', - nonHexPrefixedAddress, - ); - await driver.findElement({ - css: '.ens-input__selected-input__title', - text: '0x2f318...5C970', - }); - - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // Confirm transaction - await driver.findElement({ - css: '.confirm-page-container-summary__title', - text: '0', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.findElement( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - const sendTransactionListItem = await driver.findElement( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - await sendTransactionListItem.click(); - await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('[data-testid="sender-to-recipient__name"]'); - - // Verify address in activity log - await driver.findElement({ - css: '.nickname-popover__public-address', - text: hexPrefixedAddress, - }); - }, - ); +describe('Redesigned confirmation screens', function () { + describe('Send ETH to a 40 character hexadecimal address', function () { + it('should ensure the address is prefixed with 0x when pasted and should send ETH to a valid hexadecimal address', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerPetnamesDisabled() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Send ETH + await openActionMenuAndStartSendFlow(driver); + // Paste address without hex prefix + await driver.pasteIntoField( + 'input[placeholder="Enter public address (0x) or domain name"]', + nonHexPrefixedAddress, + ); + await driver.findElement({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // Confirm transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + const sendTransactionListItem = await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item', + ); + await sendTransactionListItem.click(); + await driver.clickElement({ text: 'Activity log', tag: 'summary' }); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + // Verify address in activity log + await driver.findElement({ + css: '.nickname-popover__public-address', + text: hexPrefixedAddress, + }); + }, + ); + }); + + it('should ensure the address is prefixed with 0x when typed and should send ETH to a valid hexadecimal address', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withPreferencesControllerPetnamesDisabled() + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Send ETH + await openActionMenuAndStartSendFlow(driver); + // Type address without hex prefix + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + nonHexPrefixedAddress, + ); + await driver.findElement({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // Confirm transaction + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.clickElement( + '.transaction-list__completed-transactions .activity-list-item', + ); + await driver.clickElement({ text: 'Activity log', tag: 'summary' }); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + // Verify address in activity log + await driver.findElement({ + css: '.nickname-popover__public-address', + text: hexPrefixedAddress, + }); + }, + ); + }); }); - it('should ensure the address is prefixed with 0x when typed and should send TST to a valid hexadecimal address', async function () { - await withFixtures( - { - dapp: true, - fixtures: new FixtureBuilder() - .withPreferencesControllerPetnamesDisabled() - .withTokensControllerERC20() - .build(), - ganacheOptions: defaultGanacheOptions, - smartContract, - title: this.test.fullTitle(), - }, - async ({ driver, ganacheServer }) => { - await logInWithBalanceValidation(driver, ganacheServer); - - await tempToggleSettingRedesignedTransactionConfirmations(driver); - - // Send TST - await driver.clickElement( - '[data-testid="account-overview__asset-tab"]', - ); - await driver.clickElement( - '[data-testid="multichain-token-list-button"]', - ); - await driver.clickElement('[data-testid="coin-overview-send"]'); - - // Type address without hex prefix - await driver.fill( - 'input[placeholder="Enter public address (0x) or domain name"]', - nonHexPrefixedAddress, - ); - await driver.findElement({ - css: '.ens-input__selected-input__title', - text: '0x2f318...5C970', - }); - - await driver.clickElement({ text: 'Continue', tag: 'button' }); - - // Confirm transaction - await driver.findElement({ - css: '.confirm-page-container-summary__title', - text: '0', - }); - await driver.clickElement({ text: 'Confirm', tag: 'button' }); - await driver.clickElement( - '[data-testid="account-overview__activity-tab"]', - ); - await driver.findElement( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - const sendTransactionListItem = await driver.findElement( - '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', - ); - await sendTransactionListItem.click(); - await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('[data-testid="sender-to-recipient__name"]'); - - // Verify address in activity log - await driver.findElement({ - css: '.nickname-popover__public-address', - text: hexPrefixedAddress, - }); - }, - ); + + describe('Send ERC20 to a 40 character hexadecimal address', function () { + const smartContract = SMART_CONTRACTS.HST; + + it('should ensure the address is prefixed with 0x when pasted and should send TST to a valid hexadecimal address', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPreferencesControllerPetnamesDisabled() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Send TST + await driver.clickElement( + '[data-testid="account-overview__asset-tab"]', + ); + await driver.clickElement( + '[data-testid="multichain-token-list-button"]', + ); + await driver.clickElement('[data-testid="coin-overview-send"]'); + // Paste address without hex prefix + await driver.pasteIntoField( + 'input[placeholder="Enter public address (0x) or domain name"]', + nonHexPrefixedAddress, + ); + await driver.findElement({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // Confirm transaction + await driver.findElement({ + css: 'h2', + text: '0 ETH', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + const sendTransactionListItem = await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await sendTransactionListItem.click(); + await driver.clickElement({ text: 'Activity log', tag: 'summary' }); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + // Verify address in activity log + await driver.findElement({ + css: '.nickname-popover__public-address', + text: hexPrefixedAddress, + }); + }, + ); + }); + + it('should ensure the address is prefixed with 0x when typed and should send TST to a valid hexadecimal address', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPreferencesControllerPetnamesDisabled() + .withTokensControllerERC20() + .build(), + ganacheOptions: defaultGanacheOptions, + smartContract, + title: this.test.fullTitle(), + }, + async ({ driver, ganacheServer }) => { + await logInWithBalanceValidation(driver, ganacheServer); + + // Send TST + await driver.clickElement( + '[data-testid="account-overview__asset-tab"]', + ); + await driver.clickElement( + '[data-testid="multichain-token-list-button"]', + ); + await driver.clickElement('[data-testid="coin-overview-send"]'); + + // Type address without hex prefix + await driver.fill( + 'input[placeholder="Enter public address (0x) or domain name"]', + nonHexPrefixedAddress, + ); + await driver.findElement({ + css: '.ens-input__selected-input__title', + text: '0x2f318...5C970', + }); + + await driver.clickElement({ text: 'Continue', tag: 'button' }); + + // Confirm transaction + await driver.findElement({ + css: 'h2', + text: '0 ETH', + }); + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.clickElement( + '[data-testid="account-overview__activity-tab"]', + ); + await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + const sendTransactionListItem = await driver.findElement( + '.transaction-list__completed-transactions .activity-list-item:nth-of-type(1)', + ); + await sendTransactionListItem.click(); + await driver.clickElement({ text: 'Activity log', tag: 'summary' }); + await driver.clickElement( + '[data-testid="sender-to-recipient__name"]', + ); + + // Verify address in activity log + await driver.findElement({ + css: '.nickname-popover__public-address', + text: hexPrefixedAddress, + }); + }, + ); + }); }); }); diff --git a/test/e2e/tests/transaction/simple-send.spec.ts b/test/e2e/tests/transaction/simple-send.spec.ts index 7d2f4835cdca..9ac091744974 100644 --- a/test/e2e/tests/transaction/simple-send.spec.ts +++ b/test/e2e/tests/transaction/simple-send.spec.ts @@ -9,7 +9,8 @@ import { import FixtureBuilder from '../../fixture-builder'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; import { sendTransactionToAddress } from '../../page-objects/flows/send-transaction.flow'; -import HomePage from '../../page-objects/pages/homepage'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; +import HomePage from '../../page-objects/pages/home/homepage'; describe('Simple send eth', function (this: Suite) { it('can send a simple transaction from one account to another', async function () { @@ -39,8 +40,9 @@ describe('Simple send eth', function (this: Suite) { }); const homePage = new HomePage(driver); await homePage.check_pageIsLoaded(); - await homePage.check_confirmedTxNumberDisplayedInActivity(); - await homePage.check_txAmountInActivity(); + const activityList = new ActivityListPage(driver); + await activityList.check_confirmedTxNumberDisplayedInActivity(); + await activityList.check_txAmountInActivity(); }, ); }); diff --git a/test/e2e/tests/transaction/stuck-approved-transaction.spec.ts b/test/e2e/tests/transaction/stuck-approved-transaction.spec.ts index 7afedc3187dd..5e2665627910 100644 --- a/test/e2e/tests/transaction/stuck-approved-transaction.spec.ts +++ b/test/e2e/tests/transaction/stuck-approved-transaction.spec.ts @@ -4,7 +4,8 @@ import FixtureBuilder from '../../fixture-builder'; import { Driver } from '../../webdriver/driver'; import { Ganache } from '../../seeder/ganache'; import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; -import HomePage from '../../page-objects/pages/homepage'; +import ActivityListPage from '../../page-objects/pages/home/activity-list'; +import HomePage from '../../page-objects/pages/home/homepage'; describe('Editing Confirm Transaction', function (this: Suite) { it('approves a transaction stuck in approved state on boot', async function () { @@ -25,10 +26,10 @@ describe('Editing Confirm Transaction', function (this: Suite) { }) => { await loginWithBalanceValidation(driver, ganacheServer); - const homePage = new HomePage(driver); - await homePage.goToActivityList(); - await homePage.check_completedTxNumberDisplayedInActivity(); - await homePage.check_txAmountInActivity(); + new HomePage(driver).goToActivityList(); + const activityList = new ActivityListPage(driver); + await activityList.check_completedTxNumberDisplayedInActivity(); + await activityList.check_txAmountInActivity(); }, ); }); diff --git a/test/e2e/vault-decryption-chrome.spec.ts b/test/e2e/vault-decryption-chrome.spec.ts index 939494b00a60..110b7726a614 100644 --- a/test/e2e/vault-decryption-chrome.spec.ts +++ b/test/e2e/vault-decryption-chrome.spec.ts @@ -5,7 +5,7 @@ import level from 'level'; import { Driver } from './webdriver/driver'; import { withFixtures, WALLET_PASSWORD } from './helpers'; import HeaderNavbar from './page-objects/pages/header-navbar'; -import HomePage from './page-objects/pages/homepage'; +import HomePage from './page-objects/pages/home/homepage'; import PrivacySettings from './page-objects/pages/settings/privacy-settings'; import SettingsPage from './page-objects/pages/settings/settings-page'; import VaultDecryptorPage from './page-objects/pages/vault-decryptor-page'; diff --git a/test/e2e/webdriver/driver.js b/test/e2e/webdriver/driver.js index b0a335eb0d64..c16ef3999490 100644 --- a/test/e2e/webdriver/driver.js +++ b/test/e2e/webdriver/driver.js @@ -499,13 +499,14 @@ class Driver { * and returns a reference to the first matching element. * * @param {string | object} rawLocator - Element locator + * @param {number} timeout - Timeout in milliseconds * @returns {Promise} A promise that resolves to the found element. */ - async findElement(rawLocator) { + async findElement(rawLocator, timeout = this.timeout) { const locator = this.buildLocator(rawLocator); const element = await this.driver.wait( until.elementLocated(locator), - this.timeout, + timeout, ); return wrapElementWithAPI(element, this); } @@ -540,13 +541,14 @@ class Driver { * Finds a clickable element on the page using the given locator. * * @param {string | object} rawLocator - Element locator + * @param {number} timeout - Timeout in milliseconds * @returns {Promise} A promise that resolves to the found clickable element. */ - async findClickableElement(rawLocator) { - const element = await this.findElement(rawLocator); + async findClickableElement(rawLocator, timeout = this.timeout) { + const element = await this.findElement(rawLocator, timeout); await Promise.all([ - this.driver.wait(until.elementIsVisible(element), this.timeout), - this.driver.wait(until.elementIsEnabled(element), this.timeout), + this.driver.wait(until.elementIsVisible(element), timeout), + this.driver.wait(until.elementIsEnabled(element), timeout), ]); return wrapElementWithAPI(element, this); } diff --git a/test/integration/confirmations/transactions/alerts.test.tsx b/test/integration/confirmations/transactions/alerts.test.tsx index fe78f3152bfe..b21a7dbb679c 100644 --- a/test/integration/confirmations/transactions/alerts.test.tsx +++ b/test/integration/confirmations/transactions/alerts.test.tsx @@ -362,7 +362,7 @@ describe('Contract Interaction Confirmation Alerts', () => { expect( await screen.findByTestId('alert-modal__selected-alert'), ).toHaveTextContent( - 'This transaction won’t go through until a previous transaction is complete. Learn how to cancel or speed up a transaction.', + "This transaction won't go through until a previous transaction is complete. Learn how to cancel or speed up a transaction.", ); }); diff --git a/test/integration/confirmations/transactions/erc721-approve.test.tsx b/test/integration/confirmations/transactions/erc721-approve.test.tsx index c158717cc9c9..4f211576e6cd 100644 --- a/test/integration/confirmations/transactions/erc721-approve.test.tsx +++ b/test/integration/confirmations/transactions/erc721-approve.test.tsx @@ -163,7 +163,9 @@ describe('ERC721 Approve Confirmation', () => { }); expect( - await screen.findByText(tEn('confirmTitleApproveTransaction') as string), + await screen.findByText( + tEn('confirmTitleApproveTransactionNFT') as string, + ), ).toBeInTheDocument(); expect( await screen.findByText( diff --git a/test/integration/data/integration-init-state.json b/test/integration/data/integration-init-state.json index 0c3853035080..3d3580dc12ca 100644 --- a/test/integration/data/integration-init-state.json +++ b/test/integration/data/integration-init-state.json @@ -801,6 +801,7 @@ "showProductTour": false, "showTestnetMessageInDropdown": true, "signatureSecurityAlertResponses": {}, + "slides": [], "smartTransactionsState": { "fees": {}, "liveness": true, @@ -2052,15 +2053,6 @@ "useSafeChainsListValidation": true, "useTokenDetection": false, "useTransactionSimulations": true, - "usedNetworks": { - "0xaa36a7": { - "rpcUrl": "https://sepolia.infura.io/v3/dummy_key", - "chainId": "0xaa36a7", - "nickname": "Sepolia Test Network", - "ticker": "ETH", - "blockExplorerUrl": "https://sepolia.etherscan.io" - } - }, "userOperations": {}, "versionFileETag": "W/\"598946a37f16c5b882a0bebbadf4509f\"", "versionInfo": [], diff --git a/test/integration/data/onboarding-completion-route.json b/test/integration/data/onboarding-completion-route.json index b2c19536a138..9d3df88dbeae 100644 --- a/test/integration/data/onboarding-completion-route.json +++ b/test/integration/data/onboarding-completion-route.json @@ -59,7 +59,9 @@ "approvalFlows": [], "bridgeState": { "bridgeFeatureFlags": { - "extensionSupport": false + "extensionConfig": { + "support": false + } } }, "browserEnvironment": { "os": "mac", "browser": "firefox" }, @@ -285,6 +287,7 @@ "showPermissionsTour": true, "showTestnetMessageInDropdown": true, "signatureSecurityAlertResponses": {}, + "slides": [], "smartTransactionsState": { "smartTransactions": { "0x1": [] }, "fees": {}, @@ -463,7 +466,6 @@ "useSafeChainsListValidation": true, "useTokenDetection": true, "useTransactionSimulations": true, - "usedNetworks": { "0x1": true, "0x5": true, "0x539": true }, "userOperations": {}, "versionFileETag": "", "versionInfo": [], diff --git a/test/jest/mock-store.js b/test/jest/mock-store.js index f88b8a210904..f22f088e64ec 100644 --- a/test/jest/mock-store.js +++ b/test/jest/mock-store.js @@ -4,7 +4,9 @@ import { KeyringType } from '../../shared/constants/keyring'; import { ETH_EOA_METHODS } from '../../shared/constants/eth-methods'; import { mockNetworkState } from '../stub/networks'; import { DEFAULT_BRIDGE_CONTROLLER_STATE } from '../../app/scripts/controllers/bridge/constants'; +import { DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE } from '../../app/scripts/controllers/bridge-status/constants'; import { BRIDGE_PREFERRED_GAS_ESTIMATE } from '../../shared/constants/bridge'; +import { mockTokenData } from '../data/bridge/mock-token-data'; export const createGetSmartTransactionFeesApiResponse = () => { return { @@ -702,17 +704,31 @@ export const createSwapsMockStore = () => { }; export const createBridgeMockStore = ( - featureFlagOverrides = {}, - bridgeSliceOverrides = {}, - bridgeStateOverrides = {}, - metamaskStateOverrides = {}, + { + featureFlagOverrides = {}, + bridgeSliceOverrides = {}, + bridgeStateOverrides = {}, + bridgeStatusStateOverrides = {}, + metamaskStateOverrides = {}, + } = { + featureFlagOverrides: {}, + bridgeSliceOverrides: {}, + bridgeStateOverrides: {}, + bridgeStatusStateOverrides: {}, + metamaskStateOverrides: {}, + }, ) => { const swapsStore = createSwapsMockStore(); return { ...swapsStore, + // For initial state of dest asset picker + swaps: { + ...swapsStore.swaps, + topAssets: [], + }, bridge: { toChainId: null, - sortOrder: 0, + sortOrder: 'cost_ascending', ...bridgeSliceOverrides, }, metamask: { @@ -730,20 +746,37 @@ export const createBridgeMockStore = ( }, currencyRates: { ETH: { conversionRate: 2524.25 }, + usd: { conversionRate: 1 }, + }, + marketData: { + '0x1': { + '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984': { + currency: 'usd', + price: 2.3, + }, + }, }, + ...mockTokenData, ...metamaskStateOverrides, bridgeState: { - ...(swapsStore.metamask.bridgeState ?? {}), + ...DEFAULT_BRIDGE_CONTROLLER_STATE, bridgeFeatureFlags: { - extensionSupport: false, - srcNetworkAllowlist: [], - destNetworkAllowlist: [], ...featureFlagOverrides, + extensionConfig: { + support: false, + chains: {}, + ...featureFlagOverrides.extensionConfig, + }, }, - quotes: DEFAULT_BRIDGE_CONTROLLER_STATE.quotes, - quoteRequest: DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest, ...bridgeStateOverrides, }, + bridgeStatusState: { + ...DEFAULT_BRIDGE_STATUS_CONTROLLER_STATE, + ...bridgeStatusStateOverrides, + }, + }, + send: { + swapsBlockedTokens: [], }, }; }; diff --git a/test/jest/mocks.ts b/test/jest/mocks.ts index 8822b96315b6..9fdc6538d9d6 100644 --- a/test/jest/mocks.ts +++ b/test/jest/mocks.ts @@ -3,9 +3,9 @@ import { EthMethod, BtcMethod, BtcAccountType, - InternalAccount, isEvmAccountType, } from '@metamask/keyring-api'; +import { InternalAccount } from '@metamask/keyring-internal-api'; import { KeyringTypes } from '@metamask/keyring-controller'; import { v4 as uuidv4 } from 'uuid'; import { keyringTypeToName } from '@metamask/accounts-controller'; diff --git a/test/manual-scenarios/upgrade-testing/upgrade-testing.md b/test/manual-scenarios/upgrade-testing/upgrade-testing.md index df5ca3d1fc50..13880f13694b 100644 --- a/test/manual-scenarios/upgrade-testing/upgrade-testing.md +++ b/test/manual-scenarios/upgrade-testing/upgrade-testing.md @@ -8,7 +8,7 @@ To ensure MetaMask extension's upgrade process is seamless and retains user data ### Pre-Upgrade Actions on Master Branch -- **Given** the user checks out the master branch, runs `yarn` and `yarn start` to build locally, and has loaded the MetaMask extension. For instructions on how to load extension on Chrome and Firefox, check the guidelines [here for Chrome](https://github.com/MetaMask/metamask-extension/blob/develop/docs/add-to-chrome.md) and [here for Firefox](https://github.com/MetaMask/metamask-extension/blob/develop/docs/add-to-firefox.md). +- **Given** the user checks out the master branch, runs `yarn` and `yarn start` to build locally, and has loaded the MetaMask extension. For instructions on how to load extension on Chrome and Firefox, check the guidelines [here for Chrome](https://github.com/MetaMask/metamask-extension/blob/main/docs/add-to-chrome.md) and [here for Firefox](https://github.com/MetaMask/metamask-extension/blob/main/docs/add-to-firefox.md). - **And** the user has successfully onboarded. - **And** the user creates two accounts. - **And** the user sends a transaction between these accounts. diff --git a/ui/components/app/alert-system/alert-modal/alert-modal.tsx b/ui/components/app/alert-system/alert-modal/alert-modal.tsx index 10f5d90c3e77..2eb78fba44c1 100644 --- a/ui/components/app/alert-system/alert-modal/alert-modal.tsx +++ b/ui/components/app/alert-system/alert-modal/alert-modal.tsx @@ -164,12 +164,15 @@ function AlertDetails({ > {customDetails ?? ( - - {selectedAlert.message} - + {Boolean(selectedAlert.content) && selectedAlert.content} + {Boolean(selectedAlert.message) && ( + + {selectedAlert.message} + + )} {selectedAlert.alertDetails?.length ? ( {t('alertModalDetails')} diff --git a/ui/components/app/alert-system/general-alert/general-alert.tsx b/ui/components/app/alert-system/general-alert/general-alert.tsx index 5ac2b2a335fb..5c222902b3ab 100644 --- a/ui/components/app/alert-system/general-alert/general-alert.tsx +++ b/ui/components/app/alert-system/general-alert/general-alert.tsx @@ -21,13 +21,14 @@ import { AlertProvider } from '../alert-provider'; import { AlertSeverity } from '../../../../ducks/confirm-alerts/confirm-alerts'; export type GeneralAlertProps = { - description: string; + description?: string; details?: React.ReactNode | string[]; onClickSupportLink?: () => void; provider?: SecurityProvider; reportUrl?: string; severity: AlertSeverity; title?: string; + children?: React.ReactNode; }; function ReportLink({ @@ -119,6 +120,7 @@ function GeneralAlert({ description={description} {...props} > + {props.children} { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should fire metrics event when refresh button is clicked', async () => { + const store = configureMockStore([thunk])({ + metamask: { + selectedNetworkClientId: 'selectedNetworkClientId', + networkConfigurationsByChainId: { + '0x1': { + chainId: '0x1', + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'selectedNetworkClientId', + }, + ], + }, + }, + internalAccounts: { + selectedAccount: 'selectedAccount', + accounts: { + selectedAccount: {}, + }, + }, + }, + }); + + const mockTrackEvent = jest.fn(); + + const { findByTestId } = renderWithProvider( + + + , + store, + ); + + const importButton = await findByTestId('import-token-button'); + importButton.click(); + + const refreshListItem = await findByTestId('refreshList__button'); + refreshListItem.click(); + + expect(mockTrackEvent).toHaveBeenCalledTimes(1); + expect(mockTrackEvent).toHaveBeenCalledWith({ + category: MetaMetricsEventCategory.Tokens, + event: MetaMetricsEventName.TokenListRefreshed, + }); + }); +}); diff --git a/ui/components/app/assets/asset-list/asset-list-control-bar/asset-list-control-bar.tsx b/ui/components/app/assets/asset-list/asset-list-control-bar/asset-list-control-bar.tsx index 348fd82fbdaa..d335f6f41820 100644 --- a/ui/components/app/assets/asset-list/asset-list-control-bar/asset-list-control-bar.tsx +++ b/ui/components/app/assets/asset-list/asset-list-control-bar/asset-list-control-bar.tsx @@ -3,6 +3,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { getCurrentNetwork, getIsTokenNetworkFilterEqualCurrentNetwork, + getSelectedInternalAccount, getTokenNetworkFilter, } from '../../../../../selectors'; import { getNetworkConfigurationsByChainId } from '../../../../../../shared/modules/selectors/networks'; @@ -49,6 +50,8 @@ import { showImportTokensModal, } from '../../../../../store/actions'; import Tooltip from '../../../../ui/tooltip'; +import { useMultichainSelector } from '../../../../../hooks/useMultichainSelector'; +import { getMultichainNetwork } from '../../../../../selectors/multichain'; type AssetListControlBarProps = { showTokensLinks?: boolean; @@ -72,6 +75,9 @@ const AssetListControlBar = ({ showTokensLinks }: AssetListControlBarProps) => { const [isNetworkFilterPopoverOpen, setIsNetworkFilterPopoverOpen] = useState(false); + const account = useSelector(getSelectedInternalAccount); + const { isEvmNetwork } = useMultichainSelector(getMultichainNetwork, account); + const isTestNetwork = useMemo(() => { return (TEST_CHAINS as string[]).includes(currentNetwork.chainId); }, [currentNetwork.chainId, TEST_CHAINS]); @@ -154,6 +160,10 @@ const AssetListControlBar = ({ showTokensLinks }: AssetListControlBarProps) => { const handleRefresh = () => { dispatch(detectTokens()); closePopover(); + trackEvent({ + category: MetaMetricsEventCategory.Tokens, + event: MetaMetricsEventName.TokenListRefreshed, + }); }; return ( @@ -166,12 +176,13 @@ const AssetListControlBar = ({ showTokensLinks }: AssetListControlBarProps) => { - {process.env.PORTFOLIO_VIEW && ( + {/* TODO: Remove isEvmNetwork check when we are ready to show the network filter in all networks including non-EVM */} + {process.env.PORTFOLIO_VIEW && isEvmNetwork ? ( { ? currentNetwork?.nickname ?? t('currentNetwork') : t('popularNetworks')} - )} + ) : null} { const showFiat = useSelector(getMultichainShouldShowFiat); + const account = useSelector(getSelectedInternalAccount); const primaryTokenImage = useSelector(getMultichainCurrencyImage); const { showNativeTokenAsMainBalance } = useSelector(getPreferences); const { chainId, ticker, type, rpcUrl } = useSelector( @@ -46,12 +51,14 @@ export const useNativeTokenBalance = () => { const [primaryCurrencyDisplay, primaryCurrencyProperties] = useCurrencyDisplay(balance, { + account, numberOfDecimals: primaryNumberOfDecimals, currency: primaryCurrency, }); const [secondaryCurrencyDisplay, secondaryCurrencyProperties] = useCurrencyDisplay(balance, { + account, numberOfDecimals: secondaryNumberOfDecimals, currency: secondaryCurrency, }); diff --git a/ui/components/app/assets/asset-list/sort-control/sort-control.test.tsx b/ui/components/app/assets/asset-list/sort-control/sort-control.test.tsx index 4aac598bd838..a74adca65ce9 100644 --- a/ui/components/app/assets/asset-list/sort-control/sort-control.test.tsx +++ b/ui/components/app/assets/asset-list/sort-control/sort-control.test.tsx @@ -4,7 +4,8 @@ import { useSelector } from 'react-redux'; import { setTokenSortConfig } from '../../../../../store/actions'; import { renderWithProvider } from '../../../../../../test/lib/render-helpers'; import { MetaMetricsContext } from '../../../../../contexts/metametrics'; -import { getCurrentCurrency, getPreferences } from '../../../../../selectors'; +import { getPreferences } from '../../../../../selectors'; +import { getCurrentCurrency } from '../../../../../ducks/metamask/metamask'; import SortControl from './sort-control'; // Mock the sortAssets utility diff --git a/ui/components/app/assets/asset-list/sort-control/sort-control.tsx b/ui/components/app/assets/asset-list/sort-control/sort-control.tsx index cf7285c9115b..ddded6c1c027 100644 --- a/ui/components/app/assets/asset-list/sort-control/sort-control.tsx +++ b/ui/components/app/assets/asset-list/sort-control/sort-control.tsx @@ -18,7 +18,8 @@ import { MetaMetricsEventName, MetaMetricsUserTrait, } from '../../../../../../shared/constants/metametrics'; -import { getCurrentCurrency, getPreferences } from '../../../../../selectors'; +import { getPreferences } from '../../../../../selectors'; +import { getCurrentCurrency } from '../../../../../ducks/metamask/metamask'; import { useI18nContext } from '../../../../../hooks/useI18nContext'; import { getCurrencySymbol } from '../../../../../helpers/utils/common.util'; diff --git a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap index d6b0de0c043e..dd91a6bb0188 100644 --- a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap +++ b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap @@ -66,7 +66,7 @@ exports[`NFT Details should match minimal props and state snapshot 1`] = ` style="top: -4px; right: -4px;" >

G diff --git a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap index 7b4d6b11abc6..e9ac6e3e6a26 100644 --- a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap +++ b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap @@ -64,7 +64,7 @@ exports[`NFT full image should match snapshot 1`] = ` style="top: -4px; right: -4px;" >
G diff --git a/ui/components/app/assets/nfts/nft-details/nft-details.tsx b/ui/components/app/assets/nfts/nft-details/nft-details.tsx index 49408dfd5fa4..3f421615c3cf 100644 --- a/ui/components/app/assets/nfts/nft-details/nft-details.tsx +++ b/ui/components/app/assets/nfts/nft-details/nft-details.tsx @@ -21,11 +21,7 @@ import { useI18nContext } from '../../../../../hooks/useI18nContext'; import { shortenAddress } from '../../../../../helpers/utils/util'; import { getNftImageAlt } from '../../../../../helpers/utils/nfts'; import { getCurrentChainId } from '../../../../../../shared/modules/selectors/networks'; -import { - getCurrentCurrency, - getCurrentNetwork, - getIpfsGateway, -} from '../../../../../selectors'; +import { getCurrentNetwork, getIpfsGateway } from '../../../../../selectors'; import { ASSET_ROUTE, DEFAULT_ROUTE, @@ -67,7 +63,10 @@ import { Content, Footer, Page } from '../../../../multichain/pages/page'; import { formatCurrency } from '../../../../../helpers/utils/confirm-tx.util'; import { getShortDateFormatterV2 } from '../../../../../pages/asset/util'; import { CHAINID_DEFAULT_BLOCK_EXPLORER_URL_MAP } from '../../../../../../shared/constants/common'; -import { getConversionRate } from '../../../../../ducks/metamask/metamask'; +import { + getConversionRate, + getCurrentCurrency, +} from '../../../../../ducks/metamask/metamask'; import { Numeric } from '../../../../../../shared/modules/Numeric'; // TODO: Remove restricted import // eslint-disable-next-line import/no-restricted-paths diff --git a/ui/components/app/assets/token-cell/__snapshots__/token-cell.test.tsx.snap b/ui/components/app/assets/token-cell/__snapshots__/token-cell.test.tsx.snap index 30efc922ec7e..7fb51f212ebd 100644 --- a/ui/components/app/assets/token-cell/__snapshots__/token-cell.test.tsx.snap +++ b/ui/components/app/assets/token-cell/__snapshots__/token-cell.test.tsx.snap @@ -3,13 +3,14 @@ exports[`Token Cell should match snapshot 1`] = `
network logo
diff --git a/ui/components/app/assets/token-cell/token-cell.test.tsx b/ui/components/app/assets/token-cell/token-cell.test.tsx index 285c3dfac778..d80996776c49 100644 --- a/ui/components/app/assets/token-cell/token-cell.test.tsx +++ b/ui/components/app/assets/token-cell/token-cell.test.tsx @@ -5,10 +5,10 @@ import { fireEvent } from '@testing-library/react'; import { useSelector } from 'react-redux'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import { useTokenFiatAmount } from '../../../../hooks/useTokenFiatAmount'; +import { getCurrentCurrency } from '../../../../ducks/metamask/metamask'; import { getTokenList, getPreferences, - getCurrentCurrency, getCurrencyRates, } from '../../../../selectors'; import { diff --git a/ui/components/app/assets/token-cell/token-cell.tsx b/ui/components/app/assets/token-cell/token-cell.tsx index d470ef3dc21a..c194bdca485c 100644 --- a/ui/components/app/assets/token-cell/token-cell.tsx +++ b/ui/components/app/assets/token-cell/token-cell.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { useSelector } from 'react-redux'; import { BigNumber } from 'bignumber.js'; +import { getCurrentCurrency } from '../../../../ducks/metamask/metamask'; import { - getCurrentCurrency, getTokenList, selectERC20TokensByChain, getNativeCurrencyForChain, diff --git a/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx b/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx index a6b083eccc16..52faaf0384af 100644 --- a/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx +++ b/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx @@ -37,7 +37,7 @@ import { import { MetaMetricsContext } from '../../../contexts/metametrics'; import { getUseExternalServices } from '../../../selectors'; import { selectIsMetamaskNotificationsEnabled } from '../../../selectors/metamask-notifications/metamask-notifications'; -import { selectIsProfileSyncingEnabled } from '../../../selectors/metamask-notifications/profile-syncing'; +import { selectIsProfileSyncingEnabled } from '../../../selectors/identity/profile-syncing'; import { hideBasicFunctionalityModal, onboardingToggleBasicFunctionalityOff, diff --git a/ui/components/app/confirm/info/row/__snapshots__/address.test.tsx.snap b/ui/components/app/confirm/info/row/__snapshots__/address.test.tsx.snap index ec2eacb0d44b..87a709c0d80e 100644 --- a/ui/components/app/confirm/info/row/__snapshots__/address.test.tsx.snap +++ b/ui/components/app/confirm/info/row/__snapshots__/address.test.tsx.snap @@ -9,10 +9,11 @@ exports[`ConfirmInfoRowAddress renders appropriately with PetNames disabled with class="mm-box mm-box--display-flex mm-box--flex-direction-row mm-box--align-items-center" >