diff --git a/app/components/Nav/Main/index.js b/app/components/Nav/Main/index.js
index a497ca6e4cf..fbe5330bcbb 100644
--- a/app/components/Nav/Main/index.js
+++ b/app/components/Nav/Main/index.js
@@ -78,7 +78,7 @@ import {
stopIncomingTransactionPolling,
} from '../../../util/transaction-controller';
///: BEGIN:ONLY_INCLUDE_IF(snaps)
-import { SnapsExecutionWebView } from '../../UI/SnapsExecutionWebView';
+import { SnapsExecutionWebView } from '../../../lib/snaps';
///: END:ONLY_INCLUDE_IF
const Stack = createStackNavigator();
diff --git a/app/components/UI/SnapsExecutionWebView/SnapsExecutionWebView.tsx b/app/components/UI/SnapsExecutionWebView/SnapsExecutionWebView.tsx
deleted file mode 100644
index 560e88c46f5..00000000000
--- a/app/components/UI/SnapsExecutionWebView/SnapsExecutionWebView.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-import React, { useRef } from 'react';
-import { View, ScrollView } from 'react-native';
-import WebView from 'react-native-webview';
-import { snapsState, WebviewPostMessageStream } from '../../../core/Snaps';
-import { createStyles } from './styles';
-
-let stream: any;
-
-const SnapsExecutionWebView = () => {
- const styles = createStyles();
-
- const webviewRef = useRef();
-
- const setWebviewPostMessage = () => {
- stream = new WebviewPostMessageStream({
- name: 'rnside',
- target: 'webview',
- targetOrigin: '*',
- targetWindow: webviewRef.current,
- });
-
- // eslint-disable-next-line no-console
- stream.on('data', (data: any) =>
- // eslint-disable-next-line no-console
- console.log(
- '[APP LOG] setWebviewPostMessage: Message from Webview ' + data,
- ),
- );
-
- snapsState.stream = stream;
- snapsState.webview = webviewRef.current;
- };
-
- const messageFromWebview = (data: any) => {
- stream?._onMessage(data);
- };
-
- const envURI = {
- prod: 'https://gantunesr.github.io/mobile-execution-environment/',
- //localIOS: 'http://localhost:3001/mobile-execution-environment',
- // localAndroid: 'http://10.0.2.2:3001/mobile-execution-environment',
- };
-
- return (
-
-
-
-
-
- );
-};
-
-export default SnapsExecutionWebView;
-///: END:ONLY_INCLUDE_IF
diff --git a/app/components/UI/SnapsExecutionWebView/index.ts b/app/components/UI/SnapsExecutionWebView/index.ts
deleted file mode 100644
index 738fad34bbb..00000000000
--- a/app/components/UI/SnapsExecutionWebView/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-import SnapsExecutionWebView from './SnapsExecutionWebView';
-
-// eslint-disable-next-line import/prefer-default-export
-export { SnapsExecutionWebView };
-///: END:ONLY_INCLUDE_IF
diff --git a/app/core/Engine.ts b/app/core/Engine.ts
index 4232f167565..a3957899e10 100644
--- a/app/core/Engine.ts
+++ b/app/core/Engine.ts
@@ -105,9 +105,11 @@ import {
SnapControllerEvents,
SnapControllerActions,
PersistedSnapControllerState,
+ WebViewExecutionService,
} from '@metamask/snaps-controllers';
import { Snap } from '@metamask/snaps-utils';
import { NotificationArgs } from '@metamask/snaps-rpc-methods/dist/types/restricted/notify';
+import { getSnapsWebViewPromise } from '../lib/snaps';
import {
buildSnapEndowmentSpecifications,
buildSnapRestrictedMethodSpecifications,
@@ -149,7 +151,6 @@ import AnalyticsV2 from '../util/analyticsV2';
///: BEGIN:ONLY_INCLUDE_IF(snaps)
import {
SnapBridge,
- WebviewExecutionService,
ExcludedSnapEndowments,
ExcludedSnapPermissions,
detectSnapLocation,
@@ -332,7 +333,7 @@ class Engine {
/**
* Object that runs and manages the execution of Snaps
*/
- snapExecutionService: WebviewExecutionService;
+ snapExecutionService: WebViewExecutionService;
///: END:ONLY_INCLUDE_IF
/**
@@ -353,6 +354,8 @@ class Engine {
never
>({
name: 'ApprovalController',
+ allowedEvents: [],
+ allowedActions: [],
}),
showApprovalRequest: () => undefined,
typesExcludedFromRateLimiting: [
@@ -384,7 +387,8 @@ class Engine {
messenger: this.controllerMessenger.getRestricted<
'NetworkController',
never,
- // @ts-expect-error TODO: Resolve/patch mismatch between base-controller versions. Before: never, never. Now: string, string, which expects 3rd and 4th args to be informed for restrictedControllerMessengers
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore // TODO: fix this type mismatch after the base-controller version is updated
'NetworkController:networkDidChange'
>({
name: 'NetworkController',
@@ -397,7 +401,8 @@ class Engine {
// noop
},
};
- // @ts-expect-error TODO: Resolve/patch mismatch between base-controller versions. Before: never, never. Now: string, string, which expects 3rd and 4th args to be informed for restrictedControllerMessengers
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
const networkController = new NetworkController(networkControllerOpts);
networkController.initializeProvider();
@@ -634,6 +639,11 @@ class Engine {
),
getMnemonic: getPrimaryKeyringMnemonic.bind(this),
getUnlockPromise: getAppState.bind(this),
+ addSubjectMetadata: (params: any) =>
+ this.controllerMessenger.call<'SubjectMetadataController:addSubjectMetadata'>(
+ 'SubjectMetadataController:addSubjectMetadata',
+ params,
+ ),
getSnap: this.controllerMessenger.call.bind(
this.controllerMessenger,
'SnapController:get',
@@ -801,11 +811,12 @@ class Engine {
'0x025b65308f0f0fb8bc7f7ff87bfc296e0330eee5d3c1d1ee4a048b2fd6a86fa0a6',
});
- this.snapExecutionService = new WebviewExecutionService({
+ this.snapExecutionService = new WebViewExecutionService({
messenger: this.controllerMessenger.getRestricted({
name: 'ExecutionService',
}),
setupSnapProvider: setupSnapProvider.bind(this),
+ getWebView: () => getSnapsWebViewPromise,
});
const snapControllerMessenger = this.controllerMessenger.getRestricted({
@@ -831,6 +842,7 @@ class Engine {
`${approvalController.name}:updateRequestState`,
`${permissionController.name}:grantPermissions`,
`${subjectMetadataController.name}:getSubjectMetadata`,
+ `${subjectMetadataController.name}:addSubjectMetadata`,
`${phishingController.name}:maybeUpdateState`,
`${phishingController.name}:testOrigin`,
`${snapsRegistry.name}:get`,
@@ -872,15 +884,12 @@ class Engine {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
(snap: Snap, svgIcon: any = null) => {
- const {
- manifest: { proposedName },
- version,
- } = snap;
+ const parts = snap.id.split(/[:/]/);
subjectMetadataController.addSubjectMetadata({
subjectType: SubjectType.Snap,
- name: proposedName,
+ name: parts[parts.length - 1] || snap.id,
origin: snap.id,
- version,
+ version: snap.version,
svgIcon,
});
},
diff --git a/app/core/Snaps/SnapDuplex.ts b/app/core/Snaps/SnapDuplex.ts
deleted file mode 100644
index 314209b2ee6..00000000000
--- a/app/core/Snaps/SnapDuplex.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-import { Duplex } from 'readable-stream';
-import Logger from '../../util/Logger';
-
-type StreamData = number | string | Record | unknown[];
-
-export interface PostMessageEvent {
- origin: string;
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore This type is used inside the browser, so it's not available in react native
- source: typeof window;
-}
-
-/**
- * Abstract base class for postMessage streams.
- */
-export default abstract class SnapDuplex extends Duplex {
- private _stream: any;
- private _jobId: string;
-
- constructor({ stream, jobId }: { stream: any; jobId: string }) {
- super({
- objectMode: true,
- });
-
- this._stream = stream;
- this._jobId = jobId;
-
- this._stream.on('data', (data: any) => this._onData(data));
- }
-
- protected _onData(data: StreamData): void {
- Logger.log(
- '[SNAP DUPLEX LOG] SnapDuplex+_onData: Job',
- this._jobId,
- 'read data',
- data,
- );
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- if (data.jobId !== this._jobId) {
- return;
- }
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- this.push(data.data);
- }
-
- /**
- * Child classes must implement this function.
- */
- protected abstract _postMessage(_data?: unknown): void;
-
- _read(): void {
- return undefined;
- }
-
- _write(data: StreamData, _encoding: string | null, cb: () => void): void {
- Logger.log('[SNAP DUPLEX LOG] SnapDuplex+_write: Job', this._jobId);
- this._stream.write({ data, jobId: this._jobId });
- cb();
- }
-
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- destroy() {
- Logger.log(
- '[SNAP DUPLEX LOG] SnapDuplex+destroy: Destroy stream from SnapDuplex',
- );
- this._stream.destroy();
- }
-}
-///: END:ONLY_INCLUDE_IF
diff --git a/app/core/Snaps/SnapWebviewPostMessageStream.ts b/app/core/Snaps/SnapWebviewPostMessageStream.ts
deleted file mode 100644
index b7b78b701f2..00000000000
--- a/app/core/Snaps/SnapWebviewPostMessageStream.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-nocheck
-import { BasePostMessageStream } from '@metamask/post-message-stream';
-
-interface WebViewPostMessageStreamArgs {
- name: string;
- stream: any;
- jobId: string;
-}
-
-/**
- * A {@link Window.postMessage} stream.
- */
-export default class SnapWebviewPostMessageStream extends BasePostMessageStream {
- private _name: string;
-
- private _stream: string;
- private _jobId: string;
- /**
- * Creates a stream for communicating with other streams across the same or
- * different `window` objects.
- *
- * @param args - Options bag.
- * @param args.name - The name of the stream. Used to differentiate between
- * multiple streams sharing the same window object.
- * @param args.target - The name of the stream to exchange messages with.
- * @param args.targetOrigin - The origin of the target. Defaults to
- * `location.origin`, '*' is permitted.
- * @param args.targetWindow - The window object of the target stream. Defaults
- * to `window`.
- */
- constructor({ name, stream, jobId }: WebViewPostMessageStreamArgs) {
- super();
-
- this._name = name;
- this._stream = stream;
- this._jobId = jobId;
- this._onMessage = this._onMessage.bind(this);
- this._stream.on('data', (data) => this._onMessage(data));
- }
-
- protected _postMessage(data: unknown): void {
- this._stream.write(data);
- }
-
- private _onMessage(data: any): void {
- this._onData(data);
- }
-
- destroy(): void {
- this.destroyed = true;
- }
-}
-///: END:ONLY_INCLUDE_IF
diff --git a/app/core/Snaps/SnapsState.ts b/app/core/Snaps/SnapsState.ts
deleted file mode 100644
index cd1bfadbf4a..00000000000
--- a/app/core/Snaps/SnapsState.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-const snapsState = {
- stream: undefined,
- webview: undefined,
-};
-
-export default snapsState;
-///: END:ONLY_INCLUDE_IF
diff --git a/app/core/Snaps/WebviewExecutionService.ts b/app/core/Snaps/WebviewExecutionService.ts
deleted file mode 100644
index 1b5e4657167..00000000000
--- a/app/core/Snaps/WebviewExecutionService.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-nocheck
-import {
- Job,
- AbstractExecutionService,
- ExecutionServiceArgs,
-} from '@metamask/snaps-controllers';
-import snapsState from './SnapsState';
-import SnapDuplex from './SnapDuplex';
-
-import { BasePostMessageStream } from '@metamask/post-message-stream';
-export default class WebviewExecutionService extends AbstractExecutionService {
- #snapDuplexMap: Map;
-
- constructor({ messenger, setupSnapProvider }: ExecutionServiceArgs) {
- super({
- messenger,
- setupSnapProvider,
- });
- this.#snapDuplexMap = new Map();
- }
-
- protected async initEnvStream(jobId: string): Promise<{
- worker: any;
- stream: BasePostMessageStream;
- }> {
- const iframeWindow = snapsState.webview;
- const stream = snapsState.stream;
-
- // The WebviewExecutionService wraps the stream into a Duplex
- // to pass the jobId to the Proxy Service
- const snapStream = new SnapDuplex({
- stream,
- jobId,
- });
-
- this.#snapDuplexMap.set(jobId, snapStream);
-
- return { worker: iframeWindow, stream: snapStream };
- }
-
- protected terminateJob(jobWrapper: Job): void {
- const snapDuplex = this.#snapDuplexMap.get(jobWrapper.id);
- if (snapDuplex) {
- snapDuplex.destroy();
- this.#snapDuplexMap.delete(jobWrapper.id);
- }
- }
-}
-///: END:ONLY_INCLUDE_IF
diff --git a/app/core/Snaps/WebviewPostMessageStream.ts b/app/core/Snaps/WebviewPostMessageStream.ts
deleted file mode 100644
index 52d180e38f1..00000000000
--- a/app/core/Snaps/WebviewPostMessageStream.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-///: BEGIN:ONLY_INCLUDE_IF(snaps)
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-nocheck
-import {
- BasePostMessageStream,
- PostMessageEvent,
-} from '@metamask/post-message-stream';
-
-interface WebViewPostMessageStreamArgs {
- name: string;
- target: string;
- targetOrigin?: string;
- targetWindow?: Window;
-}
-
-/**
- * A {@link Window.postMessage} stream.
- */
-export default class WebviewPostMessageStream extends BasePostMessageStream {
- private _name: string;
-
- private _target: string;
-
- private _targetOrigin: string;
-
- private _targetWindow: Window;
-
- /**
- * Creates a stream for communicating with other streams across the same or
- * different `window` objects.
- *
- * @param args - Options bag.
- * @param args.name - The name of the stream. Used to differentiate between
- * multiple streams sharing the same window object.
- * @param args.target - The name of the stream to exchange messages with.
- * @param args.targetOrigin - The origin of the target. Defaults to
- * `location.origin`, '*' is permitted.
- * @param args.targetWindow - The window object of the target stream. Defaults
- * to `window`.
- */
- constructor({
- name,
- target,
- targetOrigin,
- targetWindow,
- }: WebViewPostMessageStreamArgs) {
- super();
-
- this._name = name;
- this._target = target;
- this._targetOrigin = targetOrigin;
- this._targetWindow = targetWindow;
- this._onMessage = this._onMessage.bind(this);
-
- setTimeout(() => this._handshake(), 0);
- }
-
- protected _postMessage(data: unknown): void {
- const message = {
- target: this._target,
- data,
- };
- this._targetWindow.injectJavaScript(
- `window.postMessage(${JSON.stringify(message)})`,
- );
- }
-
- private _onMessage(event: PostMessageEvent): void {
- const message = event.nativeEvent;
- const data = JSON.parse(message.data);
-
- this._onData(data.data);
- }
-
- destroy(): void {
- // Do nothing
- // we do not want to kill the stream that communicates with the execution environment
- }
-}
-///: END:ONLY_INCLUDE_IF
diff --git a/app/core/Snaps/index.ts b/app/core/Snaps/index.ts
index 8488be1e3a5..7a0b8d65356 100644
--- a/app/core/Snaps/index.ts
+++ b/app/core/Snaps/index.ts
@@ -1,10 +1,5 @@
///: BEGIN:ONLY_INCLUDE_IF(snaps)
import SnapBridge from './SnapBridge';
-import SnapDuplex from './SnapDuplex';
-import WebviewExecutionService from './WebviewExecutionService';
-import WebviewPostMessageStream from './WebviewPostMessageStream';
-import SnapWebviewPostMessageStream from './SnapWebviewPostMessageStream';
-import snapsState from './SnapsState';
import {
ExcludedSnapPermissions,
ExcludedSnapEndowments,
@@ -16,12 +11,7 @@ import {
} from './location';
export {
- snapsState,
- SnapDuplex,
SnapBridge,
- WebviewExecutionService,
- WebviewPostMessageStream,
- SnapWebviewPostMessageStream,
ExcludedSnapPermissions,
ExcludedSnapEndowments,
fetchFunction,
diff --git a/app/lib/snaps/SnapsExecutionWebView.tsx b/app/lib/snaps/SnapsExecutionWebView.tsx
new file mode 100644
index 00000000000..4847ebd6614
--- /dev/null
+++ b/app/lib/snaps/SnapsExecutionWebView.tsx
@@ -0,0 +1,99 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+/* eslint-disable @typescript-eslint/no-require-imports */
+/* eslint-disable import/no-commonjs */
+///: BEGIN:ONLY_INCLUDE_IF(snaps)
+import React, { Component, RefObject } from 'react';
+import { View, ScrollView, NativeSyntheticEvent } from 'react-native';
+import WebView, { WebViewMessageEvent } from 'react-native-webview';
+import { createStyles } from './styles';
+import { WebViewInterface } from '@metamask/snaps-controllers/dist/types/services/webview/WebViewMessageStream';
+import { WebViewError } from 'react-native-webview/lib/WebViewTypes';
+import { PostMessageEvent } from '@metamask/post-message-stream';
+
+const styles = createStyles();
+
+interface SnapsExecutionWebViewProps {
+ injectJavaScript(js: string): void;
+ registerMessageListener(listener: (event: PostMessageEvent) => void): void;
+ unregisterMessageListener(listener: (event: PostMessageEvent) => void): void;
+}
+// This is a hack to allow us to asynchronously await the creation of the WebView.
+let resolveGetWebView: (arg0: SnapsExecutionWebViewProps) => void;
+let rejectGetWebView: (error: NativeSyntheticEvent) => void;
+
+const SNAPS_EE_URL = 'https://execution.metamask.io/webview/4.0.0/index.html';
+
+export const getSnapsWebViewPromise = new Promise(
+ (resolve, reject) => {
+ resolveGetWebView = resolve;
+ rejectGetWebView = reject;
+ },
+);
+
+// This is a class component because storing the references we are don't work in functional components.
+export class SnapsExecutionWebView extends Component {
+ webViewRef: RefObject | any = null;
+ listener: any = null;
+
+ // eslint-disable-next-line @typescript-eslint/no-useless-constructor
+ constructor(props: any) {
+ super(props);
+ }
+
+ setWebViewRef(ref: React.RefObject> | null) {
+ this.webViewRef = ref;
+ }
+
+ onWebViewLoad() {
+ const api = {
+ injectJavaScript: (js: string) => {
+ this.webViewRef?.injectJavaScript(js);
+ },
+ registerMessageListener: (
+ listener: (event: PostMessageEvent) => void,
+ ) => {
+ this.listener = listener;
+ },
+ unregisterMessageListener: (
+ _listener: (event: PostMessageEvent) => void,
+ ) => {
+ this.listener = null;
+ },
+ };
+
+ resolveGetWebView(api);
+ }
+
+ onWebViewError(error: NativeSyntheticEvent) {
+ rejectGetWebView(error);
+ }
+
+ onWebViewMessage(data: WebViewMessageEvent) {
+ if (this.listener) {
+ this.listener(data.nativeEvent);
+ }
+ }
+
+ render() {
+ return (
+
+
+ | null
+ }
+ source={{ uri: SNAPS_EE_URL }}
+ onMessage={this.onWebViewMessage}
+ onError={this.onWebViewError}
+ onLoadEnd={this.onWebViewLoad}
+ // TODO: This should probably change
+ originWhitelist={['*']}
+ javaScriptEnabled
+ />
+
+
+ );
+ }
+}
+
+///: END:ONLY_INCLUDE_IF
diff --git a/app/lib/snaps/index.ts b/app/lib/snaps/index.ts
new file mode 100644
index 00000000000..e6450e80762
--- /dev/null
+++ b/app/lib/snaps/index.ts
@@ -0,0 +1,3 @@
+///: BEGIN:ONLY_INCLUDE_IF(snaps)
+export * from './SnapsExecutionWebView';
+///: END:ONLY_INCLUDE_IF
diff --git a/app/components/UI/SnapsExecutionWebView/styles.ts b/app/lib/snaps/styles.ts
similarity index 100%
rename from app/components/UI/SnapsExecutionWebView/styles.ts
rename to app/lib/snaps/styles.ts
diff --git a/package.json b/package.json
index 26370191ac1..bbc23a4b15f 100644
--- a/package.json
+++ b/package.json
@@ -175,8 +175,8 @@
"@ledgerhq/react-native-hw-transport-ble": "^6.29.5",
"@metamask/address-book-controller": "^3.0.0",
"@metamask/approval-controller": "^3.4.0",
- "@metamask/base-controller": "^4.1.1",
"@metamask/assets-controllers": "^9.0.0",
+ "@metamask/base-controller": "^4.1.1",
"@metamask/composable-controller": "^3.0.0",
"@metamask/contract-metadata": "^2.1.0",
"@metamask/controller-utils": "^4.0.0",
@@ -188,7 +188,7 @@
"@metamask/keyring-controller": "^8.1.0",
"@metamask/logging-controller": "^1.0.1",
"@metamask/network-controller": "^10.0.0",
- "@metamask/permission-controller": "^4.0.1",
+ "@metamask/permission-controller": "7.1.0",
"@metamask/phishing-controller": "^5.0.0",
"@metamask/post-message-stream": "8.0.0",
"@metamask/ppom-validator": "0.24.0",
@@ -429,7 +429,6 @@
"@types/react-native-svg-charts": "^5.0.12",
"@types/react-native-vector-icons": "^6.4.13",
"@types/react-native-video": "^5.0.14",
- "@types/readable-stream": "^4.0.9",
"@types/redux-mock-store": "^1.0.3",
"@types/url-parse": "^1.4.8",
"@types/valid-url": "^1.0.4",
diff --git a/yarn.lock b/yarn.lock
index 0eebb95a378..4f353a5d7dc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3593,7 +3593,7 @@
"@metamask/controller-utils" "^6.0.0"
"@metamask/utils" "^8.2.0"
-"@metamask/approval-controller@3.4.0", "@metamask/approval-controller@^3.3.0", "@metamask/approval-controller@^3.4.0", "@metamask/approval-controller@^3.5.0", "@metamask/approval-controller@^3.5.2", "@metamask/approval-controller@^5.1.2":
+"@metamask/approval-controller@3.4.0", "@metamask/approval-controller@^3.3.0", "@metamask/approval-controller@^3.4.0", "@metamask/approval-controller@^3.5.0", "@metamask/approval-controller@^5.1.2":
version "3.4.0"
resolved "https://registry.yarnpkg.com/@metamask/approval-controller/-/approval-controller-3.4.0.tgz#282900361d42f785578728b45014ff8cb5e557ea"
integrity sha512-DjqrhiX9+W/Fh6Crr7FPJ87Y/uhPWzBvfXGtekv1LHZNmEtUxkrA7aelddUM0fpTdURIGT4aNGBoQudFidc+Lw==
@@ -3634,7 +3634,7 @@
single-call-balance-checker-abi "^1.0.0"
uuid "^8.3.2"
-"@metamask/base-controller@^3.0.0", "@metamask/base-controller@^3.1.0", "@metamask/base-controller@^3.2.0", "@metamask/base-controller@^3.2.1", "@metamask/base-controller@^3.2.2", "@metamask/base-controller@^3.2.3":
+"@metamask/base-controller@^3.0.0", "@metamask/base-controller@^3.1.0", "@metamask/base-controller@^3.2.0", "@metamask/base-controller@^3.2.1", "@metamask/base-controller@^3.2.3":
version "3.2.3"
resolved "https://registry.yarnpkg.com/@metamask/base-controller/-/base-controller-3.2.3.tgz#7436a14f6789acf0814952dabaa70ee4fb7d473c"
integrity sha512-k66oZe7BOEx0D5N5X8feE/32QlrUTmiEHHAZU/yCac2+VHllJOCEQV/cTeaAtgepnEf8O7SskvYZN+eIjgS99w==
@@ -3642,7 +3642,7 @@
"@metamask/utils" "^8.1.0"
immer "^9.0.6"
-"@metamask/base-controller@^4.0.0", "@metamask/base-controller@^4.1.0", "@metamask/base-controller@^4.1.1":
+"@metamask/base-controller@^4.0.0", "@metamask/base-controller@^4.0.1", "@metamask/base-controller@^4.1.0", "@metamask/base-controller@^4.1.1":
version "4.1.1"
resolved "https://registry.yarnpkg.com/@metamask/base-controller/-/base-controller-4.1.1.tgz#9b411adf4822de7382fe69d07bb6b3fc3e738923"
integrity sha512-sJdsd/XlyOa0kRJ16qbM+xeQ8peV1yZcYumJmHCClPK09MkAlxq7EzsrahVZXUCFwcxtSucf244pbttnVqNthw==
@@ -3691,7 +3691,7 @@
ethjs-unit "^0.1.6"
fast-deep-equal "^3.1.3"
-"@metamask/controller-utils@^5.0.1", "@metamask/controller-utils@^5.0.2":
+"@metamask/controller-utils@^5.0.2":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@metamask/controller-utils/-/controller-utils-5.0.2.tgz#f6e848d9b80aca7943e1edae927324982305d1f8"
integrity sha512-bHgyPL+Ah6OBOkjWykA1NpTZdpRhoJjCrvuFf8mFxBJLvXE9m/rw9DYp2Rw9WXonMWK17NxwQv/7bKzsGZnjVQ==
@@ -3990,7 +3990,7 @@
immer "^9.0.6"
uuid "^8.3.2"
-"@metamask/json-rpc-engine@^7.0.0", "@metamask/json-rpc-engine@^7.1.1", "@metamask/json-rpc-engine@^7.3.0", "@metamask/json-rpc-engine@^7.3.2":
+"@metamask/json-rpc-engine@^7.0.0", "@metamask/json-rpc-engine@^7.1.1", "@metamask/json-rpc-engine@^7.3.0", "@metamask/json-rpc-engine@^7.3.1", "@metamask/json-rpc-engine@^7.3.2":
version "7.3.2"
resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.2.tgz#e8f0695811619eef7b7c894ba5cf782db9f1c2cb"
integrity sha512-dVjBPlni4CoiBpESVqrxh6k4OR14w6GRXKSSXHFuITjuhALE42gNCkXTpL4cjNeOBUgTba3eGe5EI8cyc2QLRg==
@@ -4173,20 +4173,19 @@
taim "^1.1.0"
yargs "^7.1.2"
-"@metamask/permission-controller@^4.0.1":
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/@metamask/permission-controller/-/permission-controller-4.1.2.tgz#e4e8f45d97f9420244f3dde879eda9ad9a591c26"
- integrity sha512-t9QSMeArXnfsowf4BENnJXh2dGgqWMC4QpYe0muHnFSmMUiVxvb3x/WKoWfzzKsfErHRRDigV9OIejSDz3EqOA==
+"@metamask/permission-controller@7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@metamask/permission-controller/-/permission-controller-7.1.0.tgz#e6a2e6c66e8b1c4a46a59eac6fdbdc20d0d7d19d"
+ integrity sha512-CrE+TU1MQSMgQJ3PDV3KsDD+mhRr+KQ40/XNL/Vk3ShKHqOkCpZLskIm5cawcqgwkTSoRgRY4DYgipIr1ISgpw==
dependencies:
- "@metamask/approval-controller" "^3.5.2"
- "@metamask/base-controller" "^3.2.2"
- "@metamask/controller-utils" "^5.0.1"
- "@metamask/utils" "^6.2.0"
+ "@metamask/base-controller" "^4.0.1"
+ "@metamask/controller-utils" "^8.0.1"
+ "@metamask/json-rpc-engine" "^7.3.1"
+ "@metamask/rpc-errors" "^6.1.0"
+ "@metamask/utils" "^8.2.0"
"@types/deep-freeze-strict" "^1.1.0"
deep-freeze-strict "^1.1.1"
- eth-rpc-errors "^4.0.2"
immer "^9.0.6"
- json-rpc-engine "^6.1.0"
nanoid "^3.1.31"
"@metamask/permission-controller@^8.0.0":
@@ -8626,14 +8625,6 @@
dependencies:
"@types/react" "*"
-"@types/readable-stream@^4.0.9":
- version "4.0.9"
- resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.9.tgz#b7f84343801107b9bcf3dca01934d30dc8df0360"
- integrity sha512-4cwuvrmNF96M4Nrx0Eep37RwPB1Mth+nCSezsGRv5+PsFyRvDdLd0pil6gVLcWD/bh69INNdwZ98dJwfHpLohA==
- dependencies:
- "@types/node" "*"
- safe-buffer "~5.1.1"
-
"@types/readdir-glob@*":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.1.tgz#27ac2db283e6aa3d110b14ff9da44fcd1a5c38b1"