From 2abb96a2fda5ff96eb8b1c79e8f14dc32059f023 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Wed, 19 Feb 2025 16:29:32 +0100 Subject: [PATCH] chore: Bump Snaps dependencies (#30396) ## **Description** Bump Snaps packages and handle any required changes. Summary of Snaps changes: - Add additional properties to `snap_getPreferences` - Add `crossAlignment` to `Box` [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/30396?quickstart=1) ## **Related issues** Fixes: https://github.com/MetaMask/metamask-extension/issues/30368 --------- Co-authored-by: Hassan Malik <41640681+hmalik88@users.noreply.github.com> Co-authored-by: Guillaume Roux Co-authored-by: Guillaume Roux Co-authored-by: MetaMask Bot --- .../snaps/cronjob-controller-init.ts | 1 - .../snaps/execution-service-init.ts | 2 - .../snaps/snap-insights-controller-init.ts | 1 - .../snaps/snap-interface-controller-init.ts | 1 - .../snaps/snaps-registry-init.ts | 1 - app/scripts/metamask-controller.js | 52 ++++- builds.yml | 8 +- lavamoat/browserify/beta/policy.json | 94 +++++++-- lavamoat/browserify/flask/policy.json | 94 +++++++-- lavamoat/browserify/main/policy.json | 94 +++++++-- lavamoat/browserify/mmi/policy.json | 94 +++++++-- package.json | 12 +- test/e2e/snaps/enums.js | 2 +- .../snaps/snap-ui-renderer/components/box.ts | 28 ++- ui/hooks/snaps/useDisplayName.ts | 9 +- yarn.lock | 181 +++++++++++------- 16 files changed, 501 insertions(+), 173 deletions(-) diff --git a/app/scripts/controller-init/snaps/cronjob-controller-init.ts b/app/scripts/controller-init/snaps/cronjob-controller-init.ts index f959d87786ad..ce3b7ee2d00f 100644 --- a/app/scripts/controller-init/snaps/cronjob-controller-init.ts +++ b/app/scripts/controller-init/snaps/cronjob-controller-init.ts @@ -19,7 +19,6 @@ export const CronjobControllerInit: ControllerInitFunction< // with the expected type. // TODO: Look into the type mismatch. state: persistedState.CronjobController, - // @ts-expect-error TODO: Resolve mismatch between base-controller versions. messenger: controllerMessenger, }); diff --git a/app/scripts/controller-init/snaps/execution-service-init.ts b/app/scripts/controller-init/snaps/execution-service-init.ts index fff8cd4f2b32..01763747d259 100644 --- a/app/scripts/controller-init/snaps/execution-service-init.ts +++ b/app/scripts/controller-init/snaps/execution-service-init.ts @@ -53,7 +53,6 @@ export const ExecutionServiceInit: ControllerInitFunction< memStateKey: null, persistedStateKey: null, controller: new OffscreenExecutionService({ - // @ts-expect-error TODO: Resolve mismatch between base-controller versions. messenger: controllerMessenger, setupSnapProvider, offscreenPromise, @@ -68,7 +67,6 @@ export const ExecutionServiceInit: ControllerInitFunction< memStateKey: null, persistedStateKey: null, controller: new IframeExecutionService({ - // @ts-expect-error TODO: Resolve mismatch between base-controller versions. messenger: controllerMessenger, iframeUrl: new URL(iframeUrl), setupSnapProvider, diff --git a/app/scripts/controller-init/snaps/snap-insights-controller-init.ts b/app/scripts/controller-init/snaps/snap-insights-controller-init.ts index f7fc09baecbd..7ba84b1f4c46 100644 --- a/app/scripts/controller-init/snaps/snap-insights-controller-init.ts +++ b/app/scripts/controller-init/snaps/snap-insights-controller-init.ts @@ -19,7 +19,6 @@ export const SnapInsightsControllerInit: ControllerInitFunction< // compatible with the expected type. // TODO: Look into the type mismatch. state: persistedState.SnapInsightsController, - // @ts-expect-error TODO: Resolve mismatch between base-controller versions. messenger: controllerMessenger, }); diff --git a/app/scripts/controller-init/snaps/snap-interface-controller-init.ts b/app/scripts/controller-init/snaps/snap-interface-controller-init.ts index 4a3791c03580..f4947c7f90d2 100644 --- a/app/scripts/controller-init/snaps/snap-interface-controller-init.ts +++ b/app/scripts/controller-init/snaps/snap-interface-controller-init.ts @@ -19,7 +19,6 @@ export const SnapInterfaceControllerInit: ControllerInitFunction< // with the expected type. // TODO: Look into the type mismatch. state: persistedState.SnapInterfaceController, - // @ts-expect-error TODO: Resolve mismatch between base-controller versions. messenger: controllerMessenger, }); diff --git a/app/scripts/controller-init/snaps/snaps-registry-init.ts b/app/scripts/controller-init/snaps/snaps-registry-init.ts index 86d1297e17c6..f9dc8f720afa 100644 --- a/app/scripts/controller-init/snaps/snaps-registry-init.ts +++ b/app/scripts/controller-init/snaps/snaps-registry-init.ts @@ -22,7 +22,6 @@ export const SnapsRegistryInit: ControllerInitFunction< // with the expected type. // TODO: Look into the type mismatch. state: persistedState.SnapsRegistry, - // @ts-expect-error TODO: Resolve mismatch between base-controller versions. messenger: controllerMessenger, refetchOnAllowlistMiss: requireAllowlist, }); diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 14724fbf1baa..29ea67419583 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -2551,14 +2551,32 @@ export default class MetamaskController extends EventEmitter { } /** - * Gets whether the privacy mode is enabled from the PreferencesController. + * Gets a subset of preferences from the PreferencesController to pass to a snap. * - * @returns {boolean} Whether the privacy mode is enabled. + * @returns {object} A subset of preferences. */ - getPrivacyMode() { - const { privacyMode } = this.preferencesController.state; + getPreferences() { + const { + preferences, + securityAlertsEnabled, + useCurrencyRateCheck, + useTransactionSimulations, + useTokenDetection, + useMultiAccountBalanceChecker, + openSeaEnabled, + useNftDetection, + } = this.preferencesController.state; - return privacyMode; + return { + privacyMode: preferences.privacyMode, + securityAlertsEnabled, + useCurrencyRateCheck, + useTransactionSimulations, + useTokenDetection, + useMultiAccountBalanceChecker, + openSeaEnabled, + useNftDetection, + }; } /** @@ -2573,8 +2591,28 @@ export default class MetamaskController extends EventEmitter { getPreferences: () => { const locale = this.getLocale(); const currency = this.currencyRateController.state.currentCurrency; - const hideBalances = this.getPrivacyMode(); - return { locale, currency, hideBalances }; + const { + privacyMode, + securityAlertsEnabled, + useCurrencyRateCheck, + useTransactionSimulations, + useTokenDetection, + useMultiAccountBalanceChecker, + openSeaEnabled, + useNftDetection, + } = this.getPreferences(); + return { + locale, + currency, + hideBalances: privacyMode, + useSecurityAlerts: securityAlertsEnabled, + useExternalPricingData: useCurrencyRateCheck, + simulateOnChainActions: useTransactionSimulations, + useTokenDetection, + batchCheckBalances: useMultiAccountBalanceChecker, + displayNftMedia: openSeaEnabled, + useNftDetection, + }; }, clearSnapState: this.controllerMessenger.call.bind( this.controllerMessenger, diff --git a/builds.yml b/builds.yml index eea8601d2754..a3b7fc3b71ff 100644 --- a/builds.yml +++ b/builds.yml @@ -27,7 +27,7 @@ buildTypes: - ALLOW_LOCAL_SNAPS: false - REQUIRE_SNAPS_ALLOWLIST: true - REJECT_INVALID_SNAPS_PLATFORM_VERSION: true - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.14.0/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/7.0.0/index.html - ACCOUNT_SNAPS_DIRECTORY_URL: https://snaps.metamask.io/account-management # Main build uses the default browser manifest manifestOverrides: false @@ -48,7 +48,7 @@ buildTypes: - ALLOW_LOCAL_SNAPS: false - REQUIRE_SNAPS_ALLOWLIST: true - REJECT_INVALID_SNAPS_PLATFORM_VERSION: true - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.14.0/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/7.0.0/index.html - ACCOUNT_SNAPS_DIRECTORY_URL: https://snaps.metamask.io/account-management # Modifies how the version is displayed. # eg. instead of 10.25.0 -> 10.25.0-beta.2 @@ -72,7 +72,7 @@ buildTypes: - ALLOW_LOCAL_SNAPS: true - REQUIRE_SNAPS_ALLOWLIST: false - REJECT_INVALID_SNAPS_PLATFORM_VERSION: false - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.14.0/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/7.0.0/index.html - SUPPORT_LINK: https://support.metamask.io/ - SUPPORT_REQUEST_LINK: https://support.metamask.io/ - INFURA_ENV_KEY_REF: INFURA_FLASK_PROJECT_ID @@ -96,7 +96,7 @@ buildTypes: - ALLOW_LOCAL_SNAPS: false - REQUIRE_SNAPS_ALLOWLIST: true - REJECT_INVALID_SNAPS_PLATFORM_VERSION: true - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.14.0/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/7.0.0/index.html - MMI_CONFIGURATION_SERVICE_URL: https://configuration.metamask-institutional.io/v2/configuration/default - SUPPORT_LINK: https://support.metamask-institutional.io - SUPPORT_REQUEST_LINK: https://support.metamask-institutional.io diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 9a0873cb879c..f2be8708fa4f 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -894,7 +894,7 @@ "console.info": true }, "packages": { - "@metamask/approval-controller>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/rpc-errors": true, "nanoid": true } @@ -928,7 +928,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/snaps-utils": true, + "@metamask/assets-controllers>@metamask/snaps-utils": true, "@metamask/assets-controllers>@metamask/utils": true, "@metamask/name-controller>async-mutex": true, "bn.js": true, @@ -954,14 +954,6 @@ "immer": true } }, - "@metamask/approval-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/network-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1010,14 +1002,6 @@ "immer": true } }, - "@metamask/snaps-controllers>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/transaction-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1551,7 +1535,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client": true, - "@metamask/snaps-utils": true, + "@metamask/multichain-transactions-controller>@metamask/snaps-utils": true, "@metamask/multichain-transactions-controller>@metamask/utils": true } }, @@ -1886,7 +1870,7 @@ "setTimeout": true }, "packages": { - "@metamask/snaps-controllers>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/json-rpc-engine": true, "@metamask/json-rpc-middleware-stream": true, "@metamask/object-multiplex": true, @@ -1991,6 +1975,76 @@ "@metamask/snaps-utils>validate-npm-package-name": true } }, + "@metamask/assets-controllers>@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/assets-controllers>@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/multichain-transactions-controller>@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/multichain-transactions-controller>@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, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 9a0873cb879c..f2be8708fa4f 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -894,7 +894,7 @@ "console.info": true }, "packages": { - "@metamask/approval-controller>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/rpc-errors": true, "nanoid": true } @@ -928,7 +928,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/snaps-utils": true, + "@metamask/assets-controllers>@metamask/snaps-utils": true, "@metamask/assets-controllers>@metamask/utils": true, "@metamask/name-controller>async-mutex": true, "bn.js": true, @@ -954,14 +954,6 @@ "immer": true } }, - "@metamask/approval-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/network-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1010,14 +1002,6 @@ "immer": true } }, - "@metamask/snaps-controllers>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/transaction-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1551,7 +1535,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client": true, - "@metamask/snaps-utils": true, + "@metamask/multichain-transactions-controller>@metamask/snaps-utils": true, "@metamask/multichain-transactions-controller>@metamask/utils": true } }, @@ -1886,7 +1870,7 @@ "setTimeout": true }, "packages": { - "@metamask/snaps-controllers>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/json-rpc-engine": true, "@metamask/json-rpc-middleware-stream": true, "@metamask/object-multiplex": true, @@ -1991,6 +1975,76 @@ "@metamask/snaps-utils>validate-npm-package-name": true } }, + "@metamask/assets-controllers>@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/assets-controllers>@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/multichain-transactions-controller>@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/multichain-transactions-controller>@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, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 9a0873cb879c..f2be8708fa4f 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -894,7 +894,7 @@ "console.info": true }, "packages": { - "@metamask/approval-controller>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/rpc-errors": true, "nanoid": true } @@ -928,7 +928,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/snaps-utils": true, + "@metamask/assets-controllers>@metamask/snaps-utils": true, "@metamask/assets-controllers>@metamask/utils": true, "@metamask/name-controller>async-mutex": true, "bn.js": true, @@ -954,14 +954,6 @@ "immer": true } }, - "@metamask/approval-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/network-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1010,14 +1002,6 @@ "immer": true } }, - "@metamask/snaps-controllers>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/transaction-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1551,7 +1535,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client": true, - "@metamask/snaps-utils": true, + "@metamask/multichain-transactions-controller>@metamask/snaps-utils": true, "@metamask/multichain-transactions-controller>@metamask/utils": true } }, @@ -1886,7 +1870,7 @@ "setTimeout": true }, "packages": { - "@metamask/snaps-controllers>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/json-rpc-engine": true, "@metamask/json-rpc-middleware-stream": true, "@metamask/object-multiplex": true, @@ -1991,6 +1975,76 @@ "@metamask/snaps-utils>validate-npm-package-name": true } }, + "@metamask/assets-controllers>@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/assets-controllers>@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/multichain-transactions-controller>@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/multichain-transactions-controller>@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, diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index 7f6f58c9686d..44d73b794f60 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -986,7 +986,7 @@ "console.info": true }, "packages": { - "@metamask/approval-controller>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/rpc-errors": true, "nanoid": true } @@ -1020,7 +1020,7 @@ "@metamask/metamask-eth-abis": true, "@metamask/polling-controller": true, "@metamask/rpc-errors": true, - "@metamask/snaps-utils": true, + "@metamask/assets-controllers>@metamask/snaps-utils": true, "@metamask/assets-controllers>@metamask/utils": true, "@metamask/name-controller>async-mutex": true, "bn.js": true, @@ -1046,14 +1046,6 @@ "immer": true } }, - "@metamask/approval-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/network-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1102,14 +1094,6 @@ "immer": true } }, - "@metamask/snaps-controllers>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/transaction-controller>@metamask/base-controller": { "globals": { "setTimeout": true @@ -1643,7 +1627,7 @@ "@metamask/base-controller": true, "@metamask/keyring-api": true, "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client": true, - "@metamask/snaps-utils": true, + "@metamask/multichain-transactions-controller>@metamask/snaps-utils": true, "@metamask/multichain-transactions-controller>@metamask/utils": true } }, @@ -1978,7 +1962,7 @@ "setTimeout": true }, "packages": { - "@metamask/snaps-controllers>@metamask/base-controller": true, + "@metamask/base-controller": true, "@metamask/json-rpc-engine": true, "@metamask/json-rpc-middleware-stream": true, "@metamask/object-multiplex": true, @@ -2083,6 +2067,76 @@ "@metamask/snaps-utils>validate-npm-package-name": true } }, + "@metamask/assets-controllers>@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/assets-controllers>@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/multichain-transactions-controller>@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/multichain-transactions-controller>@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, diff --git a/package.json b/package.json index a86a0d6c1d08..173f1c240d7c 100644 --- a/package.json +++ b/package.json @@ -222,7 +222,7 @@ "@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", "lavamoat-core@npm:^16.2.2": "patch:lavamoat-core@npm%3A16.2.2#~/.yarn/patches/lavamoat-core-npm-16.2.2-e361ff1f8a.patch", - "@metamask/snaps-sdk": "^6.17.1", + "@metamask/snaps-sdk": "^6.18.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", @@ -353,11 +353,11 @@ "@metamask/selected-network-controller": "^19.0.0", "@metamask/signature-controller": "^23.1.0", "@metamask/smart-transactions-controller": "^16.0.1", - "@metamask/snaps-controllers": "^9.19.1", - "@metamask/snaps-execution-environments": "^6.14.0", - "@metamask/snaps-rpc-methods": "^11.11.0", - "@metamask/snaps-sdk": "^6.17.1", - "@metamask/snaps-utils": "^8.10.0", + "@metamask/snaps-controllers": "^10.0.0", + "@metamask/snaps-execution-environments": "^7.0.0", + "@metamask/snaps-rpc-methods": "^11.12.0", + "@metamask/snaps-sdk": "^6.18.0", + "@metamask/snaps-utils": "^9.0.0", "@metamask/solana-wallet-snap": "^1.2.0", "@metamask/transaction-controller": "^45.0.0", "@metamask/user-operation-controller": "^24.0.1", diff --git a/test/e2e/snaps/enums.js b/test/e2e/snaps/enums.js index 8844ee3eca89..be4ec454a198 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.18.1', + TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.19.0', }; diff --git a/ui/components/app/snaps/snap-ui-renderer/components/box.ts b/ui/components/app/snaps/snap-ui-renderer/components/box.ts index fccf81729285..065be7cb5ab3 100644 --- a/ui/components/app/snaps/snap-ui-renderer/components/box.ts +++ b/ui/components/app/snaps/snap-ui-renderer/components/box.ts @@ -31,6 +31,29 @@ function generateJustifyContent(alignment?: BoxProps['alignment']) { } } +function generateAlignItems( + crossAlignment: BoxProps['crossAlignment'], + center?: BoxProps['center'], +) { + if (center) { + return AlignItems.center; + } + + switch (crossAlignment) { + default: + // align-items defaults to stretch but it's not available in the JustifyContent enum + return undefined; + case 'start': + return AlignItems.flexStart; + + case 'center': + return AlignItems.center; + + case 'end': + return AlignItems.flexEnd; + } +} + export const box: UIComponentFactory = ({ element, ...params @@ -46,7 +69,10 @@ export const box: UIComponentFactory = ({ ? FlexDirection.Row : FlexDirection.Column, justifyContent: generateJustifyContent(element.props.alignment), - alignItems: element.props.center && AlignItems.center, + alignItems: generateAlignItems( + element.props.crossAlignment, + element.props.center, + ), className: 'snap-ui-renderer__panel', color: TextColor.textDefault, }, diff --git a/ui/hooks/snaps/useDisplayName.ts b/ui/hooks/snaps/useDisplayName.ts index 6a6d3d7e6b51..3ac5080d4a9f 100644 --- a/ui/hooks/snaps/useDisplayName.ts +++ b/ui/hooks/snaps/useDisplayName.ts @@ -1,5 +1,8 @@ -import { NamespaceId } from '@metamask/snaps-utils'; -import { CaipChainId, KnownCaipNamespace } from '@metamask/utils'; +import { + CaipChainId, + KnownCaipNamespace, + CaipNamespace, +} from '@metamask/utils'; import { useSelector } from 'react-redux'; import { getMemoizedAccountName, @@ -12,7 +15,7 @@ import { decimalToHex } from '../../../shared/modules/conversion.utils'; export type UseDisplayNameParams = { chain: { - namespace: NamespaceId; + namespace: CaipNamespace; reference: string; }; chainId: CaipChainId; diff --git a/yarn.lock b/yarn.lock index 10c711b56b5a..875664b1f752 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4876,15 +4876,15 @@ __metadata: languageName: node linkType: hard -"@metamask/approval-controller@npm:^7.0.0, @metamask/approval-controller@npm:^7.1.2": - version: 7.1.2 - resolution: "@metamask/approval-controller@npm:7.1.2" +"@metamask/approval-controller@npm:^7.0.0, @metamask/approval-controller@npm:^7.1.2, @metamask/approval-controller@npm:^7.1.3": + version: 7.1.3 + resolution: "@metamask/approval-controller@npm:7.1.3" dependencies: - "@metamask/base-controller": "npm:^7.1.1" + "@metamask/base-controller": "npm:^8.0.0" "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/utils": "npm:^11.0.1" + "@metamask/utils": "npm:^11.1.0" nanoid: "npm:^3.3.8" - checksum: 10/e5903e8c3799484a3f42b2683ed733e68aca5204070c84f6012ee3830b04ebffdc7fc21fe80d2ea46f2a9ee3557a38e4031186f47e84d9079c2c902361543b0d + checksum: 10/2d88378dcc4f6c32ad544766cf26b7f59b1aee1d7ca0909b966c8c08eaac1d7109004120ca254d7ad008a6e5241b144d4dd831f926ec928a66f93cbd2e6f1693 languageName: node linkType: hard @@ -5519,15 +5519,15 @@ __metadata: languageName: node linkType: hard -"@metamask/json-rpc-middleware-stream@npm:^8.0.4, @metamask/json-rpc-middleware-stream@npm:^8.0.6": - version: 8.0.6 - resolution: "@metamask/json-rpc-middleware-stream@npm:8.0.6" +"@metamask/json-rpc-middleware-stream@npm:^8.0.4, @metamask/json-rpc-middleware-stream@npm:^8.0.6, @metamask/json-rpc-middleware-stream@npm:^8.0.7": + version: 8.0.7 + resolution: "@metamask/json-rpc-middleware-stream@npm:8.0.7" dependencies: - "@metamask/json-rpc-engine": "npm:^10.0.2" + "@metamask/json-rpc-engine": "npm:^10.0.3" "@metamask/safe-event-emitter": "npm:^3.0.0" - "@metamask/utils": "npm:^11.0.1" + "@metamask/utils": "npm:^11.1.0" readable-stream: "npm:^3.6.2" - checksum: 10/4df2ddf068ee935b5ea29b833df243ee43e0a17ea0151bc312d4eaeec541612f7416761be2b66f316c0b12f577f0257831b83844f6b9addbaf5fe9d9c5638262 + checksum: 10/54dadd16876ad1637b1fccd0d35c66dcc9a03d8614814d78b6730f9bb325e80ad1fdbb99d5b75785245aadf4064417ac35bc710a5549d13128f12153d0cc0432 languageName: node linkType: hard @@ -6077,27 +6077,6 @@ __metadata: languageName: node linkType: hard -"@metamask/providers@npm:^18.3.1": - version: 18.3.1 - resolution: "@metamask/providers@npm:18.3.1" - dependencies: - "@metamask/json-rpc-engine": "npm:^10.0.2" - "@metamask/json-rpc-middleware-stream": "npm:^8.0.6" - "@metamask/object-multiplex": "npm:^2.0.0" - "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/safe-event-emitter": "npm:^3.1.1" - "@metamask/utils": "npm:^11.0.1" - detect-browser: "npm:^5.2.0" - extension-port-stream: "npm:^4.1.0" - fast-deep-equal: "npm:^3.1.3" - is-stream: "npm:^2.0.0" - readable-stream: "npm:^3.6.2" - peerDependencies: - webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 - checksum: 10/0e21ba9cce926a49dedbfe30fc964cd2349ee6bf9156f525fb894dcbc147a3ae480384884131a6b1a0a508989b547d8c8d2aeb3d10e11f67a8ee5230c45631a8 - languageName: node - linkType: hard - "@metamask/providers@npm:^20.0.0": version: 20.0.0 resolution: "@metamask/providers@npm:20.0.0" @@ -6256,7 +6235,48 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-controllers@npm:^9.19.0, @metamask/snaps-controllers@npm:^9.19.1": +"@metamask/snaps-controllers@npm:^10.0.0": + version: 10.0.0 + resolution: "@metamask/snaps-controllers@npm:10.0.0" + dependencies: + "@metamask/approval-controller": "npm:^7.1.3" + "@metamask/base-controller": "npm:^8.0.0" + "@metamask/json-rpc-engine": "npm:^10.0.2" + "@metamask/json-rpc-middleware-stream": "npm:^8.0.7" + "@metamask/key-tree": "npm:^10.0.2" + "@metamask/object-multiplex": "npm:^2.1.0" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/phishing-controller": "npm:^12.3.2" + "@metamask/post-message-stream": "npm:^9.0.0" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-rpc-methods": "npm:^11.12.0" + "@metamask/snaps-sdk": "npm:^6.18.0" + "@metamask/snaps-utils": "npm:^9.0.0" + "@metamask/utils": "npm:^11.2.0" + "@xstate/fsm": "npm:^2.0.0" + async-mutex: "npm:^0.5.0" + browserify-zlib: "npm:^0.2.0" + concat-stream: "npm:^2.0.0" + fast-deep-equal: "npm:^3.1.3" + get-npm-tarball-url: "npm:^2.0.3" + immer: "npm:^9.0.6" + luxon: "npm:^3.5.0" + nanoid: "npm:^3.1.31" + readable-stream: "npm:^3.6.2" + readable-web-to-node-stream: "npm:^3.0.2" + semver: "npm:^7.5.4" + tar-stream: "npm:^3.1.7" + peerDependencies: + "@metamask/snaps-execution-environments": ^7.0.0 + peerDependenciesMeta: + "@metamask/snaps-execution-environments": + optional: true + checksum: 10/eeb094883987a309ee7087bf540428ecd27d39189e494c81cc5f55623f46577fc9b6b4b907f2fc14cc5940486c56fca9074d204f5e43924d793e974cb3f63f34 + languageName: node + linkType: hard + +"@metamask/snaps-controllers@npm:^9.19.0": version: 9.19.1 resolution: "@metamask/snaps-controllers@npm:9.19.1" dependencies: @@ -6297,22 +6317,22 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-execution-environments@npm:^6.14.0": - version: 6.14.0 - resolution: "@metamask/snaps-execution-environments@npm:6.14.0" +"@metamask/snaps-execution-environments@npm:^7.0.0": + version: 7.0.0 + resolution: "@metamask/snaps-execution-environments@npm:7.0.0" dependencies: "@metamask/json-rpc-engine": "npm:^10.0.2" "@metamask/object-multiplex": "npm:^2.1.0" "@metamask/post-message-stream": "npm:^9.0.0" - "@metamask/providers": "npm:^18.3.1" + "@metamask/providers": "npm:^20.0.0" "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/snaps-sdk": "npm:^6.17.0" - "@metamask/snaps-utils": "npm:^8.10.0" + "@metamask/snaps-sdk": "npm:^6.18.0" + "@metamask/snaps-utils": "npm:^9.0.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.0.1" + "@metamask/utils": "npm:^11.2.0" nanoid: "npm:^3.1.31" readable-stream: "npm:^3.6.2" - checksum: 10/7ee10aacc5b94f51a1e4414aef097509c35625a5bccf7d8b693a87ced85a466244a64471452ee2fa8ee8b0a953b8859c0703bfff30b2ac89c327561d62228e46 + checksum: 10/c63b9e827cf6069af3fd8b5378f6f595c28cced32a46ea81ab7a5729d2425c8e466094dad935d360f79fbf5905e1b51b74f14aacc711effe03a315cd650fab9d languageName: node linkType: hard @@ -6328,33 +6348,33 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-rpc-methods@npm:^11.11.0": - version: 11.11.0 - resolution: "@metamask/snaps-rpc-methods@npm:11.11.0" +"@metamask/snaps-rpc-methods@npm:^11.11.0, @metamask/snaps-rpc-methods@npm:^11.12.0": + version: 11.12.0 + resolution: "@metamask/snaps-rpc-methods@npm:11.12.0" dependencies: "@metamask/key-tree": "npm:^10.0.2" - "@metamask/permission-controller": "npm:^11.0.5" + "@metamask/permission-controller": "npm:^11.0.6" "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/snaps-sdk": "npm:^6.17.0" - "@metamask/snaps-utils": "npm:^8.10.0" + "@metamask/snaps-sdk": "npm:^6.18.0" + "@metamask/snaps-utils": "npm:^9.0.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.0.1" + "@metamask/utils": "npm:^11.2.0" "@noble/hashes": "npm:^1.3.1" luxon: "npm:^3.5.0" - checksum: 10/cd88db675062e848a65dc4edcd26ed24184430af77ed58f3e7949879255cbf94d1b5fcc51127646494a239c390fe6398c2ffaa5f3d2f63e7f859225e2eeae832 + checksum: 10/75e83542b7fa7302e02ff010561d1a598cac348f3e31f874cb99b86032e0e1d634a96a0a5037df2f0dc67b87af9a40b202cf2d9e4b44863495deac6a358f5239 languageName: node linkType: hard -"@metamask/snaps-sdk@npm:^6.17.1": - version: 6.17.1 - resolution: "@metamask/snaps-sdk@npm:6.17.1" +"@metamask/snaps-sdk@npm:^6.18.0": + version: 6.18.0 + resolution: "@metamask/snaps-sdk@npm:6.18.0" dependencies: "@metamask/key-tree": "npm:^10.0.2" - "@metamask/providers": "npm:^18.3.1" + "@metamask/providers": "npm:^20.0.0" "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^11.0.1" - checksum: 10/05c5170c6250115535bc6d06a417157bb55005dd6fe86e768d70fabfba610ec8114cf45a8a5aad1219b1cfb0bcf5e080974735a0ac9a8c8bd0ac102f5c3cf42f + "@metamask/utils": "npm:^11.2.0" + checksum: 10/9ab80f884b6f63916af854c71c27fcee60ac9090a4f47253f06c8eeac7a8a3b9bfcee84e5f40fbb34391de4b0d77b936fe8b51d822f2c4944f9b4e98b14e6fd2 languageName: node linkType: hard @@ -6389,6 +6409,37 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-utils@npm:^9.0.0": + version: 9.0.0 + resolution: "@metamask/snaps-utils@npm:9.0.0" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/base-controller": "npm:^8.0.0" + "@metamask/key-tree": "npm:^10.0.2" + "@metamask/permission-controller": "npm:^11.0.6" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/slip44": "npm:^4.1.0" + "@metamask/snaps-registry": "npm:^3.2.3" + "@metamask/snaps-sdk": "npm:^6.18.0" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.2.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^4.4.1" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.1.0" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/0aaaa584e5950daee8c8277f6e8a405ba416a829bef01f8c729f510afa634a06ee1c89a28d25074921b0c2bdd77631c5f37ec0b25111b9bd789a0082d306905d + languageName: node + linkType: hard + "@metamask/solana-wallet-snap@npm:^1.2.0": version: 1.2.0 resolution: "@metamask/solana-wallet-snap@npm:1.2.0" @@ -6517,9 +6568,9 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0": - version: 11.1.0 - resolution: "@metamask/utils@npm:11.1.0" +"@metamask/utils@npm:^11.0.1, @metamask/utils@npm:^11.1.0, @metamask/utils@npm:^11.2.0": + version: 11.2.0 + resolution: "@metamask/utils@npm:11.2.0" dependencies: "@ethereumjs/tx": "npm:^4.2.0" "@metamask/superstruct": "npm:^3.1.0" @@ -6530,7 +6581,7 @@ __metadata: pony-cause: "npm:^2.1.10" semver: "npm:^7.5.4" uuid: "npm:^9.0.1" - checksum: 10/756f13987881fe26adaa0a54354bc5af20cedee4dd228a736d481697dc634adb9e6e54d8f1dcc1d487b2376ab4ba8c576ecbb24beab2fb63aff721d0d5c0f5fe + checksum: 10/9cc2cb6af4627085e72a310ba9b8921c69757d94e2992d4664627e5a0d99b1f2f7f8069c6f22262515135e1172bd66b82d00512d90ea2ec6da4e768f3d7d4ae2 languageName: node linkType: hard @@ -26817,11 +26868,11 @@ __metadata: "@metamask/selected-network-controller": "npm:^19.0.0" "@metamask/signature-controller": "npm:^23.1.0" "@metamask/smart-transactions-controller": "npm:^16.0.1" - "@metamask/snaps-controllers": "npm:^9.19.1" - "@metamask/snaps-execution-environments": "npm:^6.14.0" - "@metamask/snaps-rpc-methods": "npm:^11.11.0" - "@metamask/snaps-sdk": "npm:^6.17.1" - "@metamask/snaps-utils": "npm:^8.10.0" + "@metamask/snaps-controllers": "npm:^10.0.0" + "@metamask/snaps-execution-environments": "npm:^7.0.0" + "@metamask/snaps-rpc-methods": "npm:^11.12.0" + "@metamask/snaps-sdk": "npm:^6.18.0" + "@metamask/snaps-utils": "npm:^9.0.0" "@metamask/solana-wallet-snap": "npm:^1.2.0" "@metamask/test-bundler": "npm:^1.0.0" "@metamask/test-dapp": "npm:9.0.0"