From 7e93e07498ffa2ca1a1284dc57ee8ef714d7a113 Mon Sep 17 00:00:00 2001 From: Gustavo Antunes <17601467+gantunesr@users.noreply.github.com> Date: Tue, 13 Dec 2022 11:39:31 -0300 Subject: [PATCH] Working version --- app/core/Engine.js | 29 ++++++++++++++- app/core/RPCMethods/RPCMethodMiddleware.ts | 1 + app/core/SnapExecutionService/SnapBridge.ts | 41 ++++++++++++++++++--- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/app/core/Engine.js b/app/core/Engine.js index 17e55d10735..c0b4d57a35f 100644 --- a/app/core/Engine.js +++ b/app/core/Engine.js @@ -53,6 +53,8 @@ import { isZero } from '../util/lodash'; import AnalyticsV2 from '../util/analyticsV2'; import WebviewExecutionService from '../components/Views/Wallet/WebviewExecutionService'; import { SnapBridge } from './SnapExecutionService'; +import { getRpcMethodMiddleware } from './RPCMethods/RPCMethodMiddleware'; + const NON_EMPTY = 'NON_EMPTY'; @@ -215,10 +217,32 @@ class Engine { }); this.setupSnapProvider = (snapId, connectionStream) => { + console.log('method setupSnapProvider', !!connectionStream, snapId); const bridge = new SnapBridge({ snapId, connectionStream, - getRPCMethodMiddleware: (args) => null, + getRPCMethodMiddleware: ({ hostname, getProviderState }) => + getRpcMethodMiddleware({ + hostname, + getProviderState, + navigation: null, + getApprovedHosts: () => null, + setApprovedHosts: () => null, + approveHost: () => null, + // Website info + url: 'https://www.google.com', + title: 'Snap', + icon: null, + // Bookmarks + isHomepage: false, + // Show autocomplete + fromHomepage: false, + toggleUrlModal: () => null, + // Wizard + wizardScrollAdjusted: () => null, + tabId: false, + isWalletConnect: true, + }), }); bridge.setupProviderConnection(); @@ -920,4 +944,7 @@ export default { Object.freeze(instance); return instance; }, + get snapExecutionService() { + return instance.snapExecutionService; + }, }; diff --git a/app/core/RPCMethods/RPCMethodMiddleware.ts b/app/core/RPCMethods/RPCMethodMiddleware.ts index 29d3eaf5c75..6aad782bb08 100644 --- a/app/core/RPCMethods/RPCMethodMiddleware.ts +++ b/app/core/RPCMethods/RPCMethodMiddleware.ts @@ -634,6 +634,7 @@ export const getRpcMethodMiddleware = ({ * initialization. */ metamask_getProviderState: async () => { + console.log('========> metamask_getProviderState'); res.result = { ...getProviderState(), accounts: await getAccounts(), diff --git a/app/core/SnapExecutionService/SnapBridge.ts b/app/core/SnapExecutionService/SnapBridge.ts index 822ba98c72a..1234eaeaf7b 100644 --- a/app/core/SnapExecutionService/SnapBridge.ts +++ b/app/core/SnapExecutionService/SnapBridge.ts @@ -28,7 +28,7 @@ const pump = require('pump'); interface ISnapBridgeProps { snapId: string; - stream: Duplex; + connectionStream: Duplex; getRPCMethodMiddleware: (args: any) => any; } @@ -43,9 +43,14 @@ export default class SnapBridge { #providerProxy: any; #blockTrackerProxy: any; - constructor({ snapId, stream, getRPCMethodMiddleware }: ISnapBridgeProps) { + constructor({ + snapId, + connectionStream, + getRPCMethodMiddleware, + }: ISnapBridgeProps) { + console.log('SnapBridge constructor', snapId, !!connectionStream); this.snapId = snapId; - this.stream = stream; + this.stream = connectionStream; this.getRPCMethodMiddleware = getRPCMethodMiddleware; const { NetworkController, PreferencesController } = Engine.context as any; @@ -125,8 +130,8 @@ export default class SnapBridge { engine.emit('notification', message), ); - engine.push(createOriginMiddleware({ origin: this.snapId })); - engine.push(createLoggerMiddleware({ origin: this.snapId })); + // engine.push(createOriginMiddleware({ origin: this.snapId })); + // engine.push(createLoggerMiddleware({ origin: this.snapId })); // Filter and subscription polyfills engine.push(filterMiddleware); @@ -188,4 +193,30 @@ export default class SnapBridge { selectedAddress, }; }; + + getProviderNetworkState({ network }: { network: string }) { + const { NetworkController } = Engine.context as any; + const networkType = NetworkController.state.provider.type; + const networkProvider = NetworkController.state.provider; + + const isInitialNetwork = + networkType && getAllNetworks().includes(networkType); + let chainId; + + if (isInitialNetwork) { + chainId = NetworksChainId[networkType]; + } else if (networkType === 'rpc') { + chainId = networkProvider.chainId; + } + if (chainId && !chainId.startsWith('0x')) { + // Convert to hex + chainId = `0x${parseInt(chainId, 10).toString(16)}`; + } + + const result = { + networkVersion: network, + chainId, + }; + return result; + } }