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"