diff --git a/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch b/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch new file mode 100644 index 000000000000..0133e49c9f65 --- /dev/null +++ b/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch @@ -0,0 +1,764 @@ +diff --git a/dist/BaseProvider.cjs b/dist/BaseProvider.cjs +index bcb7967af0b6369cc843a159e1c369e5d8a91f12..e476b71774dd89b580f74a5598413bd96c248d26 100644 +--- a/dist/BaseProvider.cjs ++++ b/dist/BaseProvider.cjs +@@ -161,6 +161,7 @@ class BaseProvider extends safe_event_emitter_1.default { + * @param initialState.chainId - The chain ID. + * @param initialState.isUnlocked - Whether the user has unlocked MetaMask. + * @param initialState.networkVersion - The network version. ++ * @param initialState.isConnected - Whether the network is available. + * @fires BaseProvider#_initialized - If `initialState` is defined. + * @fires BaseProvider#connect - If `initialState` is defined. + */ +@@ -169,10 +170,10 @@ class BaseProvider extends safe_event_emitter_1.default { + throw new Error('Provider already initialized.'); + } + if (initialState) { +- const { accounts, chainId, isUnlocked, networkVersion } = initialState; ++ const { accounts, chainId, isUnlocked, networkVersion, isConnected } = initialState; + // EIP-1193 connect +- this._handleConnect(chainId); +- this._handleChainChanged({ chainId, networkVersion }); ++ this._handleConnect({ chainId, isConnected }); ++ this._handleChainChanged({ chainId, networkVersion, isConnected }); + this._handleUnlockStateChanged({ accounts, isUnlocked }); + this._handleAccountsChanged(accounts); + } +@@ -211,11 +212,13 @@ class BaseProvider extends safe_event_emitter_1.default { + * When the provider becomes connected, updates internal state and emits + * required events. Idempotent. + * +- * @param chainId - The ID of the newly connected chain. ++ * @param networkInfo - The options object. ++ * @param networkInfo.chainId - The ID of the newly connected chain. ++ * @param networkInfo.isConnected - Whether the network is available. + * @fires MetaMaskInpageProvider#connect + */ +- _handleConnect(chainId) { +- if (!this._state.isConnected) { ++ _handleConnect({ chainId, isConnected, }) { ++ if (!this._state.isConnected && isConnected) { + this._state.isConnected = true; + this.emit('connect', { chainId }); + this._log.debug(messages_1.default.info.connected(chainId)); +@@ -266,13 +269,14 @@ class BaseProvider extends safe_event_emitter_1.default { + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- _handleChainChanged({ chainId, } = {}) { ++ _handleChainChanged({ chainId, isConnected, } = {}) { + if (!(0, utils_1.isValidChainId)(chainId)) { + this._log.error(messages_1.default.errors.invalidNetworkParams(), { chainId }); + return; + } +- this._handleConnect(chainId); ++ this._handleConnect({ chainId, isConnected }); + if (chainId !== __classPrivateFieldGet(this, _BaseProvider_chainId, "f")) { + __classPrivateFieldSet(this, _BaseProvider_chainId, chainId, "f"); + if (this._state.initialized) { +diff --git a/dist/BaseProvider.cjs.map b/dist/BaseProvider.cjs.map +index 14b1303e2ad0e18c703db24c6ef086d6f6b4fafa..b21ebfa0ab7e7735945c5f86291e5d228cfe20a1 100644 +--- a/dist/BaseProvider.cjs.map ++++ b/dist/BaseProvider.cjs.map +@@ -1 +1 @@ +-{"version":3,"file":"BaseProvider.cjs","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,+DAA0D;AAC1D,qDAA+D;AAC/D,sFAA4D;AAS5D,sEAAqC;AAErC,8DAAkC;AAElC,uCAAgE;AA2ChE;;;;;;;;;GASG;AACH,MAAsB,YAAa,SAAQ,4BAAgB;IA4BzD;;;;;;;;OAQG;IACH,YAAY,EACV,MAAM,GAAG,OAAO,EAChB,iBAAiB,GAAG,GAAG,EACvB,aAAa,GAAG,EAAE,MACK,EAAE;QACzB,KAAK,EAAE,CAAC;QA3BV;;;WAGG;QACH,wCAAwB;QAExB;;;;WAIG;QACH,gDAAgC;QAkB9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QAEnB,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAExC,gBAAgB;QAChB,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,YAAY,CAAC,aAAa;SAC9B,CAAC;QAEF,eAAe;QACf,uBAAA,IAAI,iCAAoB,IAAI,MAAA,CAAC;QAC7B,uBAAA,IAAI,yBAAY,IAAI,MAAA,CAAC;QAErB,gEAAgE;QAChE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,gDAAgD;QAChD,EAAE;QACF,uEAAuE;QACvE,cAAc;QACd,MAAM,SAAS,GAAG,IAAI,+BAAa,EAAE,CAAC;QACtC,aAAa,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IAEtB,IAAI,OAAO;QACT,OAAO,uBAAA,IAAI,6BAAS,CAAC;IACvB,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,uBAAA,IAAI,qCAAiB,CAAC;IAC/B,CAAC;IAED,sBAAsB;IACtB,iBAAiB;IACjB,sBAAsB;IAEtB;;;;OAIG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACjC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,OAAO,CAAO,IAAsB;QACxC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,sBAAS,CAAC,cAAc,CAAC;gBAC7B,OAAO,EAAE,kBAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE;gBAC7C,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAEhC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,sBAAS,CAAC,cAAc,CAAC;gBAC7B,OAAO,EAAE,kBAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE;gBAC/C,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC;QAED,IACE,MAAM,KAAK,SAAS;YACpB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,EAC/C,CAAC;YACD,MAAM,sBAAS,CAAC,cAAc,CAAC;gBAC7B,OAAO,EAAE,kBAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE;gBAC/C,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GACX,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YACrC,CAAC,CAAC;gBACE,MAAM;aACP;YACH,CAAC,CAAC;gBACE,MAAM;gBACN,MAAM;aACP,CAAC;QAER,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAA,6BAAqB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,kBAAkB;IAClB,sBAAsB;IAEtB;;;;;;;;;;;;;;;;OAgBG;IACO,gBAAgB,CAAC,YAK1B;QACC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC;YAEvE,mBAAmB;YACnB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,uEAAuE;QACvE,aAAa;QACb,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IAED;;;;;;;OAOG;IACO,WAAW,CACnB,OAAgE,EAChE,QAAkC;QAElC,IAAI,eAAe,GAAG,QAAQ,CAAC;QAE/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,CAAC;YAED,IACE,OAAO,CAAC,MAAM,KAAK,cAAc;gBACjC,OAAO,CAAC,MAAM,KAAK,qBAAqB,EACxC,CAAC;gBACD,2BAA2B;gBAC3B,eAAe,GAAG,CAChB,KAAY,EACZ,QAAkC,EAClC,EAAE;oBACF,IAAI,CAAC,sBAAsB,CACzB,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,OAAO,CAAC,MAAM,KAAK,cAAc,CAClC,CAAC;oBACF,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC5B,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAyB,EAAE,eAAe,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAA2B,EAAE,eAAe,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;;OAMG;IACO,cAAc,CAAC,OAAe;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACO,iBAAiB,CAAC,aAAsB,EAAE,YAAqB;QACvE,IACE,IAAI,CAAC,MAAM,CAAC,WAAW;YACvB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,IAAI,CAAC,aAAa,CAAC,EAC1D,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,IAAI,KAAK,CAAC;YACV,IAAI,aAAa,EAAE,CAAC;gBAClB,KAAK,GAAG,IAAI,yBAAY,CACtB,IAAI,EAAE,kBAAkB;gBACxB,YAAY,IAAI,kBAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,CAC/C,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,IAAI,yBAAY,CACtB,IAAI,EAAE,iBAAiB;gBACvB,YAAY,IAAI,kBAAQ,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAC1D,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvB,uBAAA,IAAI,yBAAY,IAAI,MAAA,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC5B,uBAAA,IAAI,iCAAoB,IAAI,MAAA,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,yBAAyB,GAAG,IAAI,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACO,mBAAmB,CAAC,EAC5B,OAAO,MAGO,EAAE;QAChB,IAAI,CAAC,IAAA,sBAAc,EAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7B,IAAI,OAAO,KAAK,uBAAA,IAAI,6BAAS,EAAE,CAAC;YAC9B,uBAAA,IAAI,yBAAY,OAAO,MAAA,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAA,IAAI,6BAAS,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACO,sBAAsB,CAC9B,QAAmB,EACnB,aAAa,GAAG,KAAK;QAErB,IAAI,SAAS,GAAG,QAAQ,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CACb,wEAAwE,EACxE,QAAQ,CACT,CAAC;YACF,SAAS,GAAG,EAAE,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,KAAK,CACb,gEAAgE,EAChE,QAAQ,CACT,CAAC;gBACF,SAAS,GAAG,EAAE,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC,IAAA,yBAAM,EAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAC7C,sEAAsE;YACtE,UAAU;YACV,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CACb,iFAAiF,EACjF,SAAS,CACV,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAqB,CAAC;YAE7C,yBAAyB;YACzB,IAAI,uBAAA,IAAI,qCAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,uBAAA,IAAI,iCAAqB,SAAS,CAAC,CAAC,CAAY,IAAI,IAAI,MAAA,CAAC;YAC3D,CAAC;YAED,4DAA4D;YAC5D,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,MAAM,aAAa,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACO,yBAAyB,CAAC,EAClC,QAAQ,EACR,UAAU,MACuC,EAAE;QACnD,IAAI,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CACb,0EAA0E,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YACpC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;;AAhaH,oCAiaC;;AA1ZkB,0BAAa,GAAsB;IAClD,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,KAAK;IAClB,yBAAyB,EAAE,KAAK;CACjC,AAN6B,CAM5B","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { JsonRpcEngine } from '@metamask/json-rpc-engine';\nimport { rpcErrors, JsonRpcError } from '@metamask/rpc-errors';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type {\n JsonRpcRequest,\n JsonRpcId,\n JsonRpcVersion2,\n JsonRpcSuccess,\n JsonRpcParams,\n Json,\n} from '@metamask/utils';\nimport dequal from 'fast-deep-equal';\n\nimport messages from './messages';\nimport type { ConsoleLike, Maybe } from './utils';\nimport { getRpcPromiseCallback, isValidChainId } from './utils';\n\nexport type UnvalidatedJsonRpcRequest = {\n id?: JsonRpcId;\n jsonrpc?: JsonRpcVersion2;\n method: string;\n params?: unknown;\n};\n\nexport type BaseProviderOptions = {\n /**\n * The logging API to use.\n */\n logger?: ConsoleLike;\n\n /**\n * The maximum number of event listeners.\n */\n maxEventListeners?: number;\n\n /**\n * `@metamask/json-rpc-engine` middleware. The middleware will be inserted in the given\n * order immediately after engine initialization.\n */\n rpcMiddleware?: JsonRpcMiddleware[];\n};\n\nexport type RequestArguments = {\n /** The RPC method to request. */\n method: string;\n\n /** The params of the RPC method, if any. */\n params?: unknown[] | Record;\n};\n\nexport type BaseProviderState = {\n accounts: null | string[];\n isConnected: boolean;\n isUnlocked: boolean;\n initialized: boolean;\n isPermanentlyDisconnected: boolean;\n};\n\n/**\n * An abstract class implementing the EIP-1193 interface. Implementers must:\n *\n * 1. At initialization, push a middleware to the internal `_rpcEngine` that\n * hands off requests to the server and receives responses in return.\n * 2. At initialization, retrieve initial state and call\n * {@link BaseProvider._initializeState} **once**.\n * 3. Ensure that the provider's state is synchronized with the wallet.\n * 4. Ensure that notifications are received and emitted as appropriate.\n */\nexport abstract class BaseProvider extends SafeEventEmitter {\n protected readonly _log: ConsoleLike;\n\n protected _state: BaseProviderState;\n\n protected _rpcEngine: JsonRpcEngine;\n\n protected static _defaultState: BaseProviderState = {\n accounts: null,\n isConnected: false,\n isUnlocked: false,\n initialized: false,\n isPermanentlyDisconnected: false,\n };\n\n /**\n * The chain ID of the currently connected Ethereum chain.\n * See [chainId.network]{@link https://chainid.network} for more information.\n */\n #chainId: string | null;\n\n /**\n * The user's currently selected Ethereum address.\n * If null, MetaMask is either locked or the user has not permitted any\n * addresses to be viewed.\n */\n #selectedAddress: string | null;\n\n /**\n * Create a new instance of the provider.\n *\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack. Default: [].\n */\n constructor({\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: BaseProviderOptions = {}) {\n super();\n\n this._log = logger;\n\n this.setMaxListeners(maxEventListeners);\n\n // Private state\n this._state = {\n ...BaseProvider._defaultState,\n };\n\n // Public state\n this.#selectedAddress = null;\n this.#chainId = null;\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleAccountsChanged = this._handleAccountsChanged.bind(this);\n this._handleConnect = this._handleConnect.bind(this);\n this._handleChainChanged = this._handleChainChanged.bind(this);\n this._handleDisconnect = this._handleDisconnect.bind(this);\n this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);\n this._rpcRequest = this._rpcRequest.bind(this);\n this.request = this.request.bind(this);\n\n // Handle RPC requests via dapp-side RPC engine.\n //\n // ATTN: Implementers must push a middleware that hands off requests to\n // the server.\n const rpcEngine = new JsonRpcEngine();\n rpcMiddleware.forEach((middleware) => rpcEngine.push(middleware));\n this._rpcEngine = rpcEngine;\n }\n\n //====================\n // Public Properties\n //====================\n\n get chainId(): string | null {\n return this.#chainId;\n }\n\n get selectedAddress(): string | null {\n return this.#selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Returns whether the provider can process RPC requests.\n *\n * @returns Whether the provider can process RPC requests.\n */\n isConnected(): boolean {\n return this._state.isConnected;\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n * Resolves with the result of the method call, or rejects on error.\n *\n * @param args - The RPC request arguments.\n * @param args.method - The RPC method name.\n * @param args.params - The parameters for the RPC method.\n * @returns A Promise that resolves with the result of the RPC method,\n * or rejects if an error is encountered.\n */\n async request(args: RequestArguments): Promise> {\n if (!args || typeof args !== 'object' || Array.isArray(args)) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestArgs(),\n data: args,\n });\n }\n\n const { method, params } = args;\n\n if (typeof method !== 'string' || method.length === 0) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestMethod(),\n data: args,\n });\n }\n\n if (\n params !== undefined &&\n !Array.isArray(params) &&\n (typeof params !== 'object' || params === null)\n ) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestParams(),\n data: args,\n });\n }\n\n const payload =\n params === undefined || params === null\n ? {\n method,\n }\n : {\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(payload, getRpcPromiseCallback(resolve, reject));\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Sets initial state if provided and marks this provider as initialized.\n * Throws if called more than once.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @param initialState - The provider's initial state.\n * @param initialState.accounts - The user's accounts.\n * @param initialState.chainId - The chain ID.\n * @param initialState.isUnlocked - Whether the user has unlocked MetaMask.\n * @param initialState.networkVersion - The network version.\n * @fires BaseProvider#_initialized - If `initialState` is defined.\n * @fires BaseProvider#connect - If `initialState` is defined.\n */\n protected _initializeState(initialState?: {\n accounts: string[];\n chainId: string;\n isUnlocked: boolean;\n networkVersion?: string;\n }) {\n if (this._state.initialized) {\n throw new Error('Provider already initialized.');\n }\n\n if (initialState) {\n const { accounts, chainId, isUnlocked, networkVersion } = initialState;\n\n // EIP-1193 connect\n this._handleConnect(chainId);\n this._handleChainChanged({ chainId, networkVersion });\n this._handleUnlockStateChanged({ accounts, isUnlocked });\n this._handleAccountsChanged(accounts);\n }\n\n // Mark provider as initialized regardless of whether initial state was\n // retrieved.\n this._state.initialized = true;\n this.emit('_initialized');\n }\n\n /**\n * Internal RPC method. Forwards requests to background via the RPC engine.\n * Also remap ids inbound and outbound.\n *\n * @param payload - The RPC request object.\n * @param callback - The consumer's callback.\n * @returns The result of the RPC request.\n */\n protected _rpcRequest(\n payload: UnvalidatedJsonRpcRequest | UnvalidatedJsonRpcRequest[],\n callback: (...args: any[]) => void,\n ) {\n let callbackWrapper = callback;\n\n if (!Array.isArray(payload)) {\n if (!payload.jsonrpc) {\n payload.jsonrpc = '2.0';\n }\n\n if (\n payload.method === 'eth_accounts' ||\n payload.method === 'eth_requestAccounts'\n ) {\n // handle accounts changing\n callbackWrapper = (\n error: Error,\n response: JsonRpcSuccess,\n ) => {\n this._handleAccountsChanged(\n response.result ?? [],\n payload.method === 'eth_accounts',\n );\n callback(error, response);\n };\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest, callbackWrapper);\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest[], callbackWrapper);\n }\n\n /**\n * When the provider becomes connected, updates internal state and emits\n * required events. Idempotent.\n *\n * @param chainId - The ID of the newly connected chain.\n * @fires MetaMaskInpageProvider#connect\n */\n protected _handleConnect(chainId: string) {\n if (!this._state.isConnected) {\n this._state.isConnected = true;\n this.emit('connect', { chainId });\n this._log.debug(messages.info.connected(chainId));\n }\n }\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n if (\n this._state.isConnected ||\n (!this._state.isPermanentlyDisconnected && !isRecoverable)\n ) {\n this._state.isConnected = false;\n\n let error;\n if (isRecoverable) {\n error = new JsonRpcError(\n 1013, // Try again later\n errorMessage ?? messages.errors.disconnected(),\n );\n this._log.debug(error);\n } else {\n error = new JsonRpcError(\n 1011, // Internal error\n errorMessage ?? messages.errors.permanentlyDisconnected(),\n );\n this._log.error(error);\n this.#chainId = null;\n this._state.accounts = null;\n this.#selectedAddress = null;\n this._state.isUnlocked = false;\n this._state.isPermanentlyDisconnected = true;\n }\n\n this.emit('disconnect', error);\n }\n }\n\n /**\n * Upon receipt of a new `chainId`, emits the corresponding event and sets\n * and sets relevant public state. Does nothing if the given `chainId` is\n * equivalent to the existing value.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n */\n protected _handleChainChanged({\n chainId,\n }:\n | { chainId?: string | undefined; networkVersion?: string | undefined }\n | undefined = {}) {\n if (!isValidChainId(chainId)) {\n this._log.error(messages.errors.invalidNetworkParams(), { chainId });\n return;\n }\n\n this._handleConnect(chainId);\n\n if (chainId !== this.#chainId) {\n this.#chainId = chainId;\n if (this._state.initialized) {\n this.emit('chainChanged', this.#chainId);\n }\n }\n }\n\n /**\n * Called when accounts may have changed. Diffs the new accounts value with\n * the current one, updates all state as necessary, and emits the\n * accountsChanged event.\n *\n * @param accounts - The new accounts value.\n * @param isEthAccounts - Whether the accounts value was returned by\n * a call to eth_accounts.\n */\n protected _handleAccountsChanged(\n accounts: unknown[],\n isEthAccounts = false,\n ): void {\n let _accounts = accounts;\n\n if (!Array.isArray(accounts)) {\n this._log.error(\n 'MetaMask: Received invalid accounts parameter. Please report this bug.',\n accounts,\n );\n _accounts = [];\n }\n\n for (const account of accounts) {\n if (typeof account !== 'string') {\n this._log.error(\n 'MetaMask: Received non-string account. Please report this bug.',\n accounts,\n );\n _accounts = [];\n break;\n }\n }\n\n // emit accountsChanged if anything about the accounts array has changed\n if (!dequal(this._state.accounts, _accounts)) {\n // we should always have the correct accounts even before eth_accounts\n // returns\n if (isEthAccounts && this._state.accounts !== null) {\n this._log.error(\n `MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`,\n _accounts,\n );\n }\n\n this._state.accounts = _accounts as string[];\n\n // handle selectedAddress\n if (this.#selectedAddress !== _accounts[0]) {\n this.#selectedAddress = (_accounts[0] as string) || null;\n }\n\n // finally, after all state has been updated, emit the event\n if (this._state.initialized) {\n const _nextAccounts = [..._accounts];\n this.emit('accountsChanged', _nextAccounts);\n }\n }\n }\n\n /**\n * Upon receipt of a new isUnlocked state, sets relevant public state.\n * Calls the accounts changed handler with the received accounts, or an empty\n * array.\n *\n * Does nothing if the received value is equal to the existing value.\n * There are no lock/unlock events.\n *\n * @param opts - Options bag.\n * @param opts.accounts - The exposed accounts, if any.\n * @param opts.isUnlocked - The latest isUnlocked value.\n */\n protected _handleUnlockStateChanged({\n accounts,\n isUnlocked,\n }: { accounts?: string[]; isUnlocked?: boolean } = {}) {\n if (typeof isUnlocked !== 'boolean') {\n this._log.error(\n 'MetaMask: Received invalid isUnlocked parameter. Please report this bug.',\n );\n return;\n }\n\n if (isUnlocked !== this._state.isUnlocked) {\n this._state.isUnlocked = isUnlocked;\n this._handleAccountsChanged(accounts ?? []);\n }\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"BaseProvider.cjs","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { JsonRpcEngine } from '@metamask/json-rpc-engine';\nimport { rpcErrors, JsonRpcError } from '@metamask/rpc-errors';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type {\n JsonRpcRequest,\n JsonRpcId,\n JsonRpcVersion2,\n JsonRpcSuccess,\n JsonRpcParams,\n Json,\n} from '@metamask/utils';\nimport dequal from 'fast-deep-equal';\n\nimport messages from './messages';\nimport type { ConsoleLike, Maybe } from './utils';\nimport { getRpcPromiseCallback, isValidChainId } from './utils';\n\nexport type UnvalidatedJsonRpcRequest = {\n id?: JsonRpcId;\n jsonrpc?: JsonRpcVersion2;\n method: string;\n params?: unknown;\n};\n\nexport type BaseProviderOptions = {\n /**\n * The logging API to use.\n */\n logger?: ConsoleLike;\n\n /**\n * The maximum number of event listeners.\n */\n maxEventListeners?: number;\n\n /**\n * `@metamask/json-rpc-engine` middleware. The middleware will be inserted in the given\n * order immediately after engine initialization.\n */\n rpcMiddleware?: JsonRpcMiddleware[];\n};\n\nexport type RequestArguments = {\n /** The RPC method to request. */\n method: string;\n\n /** The params of the RPC method, if any. */\n params?: unknown[] | Record;\n};\n\nexport type BaseProviderState = {\n accounts: null | string[];\n isConnected: boolean;\n isUnlocked: boolean;\n initialized: boolean;\n isPermanentlyDisconnected: boolean;\n};\n\n/**\n * An abstract class implementing the EIP-1193 interface. Implementers must:\n *\n * 1. At initialization, push a middleware to the internal `_rpcEngine` that\n * hands off requests to the server and receives responses in return.\n * 2. At initialization, retrieve initial state and call\n * {@link BaseProvider._initializeState} **once**.\n * 3. Ensure that the provider's state is synchronized with the wallet.\n * 4. Ensure that notifications are received and emitted as appropriate.\n */\nexport abstract class BaseProvider extends SafeEventEmitter {\n protected readonly _log: ConsoleLike;\n\n protected _state: BaseProviderState;\n\n protected _rpcEngine: JsonRpcEngine;\n\n protected static _defaultState: BaseProviderState = {\n accounts: null,\n isConnected: false,\n isUnlocked: false,\n initialized: false,\n isPermanentlyDisconnected: false,\n };\n\n /**\n * The chain ID of the currently connected Ethereum chain.\n * See [chainId.network]{@link https://chainid.network} for more information.\n */\n #chainId: string | null;\n\n /**\n * The user's currently selected Ethereum address.\n * If null, MetaMask is either locked or the user has not permitted any\n * addresses to be viewed.\n */\n #selectedAddress: string | null;\n\n /**\n * Create a new instance of the provider.\n *\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack. Default: [].\n */\n constructor({\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: BaseProviderOptions = {}) {\n super();\n\n this._log = logger;\n\n this.setMaxListeners(maxEventListeners);\n\n // Private state\n this._state = {\n ...BaseProvider._defaultState,\n };\n\n // Public state\n this.#selectedAddress = null;\n this.#chainId = null;\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleAccountsChanged = this._handleAccountsChanged.bind(this);\n this._handleConnect = this._handleConnect.bind(this);\n this._handleChainChanged = this._handleChainChanged.bind(this);\n this._handleDisconnect = this._handleDisconnect.bind(this);\n this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);\n this._rpcRequest = this._rpcRequest.bind(this);\n this.request = this.request.bind(this);\n\n // Handle RPC requests via dapp-side RPC engine.\n //\n // ATTN: Implementers must push a middleware that hands off requests to\n // the server.\n const rpcEngine = new JsonRpcEngine();\n rpcMiddleware.forEach((middleware) => rpcEngine.push(middleware));\n this._rpcEngine = rpcEngine;\n }\n\n //====================\n // Public Properties\n //====================\n\n get chainId(): string | null {\n return this.#chainId;\n }\n\n get selectedAddress(): string | null {\n return this.#selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Returns whether the provider can process RPC requests.\n *\n * @returns Whether the provider can process RPC requests.\n */\n isConnected(): boolean {\n return this._state.isConnected;\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n * Resolves with the result of the method call, or rejects on error.\n *\n * @param args - The RPC request arguments.\n * @param args.method - The RPC method name.\n * @param args.params - The parameters for the RPC method.\n * @returns A Promise that resolves with the result of the RPC method,\n * or rejects if an error is encountered.\n */\n async request(args: RequestArguments): Promise> {\n if (!args || typeof args !== 'object' || Array.isArray(args)) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestArgs(),\n data: args,\n });\n }\n\n const { method, params } = args;\n\n if (typeof method !== 'string' || method.length === 0) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestMethod(),\n data: args,\n });\n }\n\n if (\n params !== undefined &&\n !Array.isArray(params) &&\n (typeof params !== 'object' || params === null)\n ) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestParams(),\n data: args,\n });\n }\n\n const payload =\n params === undefined || params === null\n ? {\n method,\n }\n : {\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(payload, getRpcPromiseCallback(resolve, reject));\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Sets initial state if provided and marks this provider as initialized.\n * Throws if called more than once.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @param initialState - The provider's initial state.\n * @param initialState.accounts - The user's accounts.\n * @param initialState.chainId - The chain ID.\n * @param initialState.isUnlocked - Whether the user has unlocked MetaMask.\n * @param initialState.networkVersion - The network version.\n * @param initialState.isConnected - Whether the network is available.\n * @fires BaseProvider#_initialized - If `initialState` is defined.\n * @fires BaseProvider#connect - If `initialState` is defined.\n */\n protected _initializeState(initialState?: {\n accounts: string[];\n chainId: string;\n isUnlocked: boolean;\n networkVersion?: string;\n isConnected?: boolean;\n }) {\n if (this._state.initialized) {\n throw new Error('Provider already initialized.');\n }\n\n if (initialState) {\n const { accounts, chainId, isUnlocked, networkVersion, isConnected } =\n initialState;\n\n // EIP-1193 connect\n this._handleConnect({ chainId, isConnected });\n this._handleChainChanged({ chainId, networkVersion, isConnected });\n this._handleUnlockStateChanged({ accounts, isUnlocked });\n this._handleAccountsChanged(accounts);\n }\n\n // Mark provider as initialized regardless of whether initial state was\n // retrieved.\n this._state.initialized = true;\n this.emit('_initialized');\n }\n\n /**\n * Internal RPC method. Forwards requests to background via the RPC engine.\n * Also remap ids inbound and outbound.\n *\n * @param payload - The RPC request object.\n * @param callback - The consumer's callback.\n * @returns The result of the RPC request.\n */\n protected _rpcRequest(\n payload: UnvalidatedJsonRpcRequest | UnvalidatedJsonRpcRequest[],\n callback: (...args: any[]) => void,\n ) {\n let callbackWrapper = callback;\n\n if (!Array.isArray(payload)) {\n if (!payload.jsonrpc) {\n payload.jsonrpc = '2.0';\n }\n\n if (\n payload.method === 'eth_accounts' ||\n payload.method === 'eth_requestAccounts'\n ) {\n // handle accounts changing\n callbackWrapper = (\n error: Error,\n response: JsonRpcSuccess,\n ) => {\n this._handleAccountsChanged(\n response.result ?? [],\n payload.method === 'eth_accounts',\n );\n callback(error, response);\n };\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest, callbackWrapper);\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest[], callbackWrapper);\n }\n\n /**\n * When the provider becomes connected, updates internal state and emits\n * required events. Idempotent.\n *\n * @param networkInfo - The options object.\n * @param networkInfo.chainId - The ID of the newly connected chain.\n * @param networkInfo.isConnected - Whether the network is available.\n * @fires MetaMaskInpageProvider#connect\n */\n protected _handleConnect({\n chainId,\n isConnected,\n }: {\n chainId: string;\n isConnected?: boolean | undefined;\n }) {\n if (!this._state.isConnected && isConnected) {\n this._state.isConnected = true;\n this.emit('connect', { chainId });\n this._log.debug(messages.info.connected(chainId));\n }\n }\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n if (\n this._state.isConnected ||\n (!this._state.isPermanentlyDisconnected && !isRecoverable)\n ) {\n this._state.isConnected = false;\n\n let error;\n if (isRecoverable) {\n error = new JsonRpcError(\n 1013, // Try again later\n errorMessage ?? messages.errors.disconnected(),\n );\n this._log.debug(error);\n } else {\n error = new JsonRpcError(\n 1011, // Internal error\n errorMessage ?? messages.errors.permanentlyDisconnected(),\n );\n this._log.error(error);\n this.#chainId = null;\n this._state.accounts = null;\n this.#selectedAddress = null;\n this._state.isUnlocked = false;\n this._state.isPermanentlyDisconnected = true;\n }\n\n this.emit('disconnect', error);\n }\n }\n\n /**\n * Upon receipt of a new `chainId`, emits the corresponding event and sets\n * and sets relevant public state. Does nothing if the given `chainId` is\n * equivalent to the existing value.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.isConnected - Whether the network is available.\n */\n protected _handleChainChanged({\n chainId,\n isConnected,\n }:\n | {\n chainId?: string;\n networkVersion?: string | undefined;\n isConnected?: boolean | undefined;\n }\n | undefined = {}) {\n if (!isValidChainId(chainId)) {\n this._log.error(messages.errors.invalidNetworkParams(), { chainId });\n return;\n }\n\n this._handleConnect({ chainId, isConnected });\n\n if (chainId !== this.#chainId) {\n this.#chainId = chainId;\n if (this._state.initialized) {\n this.emit('chainChanged', this.#chainId);\n }\n }\n }\n\n /**\n * Called when accounts may have changed. Diffs the new accounts value with\n * the current one, updates all state as necessary, and emits the\n * accountsChanged event.\n *\n * @param accounts - The new accounts value.\n * @param isEthAccounts - Whether the accounts value was returned by\n * a call to eth_accounts.\n */\n protected _handleAccountsChanged(\n accounts: unknown[],\n isEthAccounts = false,\n ): void {\n let _accounts = accounts;\n\n if (!Array.isArray(accounts)) {\n this._log.error(\n 'MetaMask: Received invalid accounts parameter. Please report this bug.',\n accounts,\n );\n _accounts = [];\n }\n\n for (const account of accounts) {\n if (typeof account !== 'string') {\n this._log.error(\n 'MetaMask: Received non-string account. Please report this bug.',\n accounts,\n );\n _accounts = [];\n break;\n }\n }\n\n // emit accountsChanged if anything about the accounts array has changed\n if (!dequal(this._state.accounts, _accounts)) {\n // we should always have the correct accounts even before eth_accounts\n // returns\n if (isEthAccounts && this._state.accounts !== null) {\n this._log.error(\n `MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`,\n _accounts,\n );\n }\n\n this._state.accounts = _accounts as string[];\n\n // handle selectedAddress\n if (this.#selectedAddress !== _accounts[0]) {\n this.#selectedAddress = (_accounts[0] as string) || null;\n }\n\n // finally, after all state has been updated, emit the event\n if (this._state.initialized) {\n const _nextAccounts = [..._accounts];\n this.emit('accountsChanged', _nextAccounts);\n }\n }\n }\n\n /**\n * Upon receipt of a new isUnlocked state, sets relevant public state.\n * Calls the accounts changed handler with the received accounts, or an empty\n * array.\n *\n * Does nothing if the received value is equal to the existing value.\n * There are no lock/unlock events.\n *\n * @param opts - Options bag.\n * @param opts.accounts - The exposed accounts, if any.\n * @param opts.isUnlocked - The latest isUnlocked value.\n */\n protected _handleUnlockStateChanged({\n accounts,\n isUnlocked,\n }: { accounts?: string[]; isUnlocked?: boolean } = {}) {\n if (typeof isUnlocked !== 'boolean') {\n this._log.error(\n 'MetaMask: Received invalid isUnlocked parameter. Please report this bug.',\n );\n return;\n }\n\n if (isUnlocked !== this._state.isUnlocked) {\n this._state.isUnlocked = isUnlocked;\n this._handleAccountsChanged(accounts ?? []);\n }\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/BaseProvider.d.cts b/dist/BaseProvider.d.cts +index 97187da7014911da7913f52893e6f754b1a46a2a..f729aef27f0c79dd7fbc8030200dd32f7cc95309 100644 +--- a/dist/BaseProvider.d.cts ++++ b/dist/BaseProvider.d.cts +@@ -96,6 +96,7 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + * @param initialState.chainId - The chain ID. + * @param initialState.isUnlocked - Whether the user has unlocked MetaMask. + * @param initialState.networkVersion - The network version. ++ * @param initialState.isConnected - Whether the network is available. + * @fires BaseProvider#_initialized - If `initialState` is defined. + * @fires BaseProvider#connect - If `initialState` is defined. + */ +@@ -104,6 +105,7 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + chainId: string; + isUnlocked: boolean; + networkVersion?: string; ++ isConnected?: boolean; + }): void; + /** + * Internal RPC method. Forwards requests to background via the RPC engine. +@@ -118,10 +120,15 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + * When the provider becomes connected, updates internal state and emits + * required events. Idempotent. + * +- * @param chainId - The ID of the newly connected chain. ++ * @param networkInfo - The options object. ++ * @param networkInfo.chainId - The ID of the newly connected chain. ++ * @param networkInfo.isConnected - Whether the network is available. + * @fires MetaMaskInpageProvider#connect + */ +- protected _handleConnect(chainId: string): void; ++ protected _handleConnect({ chainId, isConnected, }: { ++ chainId: string; ++ isConnected?: boolean | undefined; ++ }): void; + /** + * When the provider becomes disconnected, updates internal state and emits + * required events. Idempotent with respect to the isRecoverable parameter. +@@ -145,10 +152,12 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- protected _handleChainChanged({ chainId, }?: { +- chainId?: string | undefined; ++ protected _handleChainChanged({ chainId, isConnected, }?: { ++ chainId?: string; + networkVersion?: string | undefined; ++ isConnected?: boolean | undefined; + } | undefined): void; + /** + * Called when accounts may have changed. Diffs the new accounts value with +diff --git a/dist/BaseProvider.d.cts.map b/dist/BaseProvider.d.cts.map +index 9026d2115feee2d102e1367fab7084614c63b102..36543d383d3f8cbf6ad69652c59334e90471ebb6 100644 +--- a/dist/BaseProvider.d.cts.map ++++ b/dist/BaseProvider.d.cts.map +@@ -1 +1 @@ +-{"version":3,"file":"BaseProvider.d.cts","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"BaseProvider.d.cts","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/dist/BaseProvider.d.mts b/dist/BaseProvider.d.mts +index 98b6fae43b78c76d100452d5f53d129630672ed6..522ea6d7ed80856ef63c70e9c8fb9645a6f2ee10 100644 +--- a/dist/BaseProvider.d.mts ++++ b/dist/BaseProvider.d.mts +@@ -96,6 +96,7 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + * @param initialState.chainId - The chain ID. + * @param initialState.isUnlocked - Whether the user has unlocked MetaMask. + * @param initialState.networkVersion - The network version. ++ * @param initialState.isConnected - Whether the network is available. + * @fires BaseProvider#_initialized - If `initialState` is defined. + * @fires BaseProvider#connect - If `initialState` is defined. + */ +@@ -104,6 +105,7 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + chainId: string; + isUnlocked: boolean; + networkVersion?: string; ++ isConnected?: boolean; + }): void; + /** + * Internal RPC method. Forwards requests to background via the RPC engine. +@@ -118,10 +120,15 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + * When the provider becomes connected, updates internal state and emits + * required events. Idempotent. + * +- * @param chainId - The ID of the newly connected chain. ++ * @param networkInfo - The options object. ++ * @param networkInfo.chainId - The ID of the newly connected chain. ++ * @param networkInfo.isConnected - Whether the network is available. + * @fires MetaMaskInpageProvider#connect + */ +- protected _handleConnect(chainId: string): void; ++ protected _handleConnect({ chainId, isConnected, }: { ++ chainId: string; ++ isConnected?: boolean | undefined; ++ }): void; + /** + * When the provider becomes disconnected, updates internal state and emits + * required events. Idempotent with respect to the isRecoverable parameter. +@@ -145,10 +152,12 @@ export declare abstract class BaseProvider extends SafeEventEmitter { + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- protected _handleChainChanged({ chainId, }?: { +- chainId?: string | undefined; ++ protected _handleChainChanged({ chainId, isConnected, }?: { ++ chainId?: string; + networkVersion?: string | undefined; ++ isConnected?: boolean | undefined; + } | undefined): void; + /** + * Called when accounts may have changed. Diffs the new accounts value with +diff --git a/dist/BaseProvider.d.mts.map b/dist/BaseProvider.d.mts.map +index a3f28b3fa7ff6f8d79235e5dbe9ee1d4ec7a03c7..22ecc4cadb232efdf9b4502e6e286750c7131a88 100644 +--- a/dist/BaseProvider.d.mts.map ++++ b/dist/BaseProvider.d.mts.map +@@ -1 +1 @@ +-{"version":3,"file":"BaseProvider.d.mts","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"BaseProvider.d.mts","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/dist/BaseProvider.mjs b/dist/BaseProvider.mjs +index 2a88b945be89d73d04a075508d6f2858a8c45feb..7bceb5f91ef9ce13c26145e190c29a092dc3f253 100644 +--- a/dist/BaseProvider.mjs ++++ b/dist/BaseProvider.mjs +@@ -162,6 +162,7 @@ export class BaseProvider extends SafeEventEmitter { + * @param initialState.chainId - The chain ID. + * @param initialState.isUnlocked - Whether the user has unlocked MetaMask. + * @param initialState.networkVersion - The network version. ++ * @param initialState.isConnected - Whether the network is available. + * @fires BaseProvider#_initialized - If `initialState` is defined. + * @fires BaseProvider#connect - If `initialState` is defined. + */ +@@ -170,10 +171,10 @@ export class BaseProvider extends SafeEventEmitter { + throw new Error('Provider already initialized.'); + } + if (initialState) { +- const { accounts, chainId, isUnlocked, networkVersion } = initialState; ++ const { accounts, chainId, isUnlocked, networkVersion, isConnected } = initialState; + // EIP-1193 connect +- this._handleConnect(chainId); +- this._handleChainChanged({ chainId, networkVersion }); ++ this._handleConnect({ chainId, isConnected }); ++ this._handleChainChanged({ chainId, networkVersion, isConnected }); + this._handleUnlockStateChanged({ accounts, isUnlocked }); + this._handleAccountsChanged(accounts); + } +@@ -212,11 +213,13 @@ export class BaseProvider extends SafeEventEmitter { + * When the provider becomes connected, updates internal state and emits + * required events. Idempotent. + * +- * @param chainId - The ID of the newly connected chain. ++ * @param networkInfo - The options object. ++ * @param networkInfo.chainId - The ID of the newly connected chain. ++ * @param networkInfo.isConnected - Whether the network is available. + * @fires MetaMaskInpageProvider#connect + */ +- _handleConnect(chainId) { +- if (!this._state.isConnected) { ++ _handleConnect({ chainId, isConnected, }) { ++ if (!this._state.isConnected && isConnected) { + this._state.isConnected = true; + this.emit('connect', { chainId }); + this._log.debug(messages.info.connected(chainId)); +@@ -267,13 +270,14 @@ export class BaseProvider extends SafeEventEmitter { + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- _handleChainChanged({ chainId, } = {}) { ++ _handleChainChanged({ chainId, isConnected, } = {}) { + if (!isValidChainId(chainId)) { + this._log.error(messages.errors.invalidNetworkParams(), { chainId }); + return; + } +- this._handleConnect(chainId); ++ this._handleConnect({ chainId, isConnected }); + if (chainId !== __classPrivateFieldGet(this, _BaseProvider_chainId, "f")) { + __classPrivateFieldSet(this, _BaseProvider_chainId, chainId, "f"); + if (this._state.initialized) { +diff --git a/dist/BaseProvider.mjs.map b/dist/BaseProvider.mjs.map +index c7b8596ea0a3dbad9937a4f242fe9f28cfe999ee..463c46c2907b0f2ea09519b01123fc1a673ffd2b 100644 +--- a/dist/BaseProvider.mjs.map ++++ b/dist/BaseProvider.mjs.map +@@ -1 +1 @@ +-{"version":3,"file":"BaseProvider.mjs","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { JsonRpcEngine } from '@metamask/json-rpc-engine';\nimport { rpcErrors, JsonRpcError } from '@metamask/rpc-errors';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type {\n JsonRpcRequest,\n JsonRpcId,\n JsonRpcVersion2,\n JsonRpcSuccess,\n JsonRpcParams,\n Json,\n} from '@metamask/utils';\nimport dequal from 'fast-deep-equal';\n\nimport messages from './messages';\nimport type { ConsoleLike, Maybe } from './utils';\nimport { getRpcPromiseCallback, isValidChainId } from './utils';\n\nexport type UnvalidatedJsonRpcRequest = {\n id?: JsonRpcId;\n jsonrpc?: JsonRpcVersion2;\n method: string;\n params?: unknown;\n};\n\nexport type BaseProviderOptions = {\n /**\n * The logging API to use.\n */\n logger?: ConsoleLike;\n\n /**\n * The maximum number of event listeners.\n */\n maxEventListeners?: number;\n\n /**\n * `@metamask/json-rpc-engine` middleware. The middleware will be inserted in the given\n * order immediately after engine initialization.\n */\n rpcMiddleware?: JsonRpcMiddleware[];\n};\n\nexport type RequestArguments = {\n /** The RPC method to request. */\n method: string;\n\n /** The params of the RPC method, if any. */\n params?: unknown[] | Record;\n};\n\nexport type BaseProviderState = {\n accounts: null | string[];\n isConnected: boolean;\n isUnlocked: boolean;\n initialized: boolean;\n isPermanentlyDisconnected: boolean;\n};\n\n/**\n * An abstract class implementing the EIP-1193 interface. Implementers must:\n *\n * 1. At initialization, push a middleware to the internal `_rpcEngine` that\n * hands off requests to the server and receives responses in return.\n * 2. At initialization, retrieve initial state and call\n * {@link BaseProvider._initializeState} **once**.\n * 3. Ensure that the provider's state is synchronized with the wallet.\n * 4. Ensure that notifications are received and emitted as appropriate.\n */\nexport abstract class BaseProvider extends SafeEventEmitter {\n protected readonly _log: ConsoleLike;\n\n protected _state: BaseProviderState;\n\n protected _rpcEngine: JsonRpcEngine;\n\n protected static _defaultState: BaseProviderState = {\n accounts: null,\n isConnected: false,\n isUnlocked: false,\n initialized: false,\n isPermanentlyDisconnected: false,\n };\n\n /**\n * The chain ID of the currently connected Ethereum chain.\n * See [chainId.network]{@link https://chainid.network} for more information.\n */\n #chainId: string | null;\n\n /**\n * The user's currently selected Ethereum address.\n * If null, MetaMask is either locked or the user has not permitted any\n * addresses to be viewed.\n */\n #selectedAddress: string | null;\n\n /**\n * Create a new instance of the provider.\n *\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack. Default: [].\n */\n constructor({\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: BaseProviderOptions = {}) {\n super();\n\n this._log = logger;\n\n this.setMaxListeners(maxEventListeners);\n\n // Private state\n this._state = {\n ...BaseProvider._defaultState,\n };\n\n // Public state\n this.#selectedAddress = null;\n this.#chainId = null;\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleAccountsChanged = this._handleAccountsChanged.bind(this);\n this._handleConnect = this._handleConnect.bind(this);\n this._handleChainChanged = this._handleChainChanged.bind(this);\n this._handleDisconnect = this._handleDisconnect.bind(this);\n this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);\n this._rpcRequest = this._rpcRequest.bind(this);\n this.request = this.request.bind(this);\n\n // Handle RPC requests via dapp-side RPC engine.\n //\n // ATTN: Implementers must push a middleware that hands off requests to\n // the server.\n const rpcEngine = new JsonRpcEngine();\n rpcMiddleware.forEach((middleware) => rpcEngine.push(middleware));\n this._rpcEngine = rpcEngine;\n }\n\n //====================\n // Public Properties\n //====================\n\n get chainId(): string | null {\n return this.#chainId;\n }\n\n get selectedAddress(): string | null {\n return this.#selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Returns whether the provider can process RPC requests.\n *\n * @returns Whether the provider can process RPC requests.\n */\n isConnected(): boolean {\n return this._state.isConnected;\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n * Resolves with the result of the method call, or rejects on error.\n *\n * @param args - The RPC request arguments.\n * @param args.method - The RPC method name.\n * @param args.params - The parameters for the RPC method.\n * @returns A Promise that resolves with the result of the RPC method,\n * or rejects if an error is encountered.\n */\n async request(args: RequestArguments): Promise> {\n if (!args || typeof args !== 'object' || Array.isArray(args)) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestArgs(),\n data: args,\n });\n }\n\n const { method, params } = args;\n\n if (typeof method !== 'string' || method.length === 0) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestMethod(),\n data: args,\n });\n }\n\n if (\n params !== undefined &&\n !Array.isArray(params) &&\n (typeof params !== 'object' || params === null)\n ) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestParams(),\n data: args,\n });\n }\n\n const payload =\n params === undefined || params === null\n ? {\n method,\n }\n : {\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(payload, getRpcPromiseCallback(resolve, reject));\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Sets initial state if provided and marks this provider as initialized.\n * Throws if called more than once.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @param initialState - The provider's initial state.\n * @param initialState.accounts - The user's accounts.\n * @param initialState.chainId - The chain ID.\n * @param initialState.isUnlocked - Whether the user has unlocked MetaMask.\n * @param initialState.networkVersion - The network version.\n * @fires BaseProvider#_initialized - If `initialState` is defined.\n * @fires BaseProvider#connect - If `initialState` is defined.\n */\n protected _initializeState(initialState?: {\n accounts: string[];\n chainId: string;\n isUnlocked: boolean;\n networkVersion?: string;\n }) {\n if (this._state.initialized) {\n throw new Error('Provider already initialized.');\n }\n\n if (initialState) {\n const { accounts, chainId, isUnlocked, networkVersion } = initialState;\n\n // EIP-1193 connect\n this._handleConnect(chainId);\n this._handleChainChanged({ chainId, networkVersion });\n this._handleUnlockStateChanged({ accounts, isUnlocked });\n this._handleAccountsChanged(accounts);\n }\n\n // Mark provider as initialized regardless of whether initial state was\n // retrieved.\n this._state.initialized = true;\n this.emit('_initialized');\n }\n\n /**\n * Internal RPC method. Forwards requests to background via the RPC engine.\n * Also remap ids inbound and outbound.\n *\n * @param payload - The RPC request object.\n * @param callback - The consumer's callback.\n * @returns The result of the RPC request.\n */\n protected _rpcRequest(\n payload: UnvalidatedJsonRpcRequest | UnvalidatedJsonRpcRequest[],\n callback: (...args: any[]) => void,\n ) {\n let callbackWrapper = callback;\n\n if (!Array.isArray(payload)) {\n if (!payload.jsonrpc) {\n payload.jsonrpc = '2.0';\n }\n\n if (\n payload.method === 'eth_accounts' ||\n payload.method === 'eth_requestAccounts'\n ) {\n // handle accounts changing\n callbackWrapper = (\n error: Error,\n response: JsonRpcSuccess,\n ) => {\n this._handleAccountsChanged(\n response.result ?? [],\n payload.method === 'eth_accounts',\n );\n callback(error, response);\n };\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest, callbackWrapper);\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest[], callbackWrapper);\n }\n\n /**\n * When the provider becomes connected, updates internal state and emits\n * required events. Idempotent.\n *\n * @param chainId - The ID of the newly connected chain.\n * @fires MetaMaskInpageProvider#connect\n */\n protected _handleConnect(chainId: string) {\n if (!this._state.isConnected) {\n this._state.isConnected = true;\n this.emit('connect', { chainId });\n this._log.debug(messages.info.connected(chainId));\n }\n }\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n if (\n this._state.isConnected ||\n (!this._state.isPermanentlyDisconnected && !isRecoverable)\n ) {\n this._state.isConnected = false;\n\n let error;\n if (isRecoverable) {\n error = new JsonRpcError(\n 1013, // Try again later\n errorMessage ?? messages.errors.disconnected(),\n );\n this._log.debug(error);\n } else {\n error = new JsonRpcError(\n 1011, // Internal error\n errorMessage ?? messages.errors.permanentlyDisconnected(),\n );\n this._log.error(error);\n this.#chainId = null;\n this._state.accounts = null;\n this.#selectedAddress = null;\n this._state.isUnlocked = false;\n this._state.isPermanentlyDisconnected = true;\n }\n\n this.emit('disconnect', error);\n }\n }\n\n /**\n * Upon receipt of a new `chainId`, emits the corresponding event and sets\n * and sets relevant public state. Does nothing if the given `chainId` is\n * equivalent to the existing value.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n */\n protected _handleChainChanged({\n chainId,\n }:\n | { chainId?: string | undefined; networkVersion?: string | undefined }\n | undefined = {}) {\n if (!isValidChainId(chainId)) {\n this._log.error(messages.errors.invalidNetworkParams(), { chainId });\n return;\n }\n\n this._handleConnect(chainId);\n\n if (chainId !== this.#chainId) {\n this.#chainId = chainId;\n if (this._state.initialized) {\n this.emit('chainChanged', this.#chainId);\n }\n }\n }\n\n /**\n * Called when accounts may have changed. Diffs the new accounts value with\n * the current one, updates all state as necessary, and emits the\n * accountsChanged event.\n *\n * @param accounts - The new accounts value.\n * @param isEthAccounts - Whether the accounts value was returned by\n * a call to eth_accounts.\n */\n protected _handleAccountsChanged(\n accounts: unknown[],\n isEthAccounts = false,\n ): void {\n let _accounts = accounts;\n\n if (!Array.isArray(accounts)) {\n this._log.error(\n 'MetaMask: Received invalid accounts parameter. Please report this bug.',\n accounts,\n );\n _accounts = [];\n }\n\n for (const account of accounts) {\n if (typeof account !== 'string') {\n this._log.error(\n 'MetaMask: Received non-string account. Please report this bug.',\n accounts,\n );\n _accounts = [];\n break;\n }\n }\n\n // emit accountsChanged if anything about the accounts array has changed\n if (!dequal(this._state.accounts, _accounts)) {\n // we should always have the correct accounts even before eth_accounts\n // returns\n if (isEthAccounts && this._state.accounts !== null) {\n this._log.error(\n `MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`,\n _accounts,\n );\n }\n\n this._state.accounts = _accounts as string[];\n\n // handle selectedAddress\n if (this.#selectedAddress !== _accounts[0]) {\n this.#selectedAddress = (_accounts[0] as string) || null;\n }\n\n // finally, after all state has been updated, emit the event\n if (this._state.initialized) {\n const _nextAccounts = [..._accounts];\n this.emit('accountsChanged', _nextAccounts);\n }\n }\n }\n\n /**\n * Upon receipt of a new isUnlocked state, sets relevant public state.\n * Calls the accounts changed handler with the received accounts, or an empty\n * array.\n *\n * Does nothing if the received value is equal to the existing value.\n * There are no lock/unlock events.\n *\n * @param opts - Options bag.\n * @param opts.accounts - The exposed accounts, if any.\n * @param opts.isUnlocked - The latest isUnlocked value.\n */\n protected _handleUnlockStateChanged({\n accounts,\n isUnlocked,\n }: { accounts?: string[]; isUnlocked?: boolean } = {}) {\n if (typeof isUnlocked !== 'boolean') {\n this._log.error(\n 'MetaMask: Received invalid isUnlocked parameter. Please report this bug.',\n );\n return;\n }\n\n if (isUnlocked !== this._state.isUnlocked) {\n this._state.isUnlocked = isUnlocked;\n this._handleAccountsChanged(accounts ?? []);\n }\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"BaseProvider.mjs","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { JsonRpcEngine } from '@metamask/json-rpc-engine';\nimport { rpcErrors, JsonRpcError } from '@metamask/rpc-errors';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type {\n JsonRpcRequest,\n JsonRpcId,\n JsonRpcVersion2,\n JsonRpcSuccess,\n JsonRpcParams,\n Json,\n} from '@metamask/utils';\nimport dequal from 'fast-deep-equal';\n\nimport messages from './messages';\nimport type { ConsoleLike, Maybe } from './utils';\nimport { getRpcPromiseCallback, isValidChainId } from './utils';\n\nexport type UnvalidatedJsonRpcRequest = {\n id?: JsonRpcId;\n jsonrpc?: JsonRpcVersion2;\n method: string;\n params?: unknown;\n};\n\nexport type BaseProviderOptions = {\n /**\n * The logging API to use.\n */\n logger?: ConsoleLike;\n\n /**\n * The maximum number of event listeners.\n */\n maxEventListeners?: number;\n\n /**\n * `@metamask/json-rpc-engine` middleware. The middleware will be inserted in the given\n * order immediately after engine initialization.\n */\n rpcMiddleware?: JsonRpcMiddleware[];\n};\n\nexport type RequestArguments = {\n /** The RPC method to request. */\n method: string;\n\n /** The params of the RPC method, if any. */\n params?: unknown[] | Record;\n};\n\nexport type BaseProviderState = {\n accounts: null | string[];\n isConnected: boolean;\n isUnlocked: boolean;\n initialized: boolean;\n isPermanentlyDisconnected: boolean;\n};\n\n/**\n * An abstract class implementing the EIP-1193 interface. Implementers must:\n *\n * 1. At initialization, push a middleware to the internal `_rpcEngine` that\n * hands off requests to the server and receives responses in return.\n * 2. At initialization, retrieve initial state and call\n * {@link BaseProvider._initializeState} **once**.\n * 3. Ensure that the provider's state is synchronized with the wallet.\n * 4. Ensure that notifications are received and emitted as appropriate.\n */\nexport abstract class BaseProvider extends SafeEventEmitter {\n protected readonly _log: ConsoleLike;\n\n protected _state: BaseProviderState;\n\n protected _rpcEngine: JsonRpcEngine;\n\n protected static _defaultState: BaseProviderState = {\n accounts: null,\n isConnected: false,\n isUnlocked: false,\n initialized: false,\n isPermanentlyDisconnected: false,\n };\n\n /**\n * The chain ID of the currently connected Ethereum chain.\n * See [chainId.network]{@link https://chainid.network} for more information.\n */\n #chainId: string | null;\n\n /**\n * The user's currently selected Ethereum address.\n * If null, MetaMask is either locked or the user has not permitted any\n * addresses to be viewed.\n */\n #selectedAddress: string | null;\n\n /**\n * Create a new instance of the provider.\n *\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack. Default: [].\n */\n constructor({\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: BaseProviderOptions = {}) {\n super();\n\n this._log = logger;\n\n this.setMaxListeners(maxEventListeners);\n\n // Private state\n this._state = {\n ...BaseProvider._defaultState,\n };\n\n // Public state\n this.#selectedAddress = null;\n this.#chainId = null;\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleAccountsChanged = this._handleAccountsChanged.bind(this);\n this._handleConnect = this._handleConnect.bind(this);\n this._handleChainChanged = this._handleChainChanged.bind(this);\n this._handleDisconnect = this._handleDisconnect.bind(this);\n this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);\n this._rpcRequest = this._rpcRequest.bind(this);\n this.request = this.request.bind(this);\n\n // Handle RPC requests via dapp-side RPC engine.\n //\n // ATTN: Implementers must push a middleware that hands off requests to\n // the server.\n const rpcEngine = new JsonRpcEngine();\n rpcMiddleware.forEach((middleware) => rpcEngine.push(middleware));\n this._rpcEngine = rpcEngine;\n }\n\n //====================\n // Public Properties\n //====================\n\n get chainId(): string | null {\n return this.#chainId;\n }\n\n get selectedAddress(): string | null {\n return this.#selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Returns whether the provider can process RPC requests.\n *\n * @returns Whether the provider can process RPC requests.\n */\n isConnected(): boolean {\n return this._state.isConnected;\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n * Resolves with the result of the method call, or rejects on error.\n *\n * @param args - The RPC request arguments.\n * @param args.method - The RPC method name.\n * @param args.params - The parameters for the RPC method.\n * @returns A Promise that resolves with the result of the RPC method,\n * or rejects if an error is encountered.\n */\n async request(args: RequestArguments): Promise> {\n if (!args || typeof args !== 'object' || Array.isArray(args)) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestArgs(),\n data: args,\n });\n }\n\n const { method, params } = args;\n\n if (typeof method !== 'string' || method.length === 0) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestMethod(),\n data: args,\n });\n }\n\n if (\n params !== undefined &&\n !Array.isArray(params) &&\n (typeof params !== 'object' || params === null)\n ) {\n throw rpcErrors.invalidRequest({\n message: messages.errors.invalidRequestParams(),\n data: args,\n });\n }\n\n const payload =\n params === undefined || params === null\n ? {\n method,\n }\n : {\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(payload, getRpcPromiseCallback(resolve, reject));\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Sets initial state if provided and marks this provider as initialized.\n * Throws if called more than once.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @param initialState - The provider's initial state.\n * @param initialState.accounts - The user's accounts.\n * @param initialState.chainId - The chain ID.\n * @param initialState.isUnlocked - Whether the user has unlocked MetaMask.\n * @param initialState.networkVersion - The network version.\n * @param initialState.isConnected - Whether the network is available.\n * @fires BaseProvider#_initialized - If `initialState` is defined.\n * @fires BaseProvider#connect - If `initialState` is defined.\n */\n protected _initializeState(initialState?: {\n accounts: string[];\n chainId: string;\n isUnlocked: boolean;\n networkVersion?: string;\n isConnected?: boolean;\n }) {\n if (this._state.initialized) {\n throw new Error('Provider already initialized.');\n }\n\n if (initialState) {\n const { accounts, chainId, isUnlocked, networkVersion, isConnected } =\n initialState;\n\n // EIP-1193 connect\n this._handleConnect({ chainId, isConnected });\n this._handleChainChanged({ chainId, networkVersion, isConnected });\n this._handleUnlockStateChanged({ accounts, isUnlocked });\n this._handleAccountsChanged(accounts);\n }\n\n // Mark provider as initialized regardless of whether initial state was\n // retrieved.\n this._state.initialized = true;\n this.emit('_initialized');\n }\n\n /**\n * Internal RPC method. Forwards requests to background via the RPC engine.\n * Also remap ids inbound and outbound.\n *\n * @param payload - The RPC request object.\n * @param callback - The consumer's callback.\n * @returns The result of the RPC request.\n */\n protected _rpcRequest(\n payload: UnvalidatedJsonRpcRequest | UnvalidatedJsonRpcRequest[],\n callback: (...args: any[]) => void,\n ) {\n let callbackWrapper = callback;\n\n if (!Array.isArray(payload)) {\n if (!payload.jsonrpc) {\n payload.jsonrpc = '2.0';\n }\n\n if (\n payload.method === 'eth_accounts' ||\n payload.method === 'eth_requestAccounts'\n ) {\n // handle accounts changing\n callbackWrapper = (\n error: Error,\n response: JsonRpcSuccess,\n ) => {\n this._handleAccountsChanged(\n response.result ?? [],\n payload.method === 'eth_accounts',\n );\n callback(error, response);\n };\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest, callbackWrapper);\n }\n return this._rpcEngine.handle(payload as JsonRpcRequest[], callbackWrapper);\n }\n\n /**\n * When the provider becomes connected, updates internal state and emits\n * required events. Idempotent.\n *\n * @param networkInfo - The options object.\n * @param networkInfo.chainId - The ID of the newly connected chain.\n * @param networkInfo.isConnected - Whether the network is available.\n * @fires MetaMaskInpageProvider#connect\n */\n protected _handleConnect({\n chainId,\n isConnected,\n }: {\n chainId: string;\n isConnected?: boolean | undefined;\n }) {\n if (!this._state.isConnected && isConnected) {\n this._state.isConnected = true;\n this.emit('connect', { chainId });\n this._log.debug(messages.info.connected(chainId));\n }\n }\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n if (\n this._state.isConnected ||\n (!this._state.isPermanentlyDisconnected && !isRecoverable)\n ) {\n this._state.isConnected = false;\n\n let error;\n if (isRecoverable) {\n error = new JsonRpcError(\n 1013, // Try again later\n errorMessage ?? messages.errors.disconnected(),\n );\n this._log.debug(error);\n } else {\n error = new JsonRpcError(\n 1011, // Internal error\n errorMessage ?? messages.errors.permanentlyDisconnected(),\n );\n this._log.error(error);\n this.#chainId = null;\n this._state.accounts = null;\n this.#selectedAddress = null;\n this._state.isUnlocked = false;\n this._state.isPermanentlyDisconnected = true;\n }\n\n this.emit('disconnect', error);\n }\n }\n\n /**\n * Upon receipt of a new `chainId`, emits the corresponding event and sets\n * and sets relevant public state. Does nothing if the given `chainId` is\n * equivalent to the existing value.\n *\n * Permits the `networkVersion` field in the parameter object for\n * compatibility with child classes that use this value.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.isConnected - Whether the network is available.\n */\n protected _handleChainChanged({\n chainId,\n isConnected,\n }:\n | {\n chainId?: string;\n networkVersion?: string | undefined;\n isConnected?: boolean | undefined;\n }\n | undefined = {}) {\n if (!isValidChainId(chainId)) {\n this._log.error(messages.errors.invalidNetworkParams(), { chainId });\n return;\n }\n\n this._handleConnect({ chainId, isConnected });\n\n if (chainId !== this.#chainId) {\n this.#chainId = chainId;\n if (this._state.initialized) {\n this.emit('chainChanged', this.#chainId);\n }\n }\n }\n\n /**\n * Called when accounts may have changed. Diffs the new accounts value with\n * the current one, updates all state as necessary, and emits the\n * accountsChanged event.\n *\n * @param accounts - The new accounts value.\n * @param isEthAccounts - Whether the accounts value was returned by\n * a call to eth_accounts.\n */\n protected _handleAccountsChanged(\n accounts: unknown[],\n isEthAccounts = false,\n ): void {\n let _accounts = accounts;\n\n if (!Array.isArray(accounts)) {\n this._log.error(\n 'MetaMask: Received invalid accounts parameter. Please report this bug.',\n accounts,\n );\n _accounts = [];\n }\n\n for (const account of accounts) {\n if (typeof account !== 'string') {\n this._log.error(\n 'MetaMask: Received non-string account. Please report this bug.',\n accounts,\n );\n _accounts = [];\n break;\n }\n }\n\n // emit accountsChanged if anything about the accounts array has changed\n if (!dequal(this._state.accounts, _accounts)) {\n // we should always have the correct accounts even before eth_accounts\n // returns\n if (isEthAccounts && this._state.accounts !== null) {\n this._log.error(\n `MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`,\n _accounts,\n );\n }\n\n this._state.accounts = _accounts as string[];\n\n // handle selectedAddress\n if (this.#selectedAddress !== _accounts[0]) {\n this.#selectedAddress = (_accounts[0] as string) || null;\n }\n\n // finally, after all state has been updated, emit the event\n if (this._state.initialized) {\n const _nextAccounts = [..._accounts];\n this.emit('accountsChanged', _nextAccounts);\n }\n }\n }\n\n /**\n * Upon receipt of a new isUnlocked state, sets relevant public state.\n * Calls the accounts changed handler with the received accounts, or an empty\n * array.\n *\n * Does nothing if the received value is equal to the existing value.\n * There are no lock/unlock events.\n *\n * @param opts - Options bag.\n * @param opts.accounts - The exposed accounts, if any.\n * @param opts.isUnlocked - The latest isUnlocked value.\n */\n protected _handleUnlockStateChanged({\n accounts,\n isUnlocked,\n }: { accounts?: string[]; isUnlocked?: boolean } = {}) {\n if (typeof isUnlocked !== 'boolean') {\n this._log.error(\n 'MetaMask: Received invalid isUnlocked parameter. Please report this bug.',\n );\n return;\n }\n\n if (isUnlocked !== this._state.isUnlocked) {\n this._state.isUnlocked = isUnlocked;\n this._handleAccountsChanged(accounts ?? []);\n }\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/MetaMaskInpageProvider.cjs b/dist/MetaMaskInpageProvider.cjs +index 048f5ebc5bcf239682b44faae7dd5bf963db628f..63a83d4c25b54c087891f14944c8cf41bcd8e629 100644 +--- a/dist/MetaMaskInpageProvider.cjs ++++ b/dist/MetaMaskInpageProvider.cjs +@@ -307,21 +307,29 @@ class MetaMaskInpageProvider extends StreamProvider_1.AbstractStreamProvider { + }); + } + /** +- * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. Does nothing if neither the chainId +- * nor the networkVersion are different from existing values. ++ * Upon receipt of a new chainId, networkVersion, and isConnected value ++ * emits corresponding events and sets relevant public state. We interpret ++ * a `networkVersion` with the value of `loading` to be null. The `isConnected` ++ * value determines if a `connect` or recoverable `disconnect` has occurred. ++ * Child classes that use the `networkVersion` for other purposes must implement ++ * additional handling therefore. + * + * @fires MetamaskInpageProvider#networkChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- _handleChainChanged({ chainId, networkVersion, } = {}) { +- // This will validate the params and disconnect the provider if the +- // networkVersion is 'loading'. +- super._handleChainChanged({ chainId, networkVersion }); +- if (this._state.isConnected && networkVersion !== __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")) { +- __classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, networkVersion, "f"); ++ _handleChainChanged({ chainId, networkVersion, isConnected, } = {}) { ++ super._handleChainChanged({ chainId, networkVersion, isConnected }); ++ // The wallet will send a value of `loading` for `networkVersion` when it intends ++ // to communicate that this value cannot be resolved and should be intepreted as null. ++ // The wallet cannot directly send a null value for `networkVersion` because this ++ // would be a breaking change for existing dapps that use their own embedded MetaMask provider ++ // that expect this value to always be a integer string or the value 'loading'. ++ const targetNetworkVersion = networkVersion === 'loading' ? null : networkVersion; ++ if (targetNetworkVersion !== __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")) { ++ __classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, targetNetworkVersion, "f"); + if (this._state.initialized) { + this.emit('networkChanged', __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")); + } +diff --git a/dist/MetaMaskInpageProvider.cjs.map b/dist/MetaMaskInpageProvider.cjs.map +index cf575a44348b1df1ac695bf18281a5b956f0e003..73dfb0006819b892eb2e4d0be06a44710e3cbe6a 100644 +--- a/dist/MetaMaskInpageProvider.cjs.map ++++ b/dist/MetaMaskInpageProvider.cjs.map +@@ -1 +1 @@ +-{"version":3,"file":"MetaMaskInpageProvider.cjs","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,qDAAiD;AAKjD,8DAAkC;AAClC,qDAAkD;AAElD,yDAA0D;AAC1D,uCAKiB;AAiCjB;;GAEG;AACU,QAAA,gCAAgC,GAAG,mBAAmB,CAAC;AAEpE,MAAa,sBAAuB,SAAQ,uCAAsB;IA6BhE;;;;;;;;;;OAUG;IACH,YACE,gBAAwB,EACxB,EACE,MAAM,GAAG,OAAO,EAChB,iBAAiB,GAAG,GAAG,EACvB,kBAAkB,MACe,EAAE;QAErC,KAAK,CAAC,gBAAgB,EAAE;YACtB,MAAM;YACN,iBAAiB;YACjB,aAAa,EAAE,IAAA,oCAA4B,EAAC,MAAM,CAAC;SACpD,CAAC,CAAC;QAnDK,kBAAa,GAAsB;YAC3C,UAAU;YACV,MAAM,EAAE,KAAK;YACb,mBAAmB,EAAE,KAAK;YAC1B,IAAI,EAAE,KAAK;YACX,SAAS;YACT,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,KAAK;gBACX,cAAc,EAAE,KAAK;gBACrB,YAAY,EAAE,KAAK;aACpB;SACF,CAAC;QASF,yDAA+B;QAgC7B,wEAAwE;QACxE,uEAAuE;QACvE,uBAAuB;QACvB,mEAAmE;QACnE,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,uBAAA,IAAI,0CAAmB,IAAI,MAAA,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE5C,gCAAgC;QAChC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;YAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAC3B,IAAI,6BAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3C,aAAa;gBACb,mDAAmD;gBACnD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC3B,aAAa;gBACb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACvC,mEAAmE;gBACnE,IAAA,+BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,uBAAuB,GAAG,GAAG,EAAE;oBACnC,mEAAmE;oBACnE,IAAA,+BAAgB,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC7C,MAAM,CAAC,mBAAmB,CACxB,kBAAkB,EAClB,uBAAuB,CACxB,CAAC;gBACJ,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;IAEtB,IAAI,OAAO;QACT,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,uBAAA,IAAI,8CAAgB,CAAC;IAC9B,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,KAAK,CAAC,eAAe,CAAC;IAC/B,CAAC;IAED,sBAAsB;IACtB,iBAAiB;IACjB,sBAAsB;IAEtB;;;;;OAKG;IACH,SAAS,CACP,OAAuB,EACvB,QAAuE;QAEvE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IAEH,WAAW,CAAC,SAAiB,EAAE,QAAsC;QACnE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,EAAE,CAAC,SAAiB,EAAE,QAAsC;QAC1D,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,QAAsC;QAC5D,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,SAAiB,EAAE,QAAsC;QACvE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,mBAAmB,CACjB,SAAiB,EACjB,QAAsC;QAEtC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,sBAAsB;IACtB,kBAAkB;IAClB,sBAAsB;IAEtB;;;;;;;;;;OAUG;IACO,iBAAiB,CAAC,aAAsB,EAAE,YAAqB;QACvE,KAAK,CAAC,iBAAiB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,uBAAA,IAAI,8CAAgB,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,uBAAA,IAAI,0CAAmB,IAAI,MAAA,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,kBAAkB,CAAC,SAAiB;QAC5C,qFAAqF;QACrF,IAAI,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,SAA6B,CAAC,KAAK,KAAK,EAAE,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,SAA6B,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAA6B,CAAC,GAAG,IAAI,CAAC;QAClE,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,qBAAqB;IACrB,sBAAsB;IAEtB;;;;;OAKG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACpD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;QACnC,CAAC;QAED,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,IAAI,CAAC;gBACH,IAAI,CAAC,WAAW,CACd,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,EAC7C,IAAA,6BAAqB,EAAC,OAAO,EAAE,MAAM,CAAC,CACvC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAyCD,qEAAqE;IACrE,IAAI,CAAC,eAAwB,EAAE,cAAwB;QACrD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAClD,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,IACE,OAAO,eAAe,KAAK,QAAQ;YACnC,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAClD,CAAC;YACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,CAAC;oBACH,IAAI,CAAC,WAAW,CACd,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,EACnD,IAAA,6BAAqB,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAC9C,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IACL,eAAe;YACf,OAAO,eAAe,KAAK,QAAQ;YACnC,OAAO,cAAc,KAAK,UAAU,EACpC,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,CACrB,eAAiC,EACjC,cAA8C,CAC/C,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAyC,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;OAMG;IACO,SAAS,CAAC,OAA+B;QACjD,IAAI,MAAM,CAAC;QACX,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,cAAc;gBACjB,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,MAAM;YAER,KAAK,cAAc;gBACjB,MAAM,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;gBACtC,MAAM;YAER,KAAK,qBAAqB;gBACxB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAI,CAAC,CAAC;gBAChC,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM;YAER,KAAK,aAAa;gBAChB,MAAM,GAAG,uBAAA,IAAI,8CAAgB,IAAI,IAAI,CAAC;gBACtC,MAAM;YAER;gBACE,MAAM,IAAI,KAAK,CAAC,kBAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACO,mBAAmB;QAC3B,OAAO,IAAI,KAAK,CACd;YACE;;;;eAIG;YACH,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC7B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;wBAClC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3C,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YAChC,CAAC;YAED;;;;eAIG;YACH,YAAY,EAAE,KAAK,EAAE,QAAqC,EAAE,EAAE;gBAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,MAAM,sBAAS,CAAC,cAAc,CAAC;wBAC7B,OAAO,EACL,+DAA+D;wBACjE,IAAI,EAAE,QAAQ;qBACf,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACrC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAA,6BAAqB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBACrE,CAAC,CAAC,CAAC;YACL,CAAC;SACF,EACD;YACE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE;gBAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;oBACtD,IAAI,CAAC,aAAa,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChD,CAAC;gBACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC;SACF,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACO,mBAAmB,CAAC,EAC5B,OAAO,EACP,cAAc,MACmC,EAAE;QACnD,mEAAmE;QACnE,+BAA+B;QAC/B,KAAK,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAEvD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,cAAc,KAAK,uBAAA,IAAI,8CAAgB,EAAE,CAAC;YACvE,uBAAA,IAAI,0CAAmB,cAAwB,MAAA,CAAC;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,uBAAA,IAAI,8CAAgB,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAxaD,wDAwaC","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Json, JsonRpcRequest, JsonRpcResponse } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\n\nimport type { UnvalidatedJsonRpcRequest } from './BaseProvider';\nimport messages from './messages';\nimport { sendSiteMetadata } from './siteMetadata';\nimport type { StreamProviderOptions } from './StreamProvider';\nimport { AbstractStreamProvider } from './StreamProvider';\nimport {\n EMITTED_NOTIFICATIONS,\n getDefaultExternalMiddleware,\n getRpcPromiseCallback,\n NOOP,\n} from './utils';\n\nexport type SendSyncJsonRpcRequest = {\n method:\n | 'eth_accounts'\n | 'eth_coinbase'\n | 'eth_uninstallFilter'\n | 'net_version';\n} & JsonRpcRequest;\n\ntype WarningEventName = keyof SentWarningsState['events'];\n\nexport type MetaMaskInpageProviderOptions = {\n /**\n * Whether the provider should send page metadata.\n */\n shouldSendMetadata?: boolean;\n} & Partial>;\n\ntype SentWarningsState = {\n // methods\n enable: boolean;\n experimentalMethods: boolean;\n send: boolean;\n // events\n events: {\n close: boolean;\n data: boolean;\n networkChanged: boolean;\n notification: boolean;\n };\n};\n\n/**\n * The name of the stream consumed by {@link MetaMaskInpageProvider}.\n */\nexport const MetaMaskInpageProviderStreamName = 'metamask-provider';\n\nexport class MetaMaskInpageProvider extends AbstractStreamProvider {\n protected _sentWarnings: SentWarningsState = {\n // methods\n enable: false,\n experimentalMethods: false,\n send: false,\n // events\n events: {\n close: false,\n data: false,\n networkChanged: false,\n notification: false,\n },\n };\n\n /**\n * Experimental methods can be found here.\n */\n public readonly _metamask: ReturnType<\n MetaMaskInpageProvider['_getExperimentalApi']\n >;\n\n #networkVersion: string | null;\n\n /**\n * Indicating that this provider is a MetaMask provider.\n */\n public readonly isMetaMask: true;\n\n /**\n * Creates a new `MetaMaskInpageProvider`.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.shouldSendMetadata - Whether the provider should\n * send page metadata. Default: `true`.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n shouldSendMetadata,\n }: MetaMaskInpageProviderOptions = {},\n ) {\n super(connectionStream, {\n logger,\n maxEventListeners,\n rpcMiddleware: getDefaultExternalMiddleware(logger),\n });\n\n // We shouldn't perform asynchronous work in the constructor, but at one\n // point we started doing so, and changing this class isn't worth it at\n // the time of writing.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._initializeStateAsync();\n\n this.#networkVersion = null;\n this.isMetaMask = true;\n\n this._sendSync = this._sendSync.bind(this);\n this.enable = this.enable.bind(this);\n this.send = this.send.bind(this);\n this.sendAsync = this.sendAsync.bind(this);\n this._warnOfDeprecation = this._warnOfDeprecation.bind(this);\n\n this._metamask = this._getExperimentalApi();\n\n // handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method } = payload;\n if (EMITTED_NOTIFICATIONS.includes(method)) {\n // deprecated\n // emitted here because that was the original order\n this.emit('data', payload);\n // deprecated\n this.emit('notification', payload.params.result);\n }\n });\n\n // send website metadata\n if (shouldSendMetadata) {\n if (document.readyState === 'complete') {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n } else {\n const domContentLoadedHandler = () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n window.removeEventListener(\n 'DOMContentLoaded',\n domContentLoadedHandler,\n );\n };\n window.addEventListener('DOMContentLoaded', domContentLoadedHandler);\n }\n }\n }\n\n //====================\n // Read-only Properties\n //====================\n\n get chainId(): string | null {\n return super.chainId;\n }\n\n get networkVersion(): string | null {\n return this.#networkVersion;\n }\n\n get selectedAddress(): string | null {\n return super.selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @param payload - The RPC request object.\n * @param callback - The callback function.\n */\n sendAsync(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void {\n this._rpcRequest(payload, callback);\n }\n\n /**\n * We override the following event methods so that we can warn consumers\n * about deprecated events:\n * `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.\n */\n\n addListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.addListener(eventName, listener);\n }\n\n on(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.on(eventName, listener);\n }\n\n once(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.once(eventName, listener);\n }\n\n prependListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.prependListener(eventName, listener);\n }\n\n prependOnceListener(\n eventName: string,\n listener: (...args: unknown[]) => void,\n ) {\n this._warnOfDeprecation(eventName);\n return super.prependOnceListener(eventName, listener);\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n super._handleDisconnect(isRecoverable, errorMessage);\n if (this.#networkVersion && !isRecoverable) {\n this.#networkVersion = null;\n }\n }\n\n /**\n * Warns of deprecation for the given event, if applicable.\n *\n * @param eventName - The name of the event.\n */\n protected _warnOfDeprecation(eventName: string): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare\n if (this._sentWarnings?.events[eventName as WarningEventName] === false) {\n this._log.warn(messages.warnings.events[eventName as WarningEventName]);\n this._sentWarnings.events[eventName as WarningEventName] = true;\n }\n }\n\n //====================\n // Deprecated Methods\n //====================\n\n /**\n * Equivalent to: `ethereum.request('eth_requestAccounts')`.\n *\n * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.\n * @returns A promise that resolves to an array of addresses.\n */\n async enable(): Promise {\n if (!this._sentWarnings.enable) {\n this._log.warn(messages.warnings.enableDeprecation);\n this._sentWarnings.enable = true;\n }\n\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: 'eth_requestAccounts', params: [] },\n getRpcPromiseCallback(resolve, reject),\n );\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n *\n * @deprecated Use \"request\" instead.\n * @param method - The method to request.\n * @param params - Any params for the method.\n * @returns A Promise that resolves with the JSON-RPC response object for the\n * request.\n */\n send(\n method: string,\n params?: Type[],\n ): Promise>;\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @param callback - An error-first callback that will receive the JSON-RPC\n * response object.\n */\n send(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void;\n\n /**\n * Accepts a JSON-RPC request object, and synchronously returns the cached result\n * for the given method. Only supports 4 specific RPC methods.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n */\n send(\n payload: SendSyncJsonRpcRequest,\n ): JsonRpcResponse;\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n send(methodOrPayload: unknown, callbackOrArgs?: unknown): unknown {\n if (!this._sentWarnings.send) {\n this._log.warn(messages.warnings.sendDeprecation);\n this._sentWarnings.send = true;\n }\n\n if (\n typeof methodOrPayload === 'string' &&\n (!callbackOrArgs || Array.isArray(callbackOrArgs))\n ) {\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: methodOrPayload, params: callbackOrArgs },\n getRpcPromiseCallback(resolve, reject, false),\n );\n } catch (error) {\n reject(error);\n }\n });\n } else if (\n methodOrPayload &&\n typeof methodOrPayload === 'object' &&\n typeof callbackOrArgs === 'function'\n ) {\n return this._rpcRequest(\n methodOrPayload as JsonRpcRequest,\n callbackOrArgs as (...args: unknown[]) => void,\n );\n }\n return this._sendSync(methodOrPayload as SendSyncJsonRpcRequest);\n }\n\n /**\n * Internal backwards compatibility method, used in send.\n *\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n * @deprecated\n */\n protected _sendSync(payload: SendSyncJsonRpcRequest) {\n let result;\n switch (payload.method) {\n case 'eth_accounts':\n result = this.selectedAddress ? [this.selectedAddress] : [];\n break;\n\n case 'eth_coinbase':\n result = this.selectedAddress ?? null;\n break;\n\n case 'eth_uninstallFilter':\n this._rpcRequest(payload, NOOP);\n result = true;\n break;\n\n case 'net_version':\n result = this.#networkVersion ?? null;\n break;\n\n default:\n throw new Error(messages.errors.unsupportedSync(payload.method));\n }\n\n return {\n id: payload.id,\n jsonrpc: payload.jsonrpc,\n result,\n };\n }\n\n /**\n * Constructor helper.\n *\n * Gets the experimental _metamask API as Proxy, so that we can warn consumers\n * about its experimental nature.\n *\n * @returns The experimental _metamask API.\n */\n protected _getExperimentalApi() {\n return new Proxy(\n {\n /**\n * Determines if MetaMask is unlocked by the user.\n *\n * @returns Promise resolving to true if MetaMask is currently unlocked.\n */\n isUnlocked: async () => {\n if (!this._state.initialized) {\n await new Promise((resolve) => {\n this.on('_initialized', () => resolve());\n });\n }\n return this._state.isUnlocked;\n },\n\n /**\n * Make a batch RPC request.\n *\n * @param requests - The RPC requests to make.\n */\n requestBatch: async (requests: UnvalidatedJsonRpcRequest[]) => {\n if (!Array.isArray(requests)) {\n throw rpcErrors.invalidRequest({\n message:\n 'Batch requests must be made with an array of request objects.',\n data: requests,\n });\n }\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(requests, getRpcPromiseCallback(resolve, reject));\n });\n },\n },\n {\n get: (obj, prop, ...args) => {\n if (!this._sentWarnings.experimentalMethods) {\n this._log.warn(messages.warnings.experimentalMethods);\n this._sentWarnings.experimentalMethods = true;\n }\n return Reflect.get(obj, prop, ...args);\n },\n },\n );\n }\n\n /**\n * Upon receipt of a new chainId and networkVersion, emits corresponding\n * events and sets relevant public state. Does nothing if neither the chainId\n * nor the networkVersion are different from existing values.\n *\n * @fires MetamaskInpageProvider#networkChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n }: { chainId?: string; networkVersion?: string } = {}) {\n // This will validate the params and disconnect the provider if the\n // networkVersion is 'loading'.\n super._handleChainChanged({ chainId, networkVersion });\n\n if (this._state.isConnected && networkVersion !== this.#networkVersion) {\n this.#networkVersion = networkVersion as string;\n if (this._state.initialized) {\n this.emit('networkChanged', this.#networkVersion);\n }\n }\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"MetaMaskInpageProvider.cjs","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Json, JsonRpcRequest, JsonRpcResponse } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\n\nimport type { UnvalidatedJsonRpcRequest } from './BaseProvider';\nimport messages from './messages';\nimport { sendSiteMetadata } from './siteMetadata';\nimport type { StreamProviderOptions } from './StreamProvider';\nimport { AbstractStreamProvider } from './StreamProvider';\nimport {\n EMITTED_NOTIFICATIONS,\n getDefaultExternalMiddleware,\n getRpcPromiseCallback,\n NOOP,\n} from './utils';\n\nexport type SendSyncJsonRpcRequest = {\n method:\n | 'eth_accounts'\n | 'eth_coinbase'\n | 'eth_uninstallFilter'\n | 'net_version';\n} & JsonRpcRequest;\n\ntype WarningEventName = keyof SentWarningsState['events'];\n\nexport type MetaMaskInpageProviderOptions = {\n /**\n * Whether the provider should send page metadata.\n */\n shouldSendMetadata?: boolean;\n} & Partial>;\n\ntype SentWarningsState = {\n // methods\n enable: boolean;\n experimentalMethods: boolean;\n send: boolean;\n // events\n events: {\n close: boolean;\n data: boolean;\n networkChanged: boolean;\n notification: boolean;\n };\n};\n\n/**\n * The name of the stream consumed by {@link MetaMaskInpageProvider}.\n */\nexport const MetaMaskInpageProviderStreamName = 'metamask-provider';\n\nexport class MetaMaskInpageProvider extends AbstractStreamProvider {\n protected _sentWarnings: SentWarningsState = {\n // methods\n enable: false,\n experimentalMethods: false,\n send: false,\n // events\n events: {\n close: false,\n data: false,\n networkChanged: false,\n notification: false,\n },\n };\n\n /**\n * Experimental methods can be found here.\n */\n public readonly _metamask: ReturnType<\n MetaMaskInpageProvider['_getExperimentalApi']\n >;\n\n #networkVersion: string | null;\n\n /**\n * Indicating that this provider is a MetaMask provider.\n */\n public readonly isMetaMask: true;\n\n /**\n * Creates a new `MetaMaskInpageProvider`.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.shouldSendMetadata - Whether the provider should\n * send page metadata. Default: `true`.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n shouldSendMetadata,\n }: MetaMaskInpageProviderOptions = {},\n ) {\n super(connectionStream, {\n logger,\n maxEventListeners,\n rpcMiddleware: getDefaultExternalMiddleware(logger),\n });\n\n // We shouldn't perform asynchronous work in the constructor, but at one\n // point we started doing so, and changing this class isn't worth it at\n // the time of writing.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._initializeStateAsync();\n\n this.#networkVersion = null;\n this.isMetaMask = true;\n\n this._sendSync = this._sendSync.bind(this);\n this.enable = this.enable.bind(this);\n this.send = this.send.bind(this);\n this.sendAsync = this.sendAsync.bind(this);\n this._warnOfDeprecation = this._warnOfDeprecation.bind(this);\n\n this._metamask = this._getExperimentalApi();\n\n // handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method } = payload;\n if (EMITTED_NOTIFICATIONS.includes(method)) {\n // deprecated\n // emitted here because that was the original order\n this.emit('data', payload);\n // deprecated\n this.emit('notification', payload.params.result);\n }\n });\n\n // send website metadata\n if (shouldSendMetadata) {\n if (document.readyState === 'complete') {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n } else {\n const domContentLoadedHandler = () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n window.removeEventListener(\n 'DOMContentLoaded',\n domContentLoadedHandler,\n );\n };\n window.addEventListener('DOMContentLoaded', domContentLoadedHandler);\n }\n }\n }\n\n //====================\n // Read-only Properties\n //====================\n\n get chainId(): string | null {\n return super.chainId;\n }\n\n get networkVersion(): string | null {\n return this.#networkVersion;\n }\n\n get selectedAddress(): string | null {\n return super.selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @param payload - The RPC request object.\n * @param callback - The callback function.\n */\n sendAsync(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void {\n this._rpcRequest(payload, callback);\n }\n\n /**\n * We override the following event methods so that we can warn consumers\n * about deprecated events:\n * `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.\n */\n\n addListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.addListener(eventName, listener);\n }\n\n on(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.on(eventName, listener);\n }\n\n once(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.once(eventName, listener);\n }\n\n prependListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.prependListener(eventName, listener);\n }\n\n prependOnceListener(\n eventName: string,\n listener: (...args: unknown[]) => void,\n ) {\n this._warnOfDeprecation(eventName);\n return super.prependOnceListener(eventName, listener);\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n super._handleDisconnect(isRecoverable, errorMessage);\n if (this.#networkVersion && !isRecoverable) {\n this.#networkVersion = null;\n }\n }\n\n /**\n * Warns of deprecation for the given event, if applicable.\n *\n * @param eventName - The name of the event.\n */\n protected _warnOfDeprecation(eventName: string): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare\n if (this._sentWarnings?.events[eventName as WarningEventName] === false) {\n this._log.warn(messages.warnings.events[eventName as WarningEventName]);\n this._sentWarnings.events[eventName as WarningEventName] = true;\n }\n }\n\n //====================\n // Deprecated Methods\n //====================\n\n /**\n * Equivalent to: `ethereum.request('eth_requestAccounts')`.\n *\n * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.\n * @returns A promise that resolves to an array of addresses.\n */\n async enable(): Promise {\n if (!this._sentWarnings.enable) {\n this._log.warn(messages.warnings.enableDeprecation);\n this._sentWarnings.enable = true;\n }\n\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: 'eth_requestAccounts', params: [] },\n getRpcPromiseCallback(resolve, reject),\n );\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n *\n * @deprecated Use \"request\" instead.\n * @param method - The method to request.\n * @param params - Any params for the method.\n * @returns A Promise that resolves with the JSON-RPC response object for the\n * request.\n */\n send(\n method: string,\n params?: Type[],\n ): Promise>;\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @param callback - An error-first callback that will receive the JSON-RPC\n * response object.\n */\n send(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void;\n\n /**\n * Accepts a JSON-RPC request object, and synchronously returns the cached result\n * for the given method. Only supports 4 specific RPC methods.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n */\n send(\n payload: SendSyncJsonRpcRequest,\n ): JsonRpcResponse;\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n send(methodOrPayload: unknown, callbackOrArgs?: unknown): unknown {\n if (!this._sentWarnings.send) {\n this._log.warn(messages.warnings.sendDeprecation);\n this._sentWarnings.send = true;\n }\n\n if (\n typeof methodOrPayload === 'string' &&\n (!callbackOrArgs || Array.isArray(callbackOrArgs))\n ) {\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: methodOrPayload, params: callbackOrArgs },\n getRpcPromiseCallback(resolve, reject, false),\n );\n } catch (error) {\n reject(error);\n }\n });\n } else if (\n methodOrPayload &&\n typeof methodOrPayload === 'object' &&\n typeof callbackOrArgs === 'function'\n ) {\n return this._rpcRequest(\n methodOrPayload as JsonRpcRequest,\n callbackOrArgs as (...args: unknown[]) => void,\n );\n }\n return this._sendSync(methodOrPayload as SendSyncJsonRpcRequest);\n }\n\n /**\n * Internal backwards compatibility method, used in send.\n *\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n * @deprecated\n */\n protected _sendSync(payload: SendSyncJsonRpcRequest) {\n let result;\n switch (payload.method) {\n case 'eth_accounts':\n result = this.selectedAddress ? [this.selectedAddress] : [];\n break;\n\n case 'eth_coinbase':\n result = this.selectedAddress ?? null;\n break;\n\n case 'eth_uninstallFilter':\n this._rpcRequest(payload, NOOP);\n result = true;\n break;\n\n case 'net_version':\n result = this.#networkVersion ?? null;\n break;\n\n default:\n throw new Error(messages.errors.unsupportedSync(payload.method));\n }\n\n return {\n id: payload.id,\n jsonrpc: payload.jsonrpc,\n result,\n };\n }\n\n /**\n * Constructor helper.\n *\n * Gets the experimental _metamask API as Proxy, so that we can warn consumers\n * about its experimental nature.\n *\n * @returns The experimental _metamask API.\n */\n protected _getExperimentalApi() {\n return new Proxy(\n {\n /**\n * Determines if MetaMask is unlocked by the user.\n *\n * @returns Promise resolving to true if MetaMask is currently unlocked.\n */\n isUnlocked: async () => {\n if (!this._state.initialized) {\n await new Promise((resolve) => {\n this.on('_initialized', () => resolve());\n });\n }\n return this._state.isUnlocked;\n },\n\n /**\n * Make a batch RPC request.\n *\n * @param requests - The RPC requests to make.\n */\n requestBatch: async (requests: UnvalidatedJsonRpcRequest[]) => {\n if (!Array.isArray(requests)) {\n throw rpcErrors.invalidRequest({\n message:\n 'Batch requests must be made with an array of request objects.',\n data: requests,\n });\n }\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(requests, getRpcPromiseCallback(resolve, reject));\n });\n },\n },\n {\n get: (obj, prop, ...args) => {\n if (!this._sentWarnings.experimentalMethods) {\n this._log.warn(messages.warnings.experimentalMethods);\n this._sentWarnings.experimentalMethods = true;\n }\n return Reflect.get(obj, prop, ...args);\n },\n },\n );\n }\n\n /**\n * Upon receipt of a new chainId, networkVersion, and isConnected value\n * emits corresponding events and sets relevant public state. We interpret\n * a `networkVersion` with the value of `loading` to be null. The `isConnected`\n * value determines if a `connect` or recoverable `disconnect` has occurred.\n * Child classes that use the `networkVersion` for other purposes must implement\n * additional handling therefore.\n *\n * @fires MetamaskInpageProvider#networkChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n * @param networkInfo.isConnected - Whether the network is available.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n isConnected,\n }: {\n chainId?: string;\n networkVersion?: string;\n isConnected?: boolean;\n } = {}) {\n super._handleChainChanged({ chainId, networkVersion, isConnected });\n\n // The wallet will send a value of `loading` for `networkVersion` when it intends\n // to communicate that this value cannot be resolved and should be intepreted as null.\n // The wallet cannot directly send a null value for `networkVersion` because this\n // would be a breaking change for existing dapps that use their own embedded MetaMask provider\n // that expect this value to always be a integer string or the value 'loading'.\n\n const targetNetworkVersion =\n networkVersion === 'loading' ? null : networkVersion;\n\n if (targetNetworkVersion !== this.#networkVersion) {\n this.#networkVersion = targetNetworkVersion as string;\n if (this._state.initialized) {\n this.emit('networkChanged', this.#networkVersion);\n }\n }\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/MetaMaskInpageProvider.d.cts b/dist/MetaMaskInpageProvider.d.cts +index 43e0aa01ff7b83932f7fd795b77a3f2b8d2d446f..97e931abef5ad17d3915b7fd8de633728633f1b3 100644 +--- a/dist/MetaMaskInpageProvider.d.cts ++++ b/dist/MetaMaskInpageProvider.d.cts +@@ -158,18 +158,23 @@ export declare class MetaMaskInpageProvider extends AbstractStreamProvider { + requestBatch: (requests: UnvalidatedJsonRpcRequest[]) => Promise; + }; + /** +- * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. Does nothing if neither the chainId +- * nor the networkVersion are different from existing values. ++ * Upon receipt of a new chainId, networkVersion, and isConnected value ++ * emits corresponding events and sets relevant public state. We interpret ++ * a `networkVersion` with the value of `loading` to be null. The `isConnected` ++ * value determines if a `connect` or recoverable `disconnect` has occurred. ++ * Child classes that use the `networkVersion` for other purposes must implement ++ * additional handling therefore. + * + * @fires MetamaskInpageProvider#networkChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- protected _handleChainChanged({ chainId, networkVersion, }?: { ++ protected _handleChainChanged({ chainId, networkVersion, isConnected, }?: { + chainId?: string; + networkVersion?: string; ++ isConnected?: boolean; + }): void; + } + export {}; +diff --git a/dist/MetaMaskInpageProvider.d.cts.map b/dist/MetaMaskInpageProvider.d.cts.map +index b579441774c22c62fccee858f358163fbc33bc1d..f4ab45d111c3dbee94665a83dc03d1b7aed573ef 100644 +--- a/dist/MetaMaskInpageProvider.d.cts.map ++++ b/dist/MetaMaskInpageProvider.d.cts.map +@@ -1 +1 @@ +-{"version":3,"file":"MetaMaskInpageProvider.d.cts","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"MetaMaskInpageProvider.d.cts","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/dist/MetaMaskInpageProvider.d.mts b/dist/MetaMaskInpageProvider.d.mts +index c768a628fe2e0d8a393c3f0dee55ae9dbb5961fa..96af9efbe01fbc0e05c6c53e1797a7e62e1f55aa 100644 +--- a/dist/MetaMaskInpageProvider.d.mts ++++ b/dist/MetaMaskInpageProvider.d.mts +@@ -158,18 +158,23 @@ export declare class MetaMaskInpageProvider extends AbstractStreamProvider { + requestBatch: (requests: UnvalidatedJsonRpcRequest[]) => Promise; + }; + /** +- * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. Does nothing if neither the chainId +- * nor the networkVersion are different from existing values. ++ * Upon receipt of a new chainId, networkVersion, and isConnected value ++ * emits corresponding events and sets relevant public state. We interpret ++ * a `networkVersion` with the value of `loading` to be null. The `isConnected` ++ * value determines if a `connect` or recoverable `disconnect` has occurred. ++ * Child classes that use the `networkVersion` for other purposes must implement ++ * additional handling therefore. + * + * @fires MetamaskInpageProvider#networkChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- protected _handleChainChanged({ chainId, networkVersion, }?: { ++ protected _handleChainChanged({ chainId, networkVersion, isConnected, }?: { + chainId?: string; + networkVersion?: string; ++ isConnected?: boolean; + }): void; + } + export {}; +diff --git a/dist/MetaMaskInpageProvider.d.mts.map b/dist/MetaMaskInpageProvider.d.mts.map +index 72cc5f19d4b9cbf6198eefbb8cdd6bd3fbc218f1..7c7027194af4ddcb4d4c844a56a7066719c1136b 100644 +--- a/dist/MetaMaskInpageProvider.d.mts.map ++++ b/dist/MetaMaskInpageProvider.d.mts.map +@@ -1 +1 @@ +-{"version":3,"file":"MetaMaskInpageProvider.d.mts","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file ++{"version":3,"file":"MetaMaskInpageProvider.d.mts","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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"} +\ No newline at end of file +diff --git a/dist/MetaMaskInpageProvider.mjs b/dist/MetaMaskInpageProvider.mjs +index 9f6f31d8eb7ab361d0372866b152dd57d62fc0d5..451652ff976f34a2cdea154c963c1a120edd2af0 100644 +--- a/dist/MetaMaskInpageProvider.mjs ++++ b/dist/MetaMaskInpageProvider.mjs +@@ -301,21 +301,29 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider { + }); + } + /** +- * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. Does nothing if neither the chainId +- * nor the networkVersion are different from existing values. ++ * Upon receipt of a new chainId, networkVersion, and isConnected value ++ * emits corresponding events and sets relevant public state. We interpret ++ * a `networkVersion` with the value of `loading` to be null. The `isConnected` ++ * value determines if a `connect` or recoverable `disconnect` has occurred. ++ * Child classes that use the `networkVersion` for other purposes must implement ++ * additional handling therefore. + * + * @fires MetamaskInpageProvider#networkChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- _handleChainChanged({ chainId, networkVersion, } = {}) { +- // This will validate the params and disconnect the provider if the +- // networkVersion is 'loading'. +- super._handleChainChanged({ chainId, networkVersion }); +- if (this._state.isConnected && networkVersion !== __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")) { +- __classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, networkVersion, "f"); ++ _handleChainChanged({ chainId, networkVersion, isConnected, } = {}) { ++ super._handleChainChanged({ chainId, networkVersion, isConnected }); ++ // The wallet will send a value of `loading` for `networkVersion` when it intends ++ // to communicate that this value cannot be resolved and should be intepreted as null. ++ // The wallet cannot directly send a null value for `networkVersion` because this ++ // would be a breaking change for existing dapps that use their own embedded MetaMask provider ++ // that expect this value to always be a integer string or the value 'loading'. ++ const targetNetworkVersion = networkVersion === 'loading' ? null : networkVersion; ++ if (targetNetworkVersion !== __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")) { ++ __classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, targetNetworkVersion, "f"); + if (this._state.initialized) { + this.emit('networkChanged', __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")); + } +diff --git a/dist/MetaMaskInpageProvider.mjs.map b/dist/MetaMaskInpageProvider.mjs.map +index f57395722fe8e423cf19229b8940fcf0ed843415..97448e1af39416b71bb50582f6ef7cb6a39b3cad 100644 +--- a/dist/MetaMaskInpageProvider.mjs.map ++++ b/dist/MetaMaskInpageProvider.mjs.map +@@ -1 +1 @@ +-{"version":3,"file":"MetaMaskInpageProvider.mjs","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Json, JsonRpcRequest, JsonRpcResponse } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\n\nimport type { UnvalidatedJsonRpcRequest } from './BaseProvider';\nimport messages from './messages';\nimport { sendSiteMetadata } from './siteMetadata';\nimport type { StreamProviderOptions } from './StreamProvider';\nimport { AbstractStreamProvider } from './StreamProvider';\nimport {\n EMITTED_NOTIFICATIONS,\n getDefaultExternalMiddleware,\n getRpcPromiseCallback,\n NOOP,\n} from './utils';\n\nexport type SendSyncJsonRpcRequest = {\n method:\n | 'eth_accounts'\n | 'eth_coinbase'\n | 'eth_uninstallFilter'\n | 'net_version';\n} & JsonRpcRequest;\n\ntype WarningEventName = keyof SentWarningsState['events'];\n\nexport type MetaMaskInpageProviderOptions = {\n /**\n * Whether the provider should send page metadata.\n */\n shouldSendMetadata?: boolean;\n} & Partial>;\n\ntype SentWarningsState = {\n // methods\n enable: boolean;\n experimentalMethods: boolean;\n send: boolean;\n // events\n events: {\n close: boolean;\n data: boolean;\n networkChanged: boolean;\n notification: boolean;\n };\n};\n\n/**\n * The name of the stream consumed by {@link MetaMaskInpageProvider}.\n */\nexport const MetaMaskInpageProviderStreamName = 'metamask-provider';\n\nexport class MetaMaskInpageProvider extends AbstractStreamProvider {\n protected _sentWarnings: SentWarningsState = {\n // methods\n enable: false,\n experimentalMethods: false,\n send: false,\n // events\n events: {\n close: false,\n data: false,\n networkChanged: false,\n notification: false,\n },\n };\n\n /**\n * Experimental methods can be found here.\n */\n public readonly _metamask: ReturnType<\n MetaMaskInpageProvider['_getExperimentalApi']\n >;\n\n #networkVersion: string | null;\n\n /**\n * Indicating that this provider is a MetaMask provider.\n */\n public readonly isMetaMask: true;\n\n /**\n * Creates a new `MetaMaskInpageProvider`.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.shouldSendMetadata - Whether the provider should\n * send page metadata. Default: `true`.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n shouldSendMetadata,\n }: MetaMaskInpageProviderOptions = {},\n ) {\n super(connectionStream, {\n logger,\n maxEventListeners,\n rpcMiddleware: getDefaultExternalMiddleware(logger),\n });\n\n // We shouldn't perform asynchronous work in the constructor, but at one\n // point we started doing so, and changing this class isn't worth it at\n // the time of writing.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._initializeStateAsync();\n\n this.#networkVersion = null;\n this.isMetaMask = true;\n\n this._sendSync = this._sendSync.bind(this);\n this.enable = this.enable.bind(this);\n this.send = this.send.bind(this);\n this.sendAsync = this.sendAsync.bind(this);\n this._warnOfDeprecation = this._warnOfDeprecation.bind(this);\n\n this._metamask = this._getExperimentalApi();\n\n // handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method } = payload;\n if (EMITTED_NOTIFICATIONS.includes(method)) {\n // deprecated\n // emitted here because that was the original order\n this.emit('data', payload);\n // deprecated\n this.emit('notification', payload.params.result);\n }\n });\n\n // send website metadata\n if (shouldSendMetadata) {\n if (document.readyState === 'complete') {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n } else {\n const domContentLoadedHandler = () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n window.removeEventListener(\n 'DOMContentLoaded',\n domContentLoadedHandler,\n );\n };\n window.addEventListener('DOMContentLoaded', domContentLoadedHandler);\n }\n }\n }\n\n //====================\n // Read-only Properties\n //====================\n\n get chainId(): string | null {\n return super.chainId;\n }\n\n get networkVersion(): string | null {\n return this.#networkVersion;\n }\n\n get selectedAddress(): string | null {\n return super.selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @param payload - The RPC request object.\n * @param callback - The callback function.\n */\n sendAsync(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void {\n this._rpcRequest(payload, callback);\n }\n\n /**\n * We override the following event methods so that we can warn consumers\n * about deprecated events:\n * `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.\n */\n\n addListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.addListener(eventName, listener);\n }\n\n on(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.on(eventName, listener);\n }\n\n once(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.once(eventName, listener);\n }\n\n prependListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.prependListener(eventName, listener);\n }\n\n prependOnceListener(\n eventName: string,\n listener: (...args: unknown[]) => void,\n ) {\n this._warnOfDeprecation(eventName);\n return super.prependOnceListener(eventName, listener);\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n super._handleDisconnect(isRecoverable, errorMessage);\n if (this.#networkVersion && !isRecoverable) {\n this.#networkVersion = null;\n }\n }\n\n /**\n * Warns of deprecation for the given event, if applicable.\n *\n * @param eventName - The name of the event.\n */\n protected _warnOfDeprecation(eventName: string): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare\n if (this._sentWarnings?.events[eventName as WarningEventName] === false) {\n this._log.warn(messages.warnings.events[eventName as WarningEventName]);\n this._sentWarnings.events[eventName as WarningEventName] = true;\n }\n }\n\n //====================\n // Deprecated Methods\n //====================\n\n /**\n * Equivalent to: `ethereum.request('eth_requestAccounts')`.\n *\n * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.\n * @returns A promise that resolves to an array of addresses.\n */\n async enable(): Promise {\n if (!this._sentWarnings.enable) {\n this._log.warn(messages.warnings.enableDeprecation);\n this._sentWarnings.enable = true;\n }\n\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: 'eth_requestAccounts', params: [] },\n getRpcPromiseCallback(resolve, reject),\n );\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n *\n * @deprecated Use \"request\" instead.\n * @param method - The method to request.\n * @param params - Any params for the method.\n * @returns A Promise that resolves with the JSON-RPC response object for the\n * request.\n */\n send(\n method: string,\n params?: Type[],\n ): Promise>;\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @param callback - An error-first callback that will receive the JSON-RPC\n * response object.\n */\n send(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void;\n\n /**\n * Accepts a JSON-RPC request object, and synchronously returns the cached result\n * for the given method. Only supports 4 specific RPC methods.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n */\n send(\n payload: SendSyncJsonRpcRequest,\n ): JsonRpcResponse;\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n send(methodOrPayload: unknown, callbackOrArgs?: unknown): unknown {\n if (!this._sentWarnings.send) {\n this._log.warn(messages.warnings.sendDeprecation);\n this._sentWarnings.send = true;\n }\n\n if (\n typeof methodOrPayload === 'string' &&\n (!callbackOrArgs || Array.isArray(callbackOrArgs))\n ) {\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: methodOrPayload, params: callbackOrArgs },\n getRpcPromiseCallback(resolve, reject, false),\n );\n } catch (error) {\n reject(error);\n }\n });\n } else if (\n methodOrPayload &&\n typeof methodOrPayload === 'object' &&\n typeof callbackOrArgs === 'function'\n ) {\n return this._rpcRequest(\n methodOrPayload as JsonRpcRequest,\n callbackOrArgs as (...args: unknown[]) => void,\n );\n }\n return this._sendSync(methodOrPayload as SendSyncJsonRpcRequest);\n }\n\n /**\n * Internal backwards compatibility method, used in send.\n *\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n * @deprecated\n */\n protected _sendSync(payload: SendSyncJsonRpcRequest) {\n let result;\n switch (payload.method) {\n case 'eth_accounts':\n result = this.selectedAddress ? [this.selectedAddress] : [];\n break;\n\n case 'eth_coinbase':\n result = this.selectedAddress ?? null;\n break;\n\n case 'eth_uninstallFilter':\n this._rpcRequest(payload, NOOP);\n result = true;\n break;\n\n case 'net_version':\n result = this.#networkVersion ?? null;\n break;\n\n default:\n throw new Error(messages.errors.unsupportedSync(payload.method));\n }\n\n return {\n id: payload.id,\n jsonrpc: payload.jsonrpc,\n result,\n };\n }\n\n /**\n * Constructor helper.\n *\n * Gets the experimental _metamask API as Proxy, so that we can warn consumers\n * about its experimental nature.\n *\n * @returns The experimental _metamask API.\n */\n protected _getExperimentalApi() {\n return new Proxy(\n {\n /**\n * Determines if MetaMask is unlocked by the user.\n *\n * @returns Promise resolving to true if MetaMask is currently unlocked.\n */\n isUnlocked: async () => {\n if (!this._state.initialized) {\n await new Promise((resolve) => {\n this.on('_initialized', () => resolve());\n });\n }\n return this._state.isUnlocked;\n },\n\n /**\n * Make a batch RPC request.\n *\n * @param requests - The RPC requests to make.\n */\n requestBatch: async (requests: UnvalidatedJsonRpcRequest[]) => {\n if (!Array.isArray(requests)) {\n throw rpcErrors.invalidRequest({\n message:\n 'Batch requests must be made with an array of request objects.',\n data: requests,\n });\n }\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(requests, getRpcPromiseCallback(resolve, reject));\n });\n },\n },\n {\n get: (obj, prop, ...args) => {\n if (!this._sentWarnings.experimentalMethods) {\n this._log.warn(messages.warnings.experimentalMethods);\n this._sentWarnings.experimentalMethods = true;\n }\n return Reflect.get(obj, prop, ...args);\n },\n },\n );\n }\n\n /**\n * Upon receipt of a new chainId and networkVersion, emits corresponding\n * events and sets relevant public state. Does nothing if neither the chainId\n * nor the networkVersion are different from existing values.\n *\n * @fires MetamaskInpageProvider#networkChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n }: { chainId?: string; networkVersion?: string } = {}) {\n // This will validate the params and disconnect the provider if the\n // networkVersion is 'loading'.\n super._handleChainChanged({ chainId, networkVersion });\n\n if (this._state.isConnected && networkVersion !== this.#networkVersion) {\n this.#networkVersion = networkVersion as string;\n if (this._state.initialized) {\n this.emit('networkChanged', this.#networkVersion);\n }\n }\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"MetaMaskInpageProvider.mjs","sourceRoot":"","sources":["../src/MetaMaskInpageProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Json, JsonRpcRequest, JsonRpcResponse } from '@metamask/utils';\nimport type { Duplex } from 'readable-stream';\n\nimport type { UnvalidatedJsonRpcRequest } from './BaseProvider';\nimport messages from './messages';\nimport { sendSiteMetadata } from './siteMetadata';\nimport type { StreamProviderOptions } from './StreamProvider';\nimport { AbstractStreamProvider } from './StreamProvider';\nimport {\n EMITTED_NOTIFICATIONS,\n getDefaultExternalMiddleware,\n getRpcPromiseCallback,\n NOOP,\n} from './utils';\n\nexport type SendSyncJsonRpcRequest = {\n method:\n | 'eth_accounts'\n | 'eth_coinbase'\n | 'eth_uninstallFilter'\n | 'net_version';\n} & JsonRpcRequest;\n\ntype WarningEventName = keyof SentWarningsState['events'];\n\nexport type MetaMaskInpageProviderOptions = {\n /**\n * Whether the provider should send page metadata.\n */\n shouldSendMetadata?: boolean;\n} & Partial>;\n\ntype SentWarningsState = {\n // methods\n enable: boolean;\n experimentalMethods: boolean;\n send: boolean;\n // events\n events: {\n close: boolean;\n data: boolean;\n networkChanged: boolean;\n notification: boolean;\n };\n};\n\n/**\n * The name of the stream consumed by {@link MetaMaskInpageProvider}.\n */\nexport const MetaMaskInpageProviderStreamName = 'metamask-provider';\n\nexport class MetaMaskInpageProvider extends AbstractStreamProvider {\n protected _sentWarnings: SentWarningsState = {\n // methods\n enable: false,\n experimentalMethods: false,\n send: false,\n // events\n events: {\n close: false,\n data: false,\n networkChanged: false,\n notification: false,\n },\n };\n\n /**\n * Experimental methods can be found here.\n */\n public readonly _metamask: ReturnType<\n MetaMaskInpageProvider['_getExperimentalApi']\n >;\n\n #networkVersion: string | null;\n\n /**\n * Indicating that this provider is a MetaMask provider.\n */\n public readonly isMetaMask: true;\n\n /**\n * Creates a new `MetaMaskInpageProvider`.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.shouldSendMetadata - Whether the provider should\n * send page metadata. Default: `true`.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n shouldSendMetadata,\n }: MetaMaskInpageProviderOptions = {},\n ) {\n super(connectionStream, {\n logger,\n maxEventListeners,\n rpcMiddleware: getDefaultExternalMiddleware(logger),\n });\n\n // We shouldn't perform asynchronous work in the constructor, but at one\n // point we started doing so, and changing this class isn't worth it at\n // the time of writing.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._initializeStateAsync();\n\n this.#networkVersion = null;\n this.isMetaMask = true;\n\n this._sendSync = this._sendSync.bind(this);\n this.enable = this.enable.bind(this);\n this.send = this.send.bind(this);\n this.sendAsync = this.sendAsync.bind(this);\n this._warnOfDeprecation = this._warnOfDeprecation.bind(this);\n\n this._metamask = this._getExperimentalApi();\n\n // handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method } = payload;\n if (EMITTED_NOTIFICATIONS.includes(method)) {\n // deprecated\n // emitted here because that was the original order\n this.emit('data', payload);\n // deprecated\n this.emit('notification', payload.params.result);\n }\n });\n\n // send website metadata\n if (shouldSendMetadata) {\n if (document.readyState === 'complete') {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n } else {\n const domContentLoadedHandler = () => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n sendSiteMetadata(this._rpcEngine, this._log);\n window.removeEventListener(\n 'DOMContentLoaded',\n domContentLoadedHandler,\n );\n };\n window.addEventListener('DOMContentLoaded', domContentLoadedHandler);\n }\n }\n }\n\n //====================\n // Read-only Properties\n //====================\n\n get chainId(): string | null {\n return super.chainId;\n }\n\n get networkVersion(): string | null {\n return this.#networkVersion;\n }\n\n get selectedAddress(): string | null {\n return super.selectedAddress;\n }\n\n //====================\n // Public Methods\n //====================\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @param payload - The RPC request object.\n * @param callback - The callback function.\n */\n sendAsync(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void {\n this._rpcRequest(payload, callback);\n }\n\n /**\n * We override the following event methods so that we can warn consumers\n * about deprecated events:\n * `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.\n */\n\n addListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.addListener(eventName, listener);\n }\n\n on(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.on(eventName, listener);\n }\n\n once(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.once(eventName, listener);\n }\n\n prependListener(eventName: string, listener: (...args: unknown[]) => void) {\n this._warnOfDeprecation(eventName);\n return super.prependListener(eventName, listener);\n }\n\n prependOnceListener(\n eventName: string,\n listener: (...args: unknown[]) => void,\n ) {\n this._warnOfDeprecation(eventName);\n return super.prependOnceListener(eventName, listener);\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * When the provider becomes disconnected, updates internal state and emits\n * required events. Idempotent with respect to the isRecoverable parameter.\n *\n * Error codes per the CloseEvent status codes as required by EIP-1193:\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.\n *\n * @param isRecoverable - Whether the disconnection is recoverable.\n * @param errorMessage - A custom error message.\n * @fires BaseProvider#disconnect - If the disconnection is not recoverable.\n */\n protected _handleDisconnect(isRecoverable: boolean, errorMessage?: string) {\n super._handleDisconnect(isRecoverable, errorMessage);\n if (this.#networkVersion && !isRecoverable) {\n this.#networkVersion = null;\n }\n }\n\n /**\n * Warns of deprecation for the given event, if applicable.\n *\n * @param eventName - The name of the event.\n */\n protected _warnOfDeprecation(eventName: string): void {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare\n if (this._sentWarnings?.events[eventName as WarningEventName] === false) {\n this._log.warn(messages.warnings.events[eventName as WarningEventName]);\n this._sentWarnings.events[eventName as WarningEventName] = true;\n }\n }\n\n //====================\n // Deprecated Methods\n //====================\n\n /**\n * Equivalent to: `ethereum.request('eth_requestAccounts')`.\n *\n * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.\n * @returns A promise that resolves to an array of addresses.\n */\n async enable(): Promise {\n if (!this._sentWarnings.enable) {\n this._log.warn(messages.warnings.enableDeprecation);\n this._sentWarnings.enable = true;\n }\n\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: 'eth_requestAccounts', params: [] },\n getRpcPromiseCallback(resolve, reject),\n );\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Submits an RPC request for the given method, with the given params.\n *\n * @deprecated Use \"request\" instead.\n * @param method - The method to request.\n * @param params - Any params for the method.\n * @returns A Promise that resolves with the JSON-RPC response object for the\n * request.\n */\n send(\n method: string,\n params?: Type[],\n ): Promise>;\n\n /**\n * Submits an RPC request per the given JSON-RPC request object.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @param callback - An error-first callback that will receive the JSON-RPC\n * response object.\n */\n send(\n payload: JsonRpcRequest,\n callback: (error: Error | null, result?: JsonRpcResponse) => void,\n ): void;\n\n /**\n * Accepts a JSON-RPC request object, and synchronously returns the cached result\n * for the given method. Only supports 4 specific RPC methods.\n *\n * @deprecated Use \"request\" instead.\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n */\n send(\n payload: SendSyncJsonRpcRequest,\n ): JsonRpcResponse;\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n send(methodOrPayload: unknown, callbackOrArgs?: unknown): unknown {\n if (!this._sentWarnings.send) {\n this._log.warn(messages.warnings.sendDeprecation);\n this._sentWarnings.send = true;\n }\n\n if (\n typeof methodOrPayload === 'string' &&\n (!callbackOrArgs || Array.isArray(callbackOrArgs))\n ) {\n return new Promise((resolve, reject) => {\n try {\n this._rpcRequest(\n { method: methodOrPayload, params: callbackOrArgs },\n getRpcPromiseCallback(resolve, reject, false),\n );\n } catch (error) {\n reject(error);\n }\n });\n } else if (\n methodOrPayload &&\n typeof methodOrPayload === 'object' &&\n typeof callbackOrArgs === 'function'\n ) {\n return this._rpcRequest(\n methodOrPayload as JsonRpcRequest,\n callbackOrArgs as (...args: unknown[]) => void,\n );\n }\n return this._sendSync(methodOrPayload as SendSyncJsonRpcRequest);\n }\n\n /**\n * Internal backwards compatibility method, used in send.\n *\n * @param payload - A JSON-RPC request object.\n * @returns A JSON-RPC response object.\n * @deprecated\n */\n protected _sendSync(payload: SendSyncJsonRpcRequest) {\n let result;\n switch (payload.method) {\n case 'eth_accounts':\n result = this.selectedAddress ? [this.selectedAddress] : [];\n break;\n\n case 'eth_coinbase':\n result = this.selectedAddress ?? null;\n break;\n\n case 'eth_uninstallFilter':\n this._rpcRequest(payload, NOOP);\n result = true;\n break;\n\n case 'net_version':\n result = this.#networkVersion ?? null;\n break;\n\n default:\n throw new Error(messages.errors.unsupportedSync(payload.method));\n }\n\n return {\n id: payload.id,\n jsonrpc: payload.jsonrpc,\n result,\n };\n }\n\n /**\n * Constructor helper.\n *\n * Gets the experimental _metamask API as Proxy, so that we can warn consumers\n * about its experimental nature.\n *\n * @returns The experimental _metamask API.\n */\n protected _getExperimentalApi() {\n return new Proxy(\n {\n /**\n * Determines if MetaMask is unlocked by the user.\n *\n * @returns Promise resolving to true if MetaMask is currently unlocked.\n */\n isUnlocked: async () => {\n if (!this._state.initialized) {\n await new Promise((resolve) => {\n this.on('_initialized', () => resolve());\n });\n }\n return this._state.isUnlocked;\n },\n\n /**\n * Make a batch RPC request.\n *\n * @param requests - The RPC requests to make.\n */\n requestBatch: async (requests: UnvalidatedJsonRpcRequest[]) => {\n if (!Array.isArray(requests)) {\n throw rpcErrors.invalidRequest({\n message:\n 'Batch requests must be made with an array of request objects.',\n data: requests,\n });\n }\n\n return new Promise((resolve, reject) => {\n this._rpcRequest(requests, getRpcPromiseCallback(resolve, reject));\n });\n },\n },\n {\n get: (obj, prop, ...args) => {\n if (!this._sentWarnings.experimentalMethods) {\n this._log.warn(messages.warnings.experimentalMethods);\n this._sentWarnings.experimentalMethods = true;\n }\n return Reflect.get(obj, prop, ...args);\n },\n },\n );\n }\n\n /**\n * Upon receipt of a new chainId, networkVersion, and isConnected value\n * emits corresponding events and sets relevant public state. We interpret\n * a `networkVersion` with the value of `loading` to be null. The `isConnected`\n * value determines if a `connect` or recoverable `disconnect` has occurred.\n * Child classes that use the `networkVersion` for other purposes must implement\n * additional handling therefore.\n *\n * @fires MetamaskInpageProvider#networkChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n * @param networkInfo.isConnected - Whether the network is available.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n isConnected,\n }: {\n chainId?: string;\n networkVersion?: string;\n isConnected?: boolean;\n } = {}) {\n super._handleChainChanged({ chainId, networkVersion, isConnected });\n\n // The wallet will send a value of `loading` for `networkVersion` when it intends\n // to communicate that this value cannot be resolved and should be intepreted as null.\n // The wallet cannot directly send a null value for `networkVersion` because this\n // would be a breaking change for existing dapps that use their own embedded MetaMask provider\n // that expect this value to always be a integer string or the value 'loading'.\n\n const targetNetworkVersion =\n networkVersion === 'loading' ? null : networkVersion;\n\n if (targetNetworkVersion !== this.#networkVersion) {\n this.#networkVersion = targetNetworkVersion as string;\n if (this._state.initialized) {\n this.emit('networkChanged', this.#networkVersion);\n }\n }\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/StreamProvider.cjs b/dist/StreamProvider.cjs +index 4c7ffee4be4e69b2103a7f8d3cf942a7b5e8feb2..10247263488f26f5567d0877038255b16ff15b39 100644 +--- a/dist/StreamProvider.cjs ++++ b/dist/StreamProvider.cjs +@@ -111,19 +111,16 @@ class AbstractStreamProvider extends BaseProvider_1.BaseProvider { + } + /** + * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. This class does not have a +- * `networkVersion` property, but we rely on receiving a `networkVersion` +- * with the value of `loading` to detect when the network is changing and +- * a recoverable `disconnect` even has occurred. Child classes that use the +- * `networkVersion` for other purposes must implement additional handling +- * therefore. ++ * events and sets relevant public state. Child classes that use the ++ * `networkVersion` for other purposes must implement additional handling. + * + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- _handleChainChanged({ chainId, networkVersion, } = {}) { ++ _handleChainChanged({ chainId, networkVersion, isConnected, } = {}) { + if (!(0, utils_1.isValidChainId)(chainId) || !(0, utils_1.isValidNetworkVersion)(networkVersion)) { + this._log.error(messages_1.default.errors.invalidNetworkParams(), { + chainId, +@@ -131,12 +128,10 @@ class AbstractStreamProvider extends BaseProvider_1.BaseProvider { + }); + return; + } +- if (networkVersion === 'loading') { ++ super._handleChainChanged({ chainId, isConnected }); ++ if (!isConnected) { + this._handleDisconnect(true); + } +- else { +- super._handleChainChanged({ chainId }); +- } + } + } + exports.AbstractStreamProvider = AbstractStreamProvider; +diff --git a/dist/StreamProvider.cjs.map b/dist/StreamProvider.cjs.map +index 26cc2ecb6d0e4d3f12dacc03217cf685c45c17aa..ad871b11033d01bf0848db844ffb8f51981ae97f 100644 +--- a/dist/StreamProvider.cjs.map ++++ b/dist/StreamProvider.cjs.map +@@ -1 +1 @@ +-{"version":3,"file":"StreamProvider.cjs","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createStreamMiddleware } from '@metamask/json-rpc-middleware-stream';\nimport type SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type { Json, JsonRpcParams } from '@metamask/utils';\nimport { duplex as isDuplex } from 'is-stream';\nimport { pipeline } from 'readable-stream';\nimport type { Duplex } from 'readable-stream';\n\nimport type { BaseProviderOptions } from './BaseProvider';\nimport { BaseProvider } from './BaseProvider';\nimport messages from './messages';\nimport {\n EMITTED_NOTIFICATIONS,\n isValidChainId,\n isValidNetworkVersion,\n} from './utils';\n\nexport type StreamProviderOptions = BaseProviderOptions;\n\nexport type JsonRpcConnection = {\n events: SafeEventEmitter;\n middleware: JsonRpcMiddleware;\n stream: Duplex;\n};\n\n/**\n * An abstract EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Implementers must\n * call {@link AbstractStreamProvider._initializeStateAsync} after instantiation\n * to initialize the provider's state.\n */\nexport abstract class AbstractStreamProvider extends BaseProvider {\n protected _jsonRpcConnection: JsonRpcConnection;\n\n /**\n * Creates a new AbstractStreamProvider instance.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack to use.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: StreamProviderOptions = {},\n ) {\n super({ logger, maxEventListeners, rpcMiddleware });\n\n if (!isDuplex(connectionStream)) {\n throw new Error(messages.errors.invalidDuplexStream());\n }\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);\n\n // Set up RPC connection\n // Typecast: The type of `Duplex` is incompatible with the type of\n // `JsonRpcConnection`.\n this._jsonRpcConnection = createStreamMiddleware({\n retryOnMessage: 'METAMASK_EXTENSION_CONNECT_CAN_RETRY',\n }) as unknown as JsonRpcConnection;\n\n pipeline(\n connectionStream,\n this._jsonRpcConnection.stream,\n connectionStream,\n this._handleStreamDisconnect.bind(this, 'MetaMask RpcProvider'),\n );\n\n // Wire up the JsonRpcEngine to the JSON-RPC connection stream\n this._rpcEngine.push(this._jsonRpcConnection.middleware);\n\n // Handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method, params } = payload;\n if (method === 'metamask_accountsChanged') {\n this._handleAccountsChanged(params);\n } else if (method === 'metamask_unlockStateChanged') {\n this._handleUnlockStateChanged(params);\n } else if (method === 'metamask_chainChanged') {\n this._handleChainChanged(params);\n } else if (EMITTED_NOTIFICATIONS.includes(method)) {\n this.emit('message', {\n type: method,\n data: params,\n });\n } else if (method === 'METAMASK_STREAM_FAILURE') {\n connectionStream.destroy(\n new Error(messages.errors.permanentlyDisconnected()),\n );\n }\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n protected async _initializeStateAsync() {\n let initialState: Parameters[0];\n\n try {\n initialState = (await this.request({\n method: 'metamask_getProviderState',\n })) as Parameters[0];\n } catch (error) {\n this._log.error(\n 'MetaMask: Failed to get initial state. Please report this bug.',\n error,\n );\n }\n this._initializeState(initialState);\n }\n\n /**\n * Called when connection is lost to critical streams. Emits an 'error' event\n * from the provider with the error message and stack if present.\n *\n * @param streamName - The name of the stream that disconnected.\n * @param error - The error that caused the disconnection.\n * @fires BaseProvider#disconnect - If the provider is not already\n * disconnected.\n */\n // eslint-disable-next-line no-restricted-syntax\n private _handleStreamDisconnect(streamName: string, error: Error | null) {\n let warningMsg = `MetaMask: Lost connection to \"${streamName}\".`;\n if (error?.stack) {\n warningMsg += `\\n${error.stack}`;\n }\n\n this._log.warn(warningMsg);\n if (this.listenerCount('error') > 0) {\n this.emit('error', warningMsg);\n }\n\n this._handleDisconnect(false, error ? error.message : undefined);\n }\n\n /**\n * Upon receipt of a new chainId and networkVersion, emits corresponding\n * events and sets relevant public state. This class does not have a\n * `networkVersion` property, but we rely on receiving a `networkVersion`\n * with the value of `loading` to detect when the network is changing and\n * a recoverable `disconnect` even has occurred. Child classes that use the\n * `networkVersion` for other purposes must implement additional handling\n * therefore.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n }: {\n chainId?: string | undefined;\n networkVersion?: string | undefined;\n } = {}) {\n if (!isValidChainId(chainId) || !isValidNetworkVersion(networkVersion)) {\n this._log.error(messages.errors.invalidNetworkParams(), {\n chainId,\n networkVersion,\n });\n return;\n }\n\n if (networkVersion === 'loading') {\n this._handleDisconnect(true);\n } else {\n super._handleChainChanged({ chainId });\n }\n }\n}\n\n/**\n * An EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Consumers must\n * call {@link StreamProvider.initialize} after instantiation to complete\n * initialization.\n */\nexport class StreamProvider extends AbstractStreamProvider {\n /**\n * MUST be called after instantiation to complete initialization.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n async initialize() {\n return this._initializeStateAsync();\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"StreamProvider.cjs","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createStreamMiddleware } from '@metamask/json-rpc-middleware-stream';\nimport type SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type { Json, JsonRpcParams } from '@metamask/utils';\nimport { duplex as isDuplex } from 'is-stream';\nimport { pipeline } from 'readable-stream';\nimport type { Duplex } from 'readable-stream';\n\nimport type { BaseProviderOptions } from './BaseProvider';\nimport { BaseProvider } from './BaseProvider';\nimport messages from './messages';\nimport {\n EMITTED_NOTIFICATIONS,\n isValidChainId,\n isValidNetworkVersion,\n} from './utils';\n\nexport type StreamProviderOptions = BaseProviderOptions;\n\nexport type JsonRpcConnection = {\n events: SafeEventEmitter;\n middleware: JsonRpcMiddleware;\n stream: Duplex;\n};\n\n/**\n * An abstract EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Implementers must\n * call {@link AbstractStreamProvider._initializeStateAsync} after instantiation\n * to initialize the provider's state.\n */\nexport abstract class AbstractStreamProvider extends BaseProvider {\n protected _jsonRpcConnection: JsonRpcConnection;\n\n /**\n * Creates a new AbstractStreamProvider instance.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack to use.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: StreamProviderOptions = {},\n ) {\n super({ logger, maxEventListeners, rpcMiddleware });\n\n if (!isDuplex(connectionStream)) {\n throw new Error(messages.errors.invalidDuplexStream());\n }\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);\n\n // Set up RPC connection\n // Typecast: The type of `Duplex` is incompatible with the type of\n // `JsonRpcConnection`.\n this._jsonRpcConnection = createStreamMiddleware({\n retryOnMessage: 'METAMASK_EXTENSION_CONNECT_CAN_RETRY',\n }) as unknown as JsonRpcConnection;\n\n pipeline(\n connectionStream,\n this._jsonRpcConnection.stream,\n connectionStream,\n this._handleStreamDisconnect.bind(this, 'MetaMask RpcProvider'),\n );\n\n // Wire up the JsonRpcEngine to the JSON-RPC connection stream\n this._rpcEngine.push(this._jsonRpcConnection.middleware);\n\n // Handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method, params } = payload;\n if (method === 'metamask_accountsChanged') {\n this._handleAccountsChanged(params);\n } else if (method === 'metamask_unlockStateChanged') {\n this._handleUnlockStateChanged(params);\n } else if (method === 'metamask_chainChanged') {\n this._handleChainChanged(params);\n } else if (EMITTED_NOTIFICATIONS.includes(method)) {\n this.emit('message', {\n type: method,\n data: params,\n });\n } else if (method === 'METAMASK_STREAM_FAILURE') {\n connectionStream.destroy(\n new Error(messages.errors.permanentlyDisconnected()),\n );\n }\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n protected async _initializeStateAsync() {\n let initialState: Parameters[0];\n\n try {\n initialState = (await this.request({\n method: 'metamask_getProviderState',\n })) as Parameters[0];\n } catch (error) {\n this._log.error(\n 'MetaMask: Failed to get initial state. Please report this bug.',\n error,\n );\n }\n this._initializeState(initialState);\n }\n\n /**\n * Called when connection is lost to critical streams. Emits an 'error' event\n * from the provider with the error message and stack if present.\n *\n * @param streamName - The name of the stream that disconnected.\n * @param error - The error that caused the disconnection.\n * @fires BaseProvider#disconnect - If the provider is not already\n * disconnected.\n */\n // eslint-disable-next-line no-restricted-syntax\n private _handleStreamDisconnect(streamName: string, error: Error | null) {\n let warningMsg = `MetaMask: Lost connection to \"${streamName}\".`;\n if (error?.stack) {\n warningMsg += `\\n${error.stack}`;\n }\n\n this._log.warn(warningMsg);\n if (this.listenerCount('error') > 0) {\n this.emit('error', warningMsg);\n }\n\n this._handleDisconnect(false, error ? error.message : undefined);\n }\n\n /**\n * Upon receipt of a new chainId and networkVersion, emits corresponding\n * events and sets relevant public state. Child classes that use the\n * `networkVersion` for other purposes must implement additional handling.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n * @param networkInfo.isConnected - Whether the network is available.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n isConnected,\n }: {\n chainId?: string | undefined;\n networkVersion?: string | undefined;\n isConnected?: boolean | undefined;\n } = {}) {\n if (!isValidChainId(chainId) || !isValidNetworkVersion(networkVersion)) {\n this._log.error(messages.errors.invalidNetworkParams(), {\n chainId,\n networkVersion,\n });\n return;\n }\n\n super._handleChainChanged({ chainId, isConnected });\n\n if (!isConnected) {\n this._handleDisconnect(true);\n }\n }\n}\n\n/**\n * An EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Consumers must\n * call {@link StreamProvider.initialize} after instantiation to complete\n * initialization.\n */\nexport class StreamProvider extends AbstractStreamProvider {\n /**\n * MUST be called after instantiation to complete initialization.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n async initialize() {\n return this._initializeStateAsync();\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/StreamProvider.d.cts b/dist/StreamProvider.d.cts +index 33aec7331989045ccb35f04907430fa72a4eef4f..a9b266b53030ee9194f4ba82ee12ef0b1272dbcd 100644 +--- a/dist/StreamProvider.d.cts ++++ b/dist/StreamProvider.d.cts +@@ -49,21 +49,19 @@ export declare abstract class AbstractStreamProvider extends BaseProvider { + private _handleStreamDisconnect; + /** + * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. This class does not have a +- * `networkVersion` property, but we rely on receiving a `networkVersion` +- * with the value of `loading` to detect when the network is changing and +- * a recoverable `disconnect` even has occurred. Child classes that use the +- * `networkVersion` for other purposes must implement additional handling +- * therefore. ++ * events and sets relevant public state. Child classes that use the ++ * `networkVersion` for other purposes must implement additional handling. + * + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- protected _handleChainChanged({ chainId, networkVersion, }?: { ++ protected _handleChainChanged({ chainId, networkVersion, isConnected, }?: { + chainId?: string | undefined; + networkVersion?: string | undefined; ++ isConnected?: boolean | undefined; + }): void; + } + /** +diff --git a/dist/StreamProvider.d.cts.map b/dist/StreamProvider.d.cts.map +index be38744b9ad52c4ada34b6e64ebbc009e3ecd11f..680bf589305bb4b4064534113ddd3ff7bdbedf25 100644 +--- a/dist/StreamProvider.d.cts.map ++++ b/dist/StreamProvider.d.cts.map +@@ -1 +1 @@ +-{"version":3,"file":"StreamProvider.d.cts","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAEnE,OAAO,KAAK,gBAAgB,qCAAqC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,wBAAwB;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAAuB;AAC1D,OAAO,EAAE,YAAY,EAAE,2BAAuB;AAQ9C,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,8BAAsB,sBAAuB,SAAQ,YAAY;IAC/D,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAEhD;;;;;;;;;OASG;gBAED,gBAAgB,EAAE,MAAM,EACxB,EACE,MAAgB,EAChB,iBAAuB,EACvB,aAAkB,GACnB,GAAE,qBAA0B;IAsD/B;;;;;;OAMG;cACa,qBAAqB;IAgBrC;;;;;;;;OAQG;IAEH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,mBAAmB,CAAC,EAC5B,OAAO,EACP,cAAc,GACf,GAAE;QACD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC;CAeP;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IACxD;;;;;;OAMG;IACG,UAAU;CAGjB"} +\ No newline at end of file ++{"version":3,"file":"StreamProvider.d.cts","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAEnE,OAAO,KAAK,gBAAgB,qCAAqC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,wBAAwB;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAAuB;AAC1D,OAAO,EAAE,YAAY,EAAE,2BAAuB;AAQ9C,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,8BAAsB,sBAAuB,SAAQ,YAAY;IAC/D,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAEhD;;;;;;;;;OASG;gBAED,gBAAgB,EAAE,MAAM,EACxB,EACE,MAAgB,EAChB,iBAAuB,EACvB,aAAkB,GACnB,GAAE,qBAA0B;IAsD/B;;;;;;OAMG;cACa,qBAAqB;IAgBrC;;;;;;;;OAQG;IAEH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,mBAAmB,CAAC,EAC5B,OAAO,EACP,cAAc,EACd,WAAW,GACZ,GAAE;QACD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAC9B;CAeP;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IACxD;;;;;;OAMG;IACG,UAAU;CAGjB"} +\ No newline at end of file +diff --git a/dist/StreamProvider.d.mts b/dist/StreamProvider.d.mts +index a7d9f50393d600a6c97829e95a4721c2ae7c6fec..062b347d33a235183ee1a91c3497395e51839c8b 100644 +--- a/dist/StreamProvider.d.mts ++++ b/dist/StreamProvider.d.mts +@@ -49,21 +49,19 @@ export declare abstract class AbstractStreamProvider extends BaseProvider { + private _handleStreamDisconnect; + /** + * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. This class does not have a +- * `networkVersion` property, but we rely on receiving a `networkVersion` +- * with the value of `loading` to detect when the network is changing and +- * a recoverable `disconnect` even has occurred. Child classes that use the +- * `networkVersion` for other purposes must implement additional handling +- * therefore. ++ * events and sets relevant public state. Child classes that use the ++ * `networkVersion` for other purposes must implement additional handling. + * + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- protected _handleChainChanged({ chainId, networkVersion, }?: { ++ protected _handleChainChanged({ chainId, networkVersion, isConnected, }?: { + chainId?: string | undefined; + networkVersion?: string | undefined; ++ isConnected?: boolean | undefined; + }): void; + } + /** +diff --git a/dist/StreamProvider.d.mts.map b/dist/StreamProvider.d.mts.map +index 582a8b2fe46b1d075ddd8832b5c9fa447f050cc9..b8b11aca0af0fd65657d93b8d427c0f291e803bb 100644 +--- a/dist/StreamProvider.d.mts.map ++++ b/dist/StreamProvider.d.mts.map +@@ -1 +1 @@ +-{"version":3,"file":"StreamProvider.d.mts","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAEnE,OAAO,KAAK,gBAAgB,qCAAqC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,wBAAwB;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAAuB;AAC1D,OAAO,EAAE,YAAY,EAAE,2BAAuB;AAQ9C,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,8BAAsB,sBAAuB,SAAQ,YAAY;IAC/D,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAEhD;;;;;;;;;OASG;gBAED,gBAAgB,EAAE,MAAM,EACxB,EACE,MAAgB,EAChB,iBAAuB,EACvB,aAAkB,GACnB,GAAE,qBAA0B;IAsD/B;;;;;;OAMG;cACa,qBAAqB;IAgBrC;;;;;;;;OAQG;IAEH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,mBAAmB,CAAC,EAC5B,OAAO,EACP,cAAc,GACf,GAAE;QACD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC;CAeP;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IACxD;;;;;;OAMG;IACG,UAAU;CAGjB"} +\ No newline at end of file ++{"version":3,"file":"StreamProvider.d.mts","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAEnE,OAAO,KAAK,gBAAgB,qCAAqC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,wBAAwB;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAAuB;AAC1D,OAAO,EAAE,YAAY,EAAE,2BAAuB;AAQ9C,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,8BAAsB,sBAAuB,SAAQ,YAAY;IAC/D,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAEhD;;;;;;;;;OASG;gBAED,gBAAgB,EAAE,MAAM,EACxB,EACE,MAAgB,EAChB,iBAAuB,EACvB,aAAkB,GACnB,GAAE,qBAA0B;IAsD/B;;;;;;OAMG;cACa,qBAAqB;IAgBrC;;;;;;;;OAQG;IAEH,OAAO,CAAC,uBAAuB;IAc/B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,mBAAmB,CAAC,EAC5B,OAAO,EACP,cAAc,EACd,WAAW,GACZ,GAAE;QACD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAC9B;CAeP;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IACxD;;;;;;OAMG;IACG,UAAU;CAGjB"} +\ No newline at end of file +diff --git a/dist/StreamProvider.mjs b/dist/StreamProvider.mjs +index d120836b4d98cc29d94da2b352f96df228a9c843..76c56fd6344b89d105ff9e8581b4121b33167295 100644 +--- a/dist/StreamProvider.mjs ++++ b/dist/StreamProvider.mjs +@@ -106,19 +106,16 @@ export class AbstractStreamProvider extends BaseProvider { + } + /** + * Upon receipt of a new chainId and networkVersion, emits corresponding +- * events and sets relevant public state. This class does not have a +- * `networkVersion` property, but we rely on receiving a `networkVersion` +- * with the value of `loading` to detect when the network is changing and +- * a recoverable `disconnect` even has occurred. Child classes that use the +- * `networkVersion` for other purposes must implement additional handling +- * therefore. ++ * events and sets relevant public state. Child classes that use the ++ * `networkVersion` for other purposes must implement additional handling. + * + * @fires BaseProvider#chainChanged + * @param networkInfo - An object with network info. + * @param networkInfo.chainId - The latest chain ID. + * @param networkInfo.networkVersion - The latest network ID. ++ * @param networkInfo.isConnected - Whether the network is available. + */ +- _handleChainChanged({ chainId, networkVersion, } = {}) { ++ _handleChainChanged({ chainId, networkVersion, isConnected, } = {}) { + if (!isValidChainId(chainId) || !isValidNetworkVersion(networkVersion)) { + this._log.error(messages.errors.invalidNetworkParams(), { + chainId, +@@ -126,12 +123,10 @@ export class AbstractStreamProvider extends BaseProvider { + }); + return; + } +- if (networkVersion === 'loading') { ++ super._handleChainChanged({ chainId, isConnected }); ++ if (!isConnected) { + this._handleDisconnect(true); + } +- else { +- super._handleChainChanged({ chainId }); +- } + } + } + /** +diff --git a/dist/StreamProvider.mjs.map b/dist/StreamProvider.mjs.map +index 858710e3a4d523ab86c58f9828a08fef7b7cdbcb..6c734a5b54eef43ec01dd31d156056ad17f0b280 100644 +--- a/dist/StreamProvider.mjs.map ++++ b/dist/StreamProvider.mjs.map +@@ -1 +1 @@ +-{"version":3,"file":"StreamProvider.mjs","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createStreamMiddleware } from '@metamask/json-rpc-middleware-stream';\nimport type SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type { Json, JsonRpcParams } from '@metamask/utils';\nimport { duplex as isDuplex } from 'is-stream';\nimport { pipeline } from 'readable-stream';\nimport type { Duplex } from 'readable-stream';\n\nimport type { BaseProviderOptions } from './BaseProvider';\nimport { BaseProvider } from './BaseProvider';\nimport messages from './messages';\nimport {\n EMITTED_NOTIFICATIONS,\n isValidChainId,\n isValidNetworkVersion,\n} from './utils';\n\nexport type StreamProviderOptions = BaseProviderOptions;\n\nexport type JsonRpcConnection = {\n events: SafeEventEmitter;\n middleware: JsonRpcMiddleware;\n stream: Duplex;\n};\n\n/**\n * An abstract EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Implementers must\n * call {@link AbstractStreamProvider._initializeStateAsync} after instantiation\n * to initialize the provider's state.\n */\nexport abstract class AbstractStreamProvider extends BaseProvider {\n protected _jsonRpcConnection: JsonRpcConnection;\n\n /**\n * Creates a new AbstractStreamProvider instance.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack to use.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: StreamProviderOptions = {},\n ) {\n super({ logger, maxEventListeners, rpcMiddleware });\n\n if (!isDuplex(connectionStream)) {\n throw new Error(messages.errors.invalidDuplexStream());\n }\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);\n\n // Set up RPC connection\n // Typecast: The type of `Duplex` is incompatible with the type of\n // `JsonRpcConnection`.\n this._jsonRpcConnection = createStreamMiddleware({\n retryOnMessage: 'METAMASK_EXTENSION_CONNECT_CAN_RETRY',\n }) as unknown as JsonRpcConnection;\n\n pipeline(\n connectionStream,\n this._jsonRpcConnection.stream,\n connectionStream,\n this._handleStreamDisconnect.bind(this, 'MetaMask RpcProvider'),\n );\n\n // Wire up the JsonRpcEngine to the JSON-RPC connection stream\n this._rpcEngine.push(this._jsonRpcConnection.middleware);\n\n // Handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method, params } = payload;\n if (method === 'metamask_accountsChanged') {\n this._handleAccountsChanged(params);\n } else if (method === 'metamask_unlockStateChanged') {\n this._handleUnlockStateChanged(params);\n } else if (method === 'metamask_chainChanged') {\n this._handleChainChanged(params);\n } else if (EMITTED_NOTIFICATIONS.includes(method)) {\n this.emit('message', {\n type: method,\n data: params,\n });\n } else if (method === 'METAMASK_STREAM_FAILURE') {\n connectionStream.destroy(\n new Error(messages.errors.permanentlyDisconnected()),\n );\n }\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n protected async _initializeStateAsync() {\n let initialState: Parameters[0];\n\n try {\n initialState = (await this.request({\n method: 'metamask_getProviderState',\n })) as Parameters[0];\n } catch (error) {\n this._log.error(\n 'MetaMask: Failed to get initial state. Please report this bug.',\n error,\n );\n }\n this._initializeState(initialState);\n }\n\n /**\n * Called when connection is lost to critical streams. Emits an 'error' event\n * from the provider with the error message and stack if present.\n *\n * @param streamName - The name of the stream that disconnected.\n * @param error - The error that caused the disconnection.\n * @fires BaseProvider#disconnect - If the provider is not already\n * disconnected.\n */\n // eslint-disable-next-line no-restricted-syntax\n private _handleStreamDisconnect(streamName: string, error: Error | null) {\n let warningMsg = `MetaMask: Lost connection to \"${streamName}\".`;\n if (error?.stack) {\n warningMsg += `\\n${error.stack}`;\n }\n\n this._log.warn(warningMsg);\n if (this.listenerCount('error') > 0) {\n this.emit('error', warningMsg);\n }\n\n this._handleDisconnect(false, error ? error.message : undefined);\n }\n\n /**\n * Upon receipt of a new chainId and networkVersion, emits corresponding\n * events and sets relevant public state. This class does not have a\n * `networkVersion` property, but we rely on receiving a `networkVersion`\n * with the value of `loading` to detect when the network is changing and\n * a recoverable `disconnect` even has occurred. Child classes that use the\n * `networkVersion` for other purposes must implement additional handling\n * therefore.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n }: {\n chainId?: string | undefined;\n networkVersion?: string | undefined;\n } = {}) {\n if (!isValidChainId(chainId) || !isValidNetworkVersion(networkVersion)) {\n this._log.error(messages.errors.invalidNetworkParams(), {\n chainId,\n networkVersion,\n });\n return;\n }\n\n if (networkVersion === 'loading') {\n this._handleDisconnect(true);\n } else {\n super._handleChainChanged({ chainId });\n }\n }\n}\n\n/**\n * An EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Consumers must\n * call {@link StreamProvider.initialize} after instantiation to complete\n * initialization.\n */\nexport class StreamProvider extends AbstractStreamProvider {\n /**\n * MUST be called after instantiation to complete initialization.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n async initialize() {\n return this._initializeStateAsync();\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"file":"StreamProvider.mjs","sourceRoot":"","sources":["../src/StreamProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createStreamMiddleware } from '@metamask/json-rpc-middleware-stream';\nimport type SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type { Json, JsonRpcParams } from '@metamask/utils';\nimport { duplex as isDuplex } from 'is-stream';\nimport { pipeline } from 'readable-stream';\nimport type { Duplex } from 'readable-stream';\n\nimport type { BaseProviderOptions } from './BaseProvider';\nimport { BaseProvider } from './BaseProvider';\nimport messages from './messages';\nimport {\n EMITTED_NOTIFICATIONS,\n isValidChainId,\n isValidNetworkVersion,\n} from './utils';\n\nexport type StreamProviderOptions = BaseProviderOptions;\n\nexport type JsonRpcConnection = {\n events: SafeEventEmitter;\n middleware: JsonRpcMiddleware;\n stream: Duplex;\n};\n\n/**\n * An abstract EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Implementers must\n * call {@link AbstractStreamProvider._initializeStateAsync} after instantiation\n * to initialize the provider's state.\n */\nexport abstract class AbstractStreamProvider extends BaseProvider {\n protected _jsonRpcConnection: JsonRpcConnection;\n\n /**\n * Creates a new AbstractStreamProvider instance.\n *\n * @param connectionStream - A Node.js duplex stream.\n * @param options - An options bag.\n * @param options.logger - The logging API to use. Default: `console`.\n * @param options.maxEventListeners - The maximum number of event\n * listeners. Default: 100.\n * @param options.rpcMiddleware - The RPC middleware stack to use.\n */\n constructor(\n connectionStream: Duplex,\n {\n logger = console,\n maxEventListeners = 100,\n rpcMiddleware = [],\n }: StreamProviderOptions = {},\n ) {\n super({ logger, maxEventListeners, rpcMiddleware });\n\n if (!isDuplex(connectionStream)) {\n throw new Error(messages.errors.invalidDuplexStream());\n }\n\n // Bind functions to prevent consumers from making unbound calls\n this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);\n\n // Set up RPC connection\n // Typecast: The type of `Duplex` is incompatible with the type of\n // `JsonRpcConnection`.\n this._jsonRpcConnection = createStreamMiddleware({\n retryOnMessage: 'METAMASK_EXTENSION_CONNECT_CAN_RETRY',\n }) as unknown as JsonRpcConnection;\n\n pipeline(\n connectionStream,\n this._jsonRpcConnection.stream,\n connectionStream,\n this._handleStreamDisconnect.bind(this, 'MetaMask RpcProvider'),\n );\n\n // Wire up the JsonRpcEngine to the JSON-RPC connection stream\n this._rpcEngine.push(this._jsonRpcConnection.middleware);\n\n // Handle JSON-RPC notifications\n this._jsonRpcConnection.events.on('notification', (payload) => {\n const { method, params } = payload;\n if (method === 'metamask_accountsChanged') {\n this._handleAccountsChanged(params);\n } else if (method === 'metamask_unlockStateChanged') {\n this._handleUnlockStateChanged(params);\n } else if (method === 'metamask_chainChanged') {\n this._handleChainChanged(params);\n } else if (EMITTED_NOTIFICATIONS.includes(method)) {\n this.emit('message', {\n type: method,\n data: params,\n });\n } else if (method === 'METAMASK_STREAM_FAILURE') {\n connectionStream.destroy(\n new Error(messages.errors.permanentlyDisconnected()),\n );\n }\n });\n }\n\n //====================\n // Private Methods\n //====================\n\n /**\n * MUST be called by child classes.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n protected async _initializeStateAsync() {\n let initialState: Parameters[0];\n\n try {\n initialState = (await this.request({\n method: 'metamask_getProviderState',\n })) as Parameters[0];\n } catch (error) {\n this._log.error(\n 'MetaMask: Failed to get initial state. Please report this bug.',\n error,\n );\n }\n this._initializeState(initialState);\n }\n\n /**\n * Called when connection is lost to critical streams. Emits an 'error' event\n * from the provider with the error message and stack if present.\n *\n * @param streamName - The name of the stream that disconnected.\n * @param error - The error that caused the disconnection.\n * @fires BaseProvider#disconnect - If the provider is not already\n * disconnected.\n */\n // eslint-disable-next-line no-restricted-syntax\n private _handleStreamDisconnect(streamName: string, error: Error | null) {\n let warningMsg = `MetaMask: Lost connection to \"${streamName}\".`;\n if (error?.stack) {\n warningMsg += `\\n${error.stack}`;\n }\n\n this._log.warn(warningMsg);\n if (this.listenerCount('error') > 0) {\n this.emit('error', warningMsg);\n }\n\n this._handleDisconnect(false, error ? error.message : undefined);\n }\n\n /**\n * Upon receipt of a new chainId and networkVersion, emits corresponding\n * events and sets relevant public state. Child classes that use the\n * `networkVersion` for other purposes must implement additional handling.\n *\n * @fires BaseProvider#chainChanged\n * @param networkInfo - An object with network info.\n * @param networkInfo.chainId - The latest chain ID.\n * @param networkInfo.networkVersion - The latest network ID.\n * @param networkInfo.isConnected - Whether the network is available.\n */\n protected _handleChainChanged({\n chainId,\n networkVersion,\n isConnected,\n }: {\n chainId?: string | undefined;\n networkVersion?: string | undefined;\n isConnected?: boolean | undefined;\n } = {}) {\n if (!isValidChainId(chainId) || !isValidNetworkVersion(networkVersion)) {\n this._log.error(messages.errors.invalidNetworkParams(), {\n chainId,\n networkVersion,\n });\n return;\n }\n\n super._handleChainChanged({ chainId, isConnected });\n\n if (!isConnected) {\n this._handleDisconnect(true);\n }\n }\n}\n\n/**\n * An EIP-1193 provider wired to some duplex stream via a\n * `json-rpc-middleware-stream` JSON-RPC stream middleware. Consumers must\n * call {@link StreamProvider.initialize} after instantiation to complete\n * initialization.\n */\nexport class StreamProvider extends AbstractStreamProvider {\n /**\n * MUST be called after instantiation to complete initialization.\n *\n * Calls `metamask_getProviderState` and passes the result to\n * {@link BaseProvider._initializeState}. Logs an error if getting initial state\n * fails. Throws if called after initialization has completed.\n */\n async initialize() {\n return this._initializeStateAsync();\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/utils.cjs b/dist/utils.cjs +index e8d637dce7aeddd253a8f409fa43216fe922364d..65a06560707b527a3f2c711d205d2f9307060abf 100644 +--- a/dist/utils.cjs ++++ b/dist/utils.cjs +@@ -9,6 +9,8 @@ const createRpcWarningMiddleware_1 = require("./middleware/createRpcWarningMiddl + exports.UUID_V4_REGEX = /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u; + // https://stackoverflow.com/a/20204811 + exports.FQDN_REGEX = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/u; ++// https://stackoverflow.com/a/9523559 ++const POSITIVE_INTEGER_REGEX = /^(\d*[1-9]\d*|0)$/u; + exports.EMITTED_NOTIFICATIONS = Object.freeze([ + 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager + ]); +@@ -75,12 +77,13 @@ const isValidChainId = (chainId) => Boolean(chainId) && typeof chainId === 'stri + exports.isValidChainId = isValidChainId; + /** + * Checks whether the given network version is valid, meaning if it is non-empty +- * string. ++ * integer string or the value 'loading'. + * + * @param networkVersion - The network version to validate. + * @returns Whether the given network version is valid. + */ +-const isValidNetworkVersion = (networkVersion) => Boolean(networkVersion) && typeof networkVersion === 'string'; ++const isValidNetworkVersion = (networkVersion) => typeof networkVersion === 'string' && ++ (POSITIVE_INTEGER_REGEX.test(networkVersion) || networkVersion === 'loading'); + exports.isValidNetworkVersion = isValidNetworkVersion; + const NOOP = () => undefined; + exports.NOOP = NOOP; +diff --git a/dist/utils.cjs.map b/dist/utils.cjs.map +index b1396454a57ebdeeaf483b71ca9cea49fd6f9e05..53f30e974ab8340858c5aaa7e464738747126927 100644 +--- a/dist/utils.cjs.map ++++ b/dist/utils.cjs.map +@@ -1 +1 @@ +-{"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AACA,+DAAoE;AACpE,qDAAiD;AAOjD,4FAAqF;AASrF,YAAY;AAEZ,wGAAwG;AAC3F,QAAA,aAAa,GACxB,sGAAsG,CAAC;AAEzG,uCAAuC;AAC1B,QAAA,UAAU,GACrB,0EAA0E,CAAC;AAEhE,QAAA,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,kBAAkB,EAAE,+CAA+C;CACpE,CAAC,CAAC;AAEH,oBAAoB;AAEpB;;;;;;GAMG;AACI,MAAM,4BAA4B,GAAG,CAAC,SAAsB,OAAO,EAAE,EAAE,CAAC;IAC7E,IAAA,yCAAuB,GAAE;IACzB,qBAAqB,CAAC,MAAM,CAAC;IAC7B,IAAA,uDAA0B,EAAC,MAAM,CAAC;CACnC,CAAC;AAJW,QAAA,4BAA4B,gCAIvC;AAEF;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,GAAgB;IAEhB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACjC,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG,sBAAS,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,kDAAkD;gBAC3D,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,qDAAqD;AAC9C,MAAM,qBAAqB,GAChC,CACE,OAA8B,EAC9B,MAA+B,EAC/B,YAAY,GAAG,IAAI,EACnB,EAAE,CACJ,CAAC,KAAY,EAAE,QAAsC,EAAQ,EAAE;IAC7D,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAdS,QAAA,qBAAqB,yBAc9B;AAEJ;;;;;;GAMG;AACI,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CACpE,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AADjE,QAAA,cAAc,kBACmD;AAE9E;;;;;;GAMG;AACI,MAAM,qBAAqB,GAAG,CACnC,cAAuB,EACG,EAAE,CAC5B,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,cAAc,KAAK,QAAQ,CAAC;AAHnD,QAAA,qBAAqB,yBAG8B;AAEzD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;AAAvB,QAAA,IAAI,QAAmB","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport { createRpcWarningMiddleware } from './middleware/createRpcWarningMiddleware';\n\nexport type Maybe = Partial | null | undefined;\n\nexport type ConsoleLike = Pick<\n Console,\n 'log' | 'warn' | 'error' | 'debug' | 'info' | 'trace'\n>;\n\n// Constants\n\n// https://github.com/thenativeweb/uuidv4/blob/bdcf3a3138bef4fb7c51f389a170666f9012c478/lib/uuidv4.ts#L5\nexport const UUID_V4_REGEX =\n /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;\n\n// https://stackoverflow.com/a/20204811\nexport const FQDN_REGEX =\n /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\\.)+[a-zA-Z]{2,63}$)/u;\n\nexport const EMITTED_NOTIFICATIONS = Object.freeze([\n 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager\n]);\n\n// Utility functions\n\n/**\n * Gets the default middleware for external providers, consisting of an ID\n * remapping middleware and an error middleware.\n *\n * @param logger - The logger to use in the error middleware.\n * @returns An array of @metamask/json-rpc-engine middleware functions.\n */\nexport const getDefaultExternalMiddleware = (logger: ConsoleLike = console) => [\n createIdRemapMiddleware(),\n createErrorMiddleware(logger),\n createRpcWarningMiddleware(logger),\n];\n\n/**\n * A `json-rpc-engine` middleware that logs RPC errors and validates the request\n * method.\n *\n * @param log - The logging API to use.\n * @returns A @metamask/json-rpc-engine middleware function.\n */\nfunction createErrorMiddleware(\n log: ConsoleLike,\n): JsonRpcMiddleware {\n return (request, response, next) => {\n // json-rpc-engine will terminate the request when it notices this error\n if (typeof request.method !== 'string' || !request.method) {\n response.error = rpcErrors.invalidRequest({\n message: `The request 'method' must be a non-empty string.`,\n data: request,\n });\n }\n\n next((done) => {\n const { error } = response;\n if (!error) {\n return done();\n }\n log.warn(`MetaMask - RPC Error: ${error.message}`, error);\n return done();\n });\n };\n}\n\n// resolve response.result or response, reject errors\nexport const getRpcPromiseCallback =\n (\n resolve: (value?: any) => void,\n reject: (error?: Error) => void,\n unwrapResult = true,\n ) =>\n (error: Error, response: PendingJsonRpcResponse): void => {\n if (error || response.error) {\n reject(error || response.error);\n } else {\n !unwrapResult || Array.isArray(response)\n ? resolve(response)\n : resolve(response.result);\n }\n };\n\n/**\n * Checks whether the given chain ID is valid, meaning if it is non-empty,\n * '0x'-prefixed string.\n *\n * @param chainId - The chain ID to validate.\n * @returns Whether the given chain ID is valid.\n */\nexport const isValidChainId = (chainId: unknown): chainId is string =>\n Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x');\n\n/**\n * Checks whether the given network version is valid, meaning if it is non-empty\n * string.\n *\n * @param networkVersion - The network version to validate.\n * @returns Whether the given network version is valid.\n */\nexport const isValidNetworkVersion = (\n networkVersion: unknown,\n): networkVersion is string =>\n Boolean(networkVersion) && typeof networkVersion === 'string';\n\nexport const NOOP = () => undefined;\n"]} +\ No newline at end of file ++{"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AACA,+DAAoE;AACpE,qDAAiD;AAOjD,4FAAqF;AASrF,YAAY;AAEZ,wGAAwG;AAC3F,QAAA,aAAa,GACxB,sGAAsG,CAAC;AAEzG,uCAAuC;AAC1B,QAAA,UAAU,GACrB,0EAA0E,CAAC;AAE7E,sCAAsC;AACtC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEvC,QAAA,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,kBAAkB,EAAE,+CAA+C;CACpE,CAAC,CAAC;AAEH,oBAAoB;AAEpB;;;;;;GAMG;AACI,MAAM,4BAA4B,GAAG,CAAC,SAAsB,OAAO,EAAE,EAAE,CAAC;IAC7E,IAAA,yCAAuB,GAAE;IACzB,qBAAqB,CAAC,MAAM,CAAC;IAC7B,IAAA,uDAA0B,EAAC,MAAM,CAAC;CACnC,CAAC;AAJW,QAAA,4BAA4B,gCAIvC;AAEF;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,GAAgB;IAEhB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACjC,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG,sBAAS,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,kDAAkD;gBAC3D,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,qDAAqD;AAC9C,MAAM,qBAAqB,GAChC,CACE,OAA8B,EAC9B,MAA+B,EAC/B,YAAY,GAAG,IAAI,EACnB,EAAE,CACJ,CAAC,KAAY,EAAE,QAAsC,EAAQ,EAAE;IAC7D,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAdS,QAAA,qBAAqB,yBAc9B;AAEJ;;;;;;GAMG;AACI,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CACpE,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AADjE,QAAA,cAAc,kBACmD;AAE9E;;;;;;GAMG;AACI,MAAM,qBAAqB,GAAG,CACnC,cAAuB,EACU,EAAE,CACnC,OAAO,cAAc,KAAK,QAAQ;IAClC,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC;AAJnE,QAAA,qBAAqB,yBAI8C;AAEzE,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;AAAvB,QAAA,IAAI,QAAmB","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport { createRpcWarningMiddleware } from './middleware/createRpcWarningMiddleware';\n\nexport type Maybe = Partial | null | undefined;\n\nexport type ConsoleLike = Pick<\n Console,\n 'log' | 'warn' | 'error' | 'debug' | 'info' | 'trace'\n>;\n\n// Constants\n\n// https://github.com/thenativeweb/uuidv4/blob/bdcf3a3138bef4fb7c51f389a170666f9012c478/lib/uuidv4.ts#L5\nexport const UUID_V4_REGEX =\n /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;\n\n// https://stackoverflow.com/a/20204811\nexport const FQDN_REGEX =\n /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\\.)+[a-zA-Z]{2,63}$)/u;\n\n// https://stackoverflow.com/a/9523559\nconst POSITIVE_INTEGER_REGEX = /^(\\d*[1-9]\\d*|0)$/u;\n\nexport const EMITTED_NOTIFICATIONS = Object.freeze([\n 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager\n]);\n\n// Utility functions\n\n/**\n * Gets the default middleware for external providers, consisting of an ID\n * remapping middleware and an error middleware.\n *\n * @param logger - The logger to use in the error middleware.\n * @returns An array of @metamask/json-rpc-engine middleware functions.\n */\nexport const getDefaultExternalMiddleware = (logger: ConsoleLike = console) => [\n createIdRemapMiddleware(),\n createErrorMiddleware(logger),\n createRpcWarningMiddleware(logger),\n];\n\n/**\n * A `json-rpc-engine` middleware that logs RPC errors and validates the request\n * method.\n *\n * @param log - The logging API to use.\n * @returns A @metamask/json-rpc-engine middleware function.\n */\nfunction createErrorMiddleware(\n log: ConsoleLike,\n): JsonRpcMiddleware {\n return (request, response, next) => {\n // json-rpc-engine will terminate the request when it notices this error\n if (typeof request.method !== 'string' || !request.method) {\n response.error = rpcErrors.invalidRequest({\n message: `The request 'method' must be a non-empty string.`,\n data: request,\n });\n }\n\n next((done) => {\n const { error } = response;\n if (!error) {\n return done();\n }\n log.warn(`MetaMask - RPC Error: ${error.message}`, error);\n return done();\n });\n };\n}\n\n// resolve response.result or response, reject errors\nexport const getRpcPromiseCallback =\n (\n resolve: (value?: any) => void,\n reject: (error?: Error) => void,\n unwrapResult = true,\n ) =>\n (error: Error, response: PendingJsonRpcResponse): void => {\n if (error || response.error) {\n reject(error || response.error);\n } else {\n !unwrapResult || Array.isArray(response)\n ? resolve(response)\n : resolve(response.result);\n }\n };\n\n/**\n * Checks whether the given chain ID is valid, meaning if it is non-empty,\n * '0x'-prefixed string.\n *\n * @param chainId - The chain ID to validate.\n * @returns Whether the given chain ID is valid.\n */\nexport const isValidChainId = (chainId: unknown): chainId is string =>\n Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x');\n\n/**\n * Checks whether the given network version is valid, meaning if it is non-empty\n * integer string or the value 'loading'.\n *\n * @param networkVersion - The network version to validate.\n * @returns Whether the given network version is valid.\n */\nexport const isValidNetworkVersion = (\n networkVersion: unknown,\n): networkVersion is string | null =>\n typeof networkVersion === 'string' &&\n (POSITIVE_INTEGER_REGEX.test(networkVersion) || networkVersion === 'loading');\n\nexport const NOOP = () => undefined;\n"]} +\ No newline at end of file +diff --git a/dist/utils.d.cts b/dist/utils.d.cts +index a1cdeb51719058c35cf3b257f6879680eadb6856..f0b64f034858c490af80b7d9c571de1e9af5ac9a 100644 +--- a/dist/utils.d.cts ++++ b/dist/utils.d.cts +@@ -24,11 +24,11 @@ export declare const getRpcPromiseCallback: (resolve: (value?: any) => void, rej + export declare const isValidChainId: (chainId: unknown) => chainId is string; + /** + * Checks whether the given network version is valid, meaning if it is non-empty +- * string. ++ * integer string or the value 'loading'. + * + * @param networkVersion - The network version to validate. + * @returns Whether the given network version is valid. + */ +-export declare const isValidNetworkVersion: (networkVersion: unknown) => networkVersion is string; ++export declare const isValidNetworkVersion: (networkVersion: unknown) => networkVersion is string | null; + export declare const NOOP: () => undefined; + //# sourceMappingURL=utils.d.cts.map +\ No newline at end of file +diff --git a/dist/utils.d.cts.map b/dist/utils.d.cts.map +index 9aaac725656815fe8c2c2771c476ac4f6ba5b8eb..a4ff36c93f73ebb6462a634a740416cb559a61a5 100644 +--- a/dist/utils.d.cts.map ++++ b/dist/utils.d.cts.map +@@ -1 +1 @@ +-{"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAGnE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,sBAAsB,EACvB,wBAAwB;AAIzB,MAAM,MAAM,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,OAAO,EACP,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CACtD,CAAC;AAKF,eAAO,MAAM,aAAa,QAC8E,CAAC;AAGzG,eAAO,MAAM,UAAU,QACqD,CAAC;AAE7E,eAAO,MAAM,qBAAqB,mBAEhC,CAAC;AAIH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,YAAY,WAAW,6CAI/D,CAAC;AAiCF,eAAO,MAAM,qBAAqB,YAErB,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,UACtB,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,qCAGzB,KAAK,YAAY,sBAAsB,CAAC,IAAI,CAAC,KAAG,IAQvD,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,OAAO,IAAI,MACgB,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,mBAChB,OAAO,KACtB,cAAc,IAAI,MAC0C,CAAC;AAEhE,eAAO,MAAM,IAAI,iBAAkB,CAAC"} +\ No newline at end of file ++{"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAGnE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,sBAAsB,EACvB,wBAAwB;AAIzB,MAAM,MAAM,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,OAAO,EACP,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CACtD,CAAC;AAKF,eAAO,MAAM,aAAa,QAC8E,CAAC;AAGzG,eAAO,MAAM,UAAU,QACqD,CAAC;AAK7E,eAAO,MAAM,qBAAqB,mBAEhC,CAAC;AAIH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,YAAY,WAAW,6CAI/D,CAAC;AAiCF,eAAO,MAAM,qBAAqB,YAErB,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,UACtB,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,qCAGzB,KAAK,YAAY,sBAAsB,CAAC,IAAI,CAAC,KAAG,IAQvD,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,OAAO,IAAI,MACgB,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,mBAChB,OAAO,KACtB,cAAc,IAAI,MAAM,GAAG,IAEiD,CAAC;AAEhF,eAAO,MAAM,IAAI,iBAAkB,CAAC"} +\ No newline at end of file +diff --git a/dist/utils.d.mts b/dist/utils.d.mts +index 9001ed0963fdb2bffdc5c0497b0c91763e34f4db..440a3d167f10a5c1b562a0782f7e011a5450145a 100644 +--- a/dist/utils.d.mts ++++ b/dist/utils.d.mts +@@ -24,11 +24,11 @@ export declare const getRpcPromiseCallback: (resolve: (value?: any) => void, rej + export declare const isValidChainId: (chainId: unknown) => chainId is string; + /** + * Checks whether the given network version is valid, meaning if it is non-empty +- * string. ++ * integer string or the value 'loading'. + * + * @param networkVersion - The network version to validate. + * @returns Whether the given network version is valid. + */ +-export declare const isValidNetworkVersion: (networkVersion: unknown) => networkVersion is string; ++export declare const isValidNetworkVersion: (networkVersion: unknown) => networkVersion is string | null; + export declare const NOOP: () => undefined; + //# sourceMappingURL=utils.d.mts.map +\ No newline at end of file +diff --git a/dist/utils.d.mts.map b/dist/utils.d.mts.map +index e10cdda420846efccb6f52d150da2902ace49dc8..0e4d50501892b26213d362470d76e027035a67fd 100644 +--- a/dist/utils.d.mts.map ++++ b/dist/utils.d.mts.map +@@ -1 +1 @@ +-{"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAGnE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,sBAAsB,EACvB,wBAAwB;AAIzB,MAAM,MAAM,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,OAAO,EACP,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CACtD,CAAC;AAKF,eAAO,MAAM,aAAa,QAC8E,CAAC;AAGzG,eAAO,MAAM,UAAU,QACqD,CAAC;AAE7E,eAAO,MAAM,qBAAqB,mBAEhC,CAAC;AAIH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,YAAY,WAAW,6CAI/D,CAAC;AAiCF,eAAO,MAAM,qBAAqB,YAErB,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,UACtB,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,qCAGzB,KAAK,YAAY,sBAAsB,CAAC,IAAI,CAAC,KAAG,IAQvD,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,OAAO,IAAI,MACgB,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,mBAChB,OAAO,KACtB,cAAc,IAAI,MAC0C,CAAC;AAEhE,eAAO,MAAM,IAAI,iBAAkB,CAAC"} +\ No newline at end of file ++{"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kCAAkC;AAGnE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,sBAAsB,EACvB,wBAAwB;AAIzB,MAAM,MAAM,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,OAAO,EACP,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CACtD,CAAC;AAKF,eAAO,MAAM,aAAa,QAC8E,CAAC;AAGzG,eAAO,MAAM,UAAU,QACqD,CAAC;AAK7E,eAAO,MAAM,qBAAqB,mBAEhC,CAAC;AAIH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,YAAY,WAAW,6CAI/D,CAAC;AAiCF,eAAO,MAAM,qBAAqB,YAErB,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,UACtB,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,qCAGzB,KAAK,YAAY,sBAAsB,CAAC,IAAI,CAAC,KAAG,IAQvD,CAAC;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,OAAO,IAAI,MACgB,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,mBAChB,OAAO,KACtB,cAAc,IAAI,MAAM,GAAG,IAEiD,CAAC;AAEhF,eAAO,MAAM,IAAI,iBAAkB,CAAC"} +\ No newline at end of file +diff --git a/dist/utils.mjs b/dist/utils.mjs +index bb0299702a637dc539820e123382966ecf2c0e8e..623f1ce4c3f252312ad3ada4ee08f865c1f58a9b 100644 +--- a/dist/utils.mjs ++++ b/dist/utils.mjs +@@ -6,6 +6,8 @@ import { createRpcWarningMiddleware } from "./middleware/createRpcWarningMiddlew + export const UUID_V4_REGEX = /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u; + // https://stackoverflow.com/a/20204811 + export const FQDN_REGEX = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/u; ++// https://stackoverflow.com/a/9523559 ++const POSITIVE_INTEGER_REGEX = /^(\d*[1-9]\d*|0)$/u; + export const EMITTED_NOTIFICATIONS = Object.freeze([ + 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager + ]); +@@ -69,11 +71,12 @@ export const getRpcPromiseCallback = (resolve, reject, unwrapResult = true) => ( + export const isValidChainId = (chainId) => Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x'); + /** + * Checks whether the given network version is valid, meaning if it is non-empty +- * string. ++ * integer string or the value 'loading'. + * + * @param networkVersion - The network version to validate. + * @returns Whether the given network version is valid. + */ +-export const isValidNetworkVersion = (networkVersion) => Boolean(networkVersion) && typeof networkVersion === 'string'; ++export const isValidNetworkVersion = (networkVersion) => typeof networkVersion === 'string' && ++ (POSITIVE_INTEGER_REGEX.test(networkVersion) || networkVersion === 'loading'); + export const NOOP = () => undefined; + //# sourceMappingURL=utils.mjs.map +\ No newline at end of file +diff --git a/dist/utils.mjs.map b/dist/utils.mjs.map +index a9e9357bb46464fbea2641cb9fd12a74fb048000..ba7e940beaa247458f945c16794760a2c40f0669 100644 +--- a/dist/utils.mjs.map ++++ b/dist/utils.mjs.map +@@ -1 +1 @@ +-{"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,kCAAkC;AACpE,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAOjD,OAAO,EAAE,0BAA0B,EAAE,oDAAgD;AASrF,YAAY;AAEZ,wGAAwG;AACxG,MAAM,CAAC,MAAM,aAAa,GACxB,sGAAsG,CAAC;AAEzG,uCAAuC;AACvC,MAAM,CAAC,MAAM,UAAU,GACrB,0EAA0E,CAAC;AAE7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,kBAAkB,EAAE,+CAA+C;CACpE,CAAC,CAAC;AAEH,oBAAoB;AAEpB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,SAAsB,OAAO,EAAE,EAAE,CAAC;IAC7E,uBAAuB,EAAE;IACzB,qBAAqB,CAAC,MAAM,CAAC;IAC7B,0BAA0B,CAAC,MAAM,CAAC;CACnC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,GAAgB;IAEhB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACjC,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,kDAAkD;gBAC3D,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,qBAAqB,GAChC,CACE,OAA8B,EAC9B,MAA+B,EAC/B,YAAY,GAAG,IAAI,EACnB,EAAE,CACJ,CAAC,KAAY,EAAE,QAAsC,EAAQ,EAAE;IAC7D,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CACpE,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,cAAuB,EACG,EAAE,CAC5B,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,cAAc,KAAK,QAAQ,CAAC;AAEhE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport { createRpcWarningMiddleware } from './middleware/createRpcWarningMiddleware';\n\nexport type Maybe = Partial | null | undefined;\n\nexport type ConsoleLike = Pick<\n Console,\n 'log' | 'warn' | 'error' | 'debug' | 'info' | 'trace'\n>;\n\n// Constants\n\n// https://github.com/thenativeweb/uuidv4/blob/bdcf3a3138bef4fb7c51f389a170666f9012c478/lib/uuidv4.ts#L5\nexport const UUID_V4_REGEX =\n /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;\n\n// https://stackoverflow.com/a/20204811\nexport const FQDN_REGEX =\n /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\\.)+[a-zA-Z]{2,63}$)/u;\n\nexport const EMITTED_NOTIFICATIONS = Object.freeze([\n 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager\n]);\n\n// Utility functions\n\n/**\n * Gets the default middleware for external providers, consisting of an ID\n * remapping middleware and an error middleware.\n *\n * @param logger - The logger to use in the error middleware.\n * @returns An array of @metamask/json-rpc-engine middleware functions.\n */\nexport const getDefaultExternalMiddleware = (logger: ConsoleLike = console) => [\n createIdRemapMiddleware(),\n createErrorMiddleware(logger),\n createRpcWarningMiddleware(logger),\n];\n\n/**\n * A `json-rpc-engine` middleware that logs RPC errors and validates the request\n * method.\n *\n * @param log - The logging API to use.\n * @returns A @metamask/json-rpc-engine middleware function.\n */\nfunction createErrorMiddleware(\n log: ConsoleLike,\n): JsonRpcMiddleware {\n return (request, response, next) => {\n // json-rpc-engine will terminate the request when it notices this error\n if (typeof request.method !== 'string' || !request.method) {\n response.error = rpcErrors.invalidRequest({\n message: `The request 'method' must be a non-empty string.`,\n data: request,\n });\n }\n\n next((done) => {\n const { error } = response;\n if (!error) {\n return done();\n }\n log.warn(`MetaMask - RPC Error: ${error.message}`, error);\n return done();\n });\n };\n}\n\n// resolve response.result or response, reject errors\nexport const getRpcPromiseCallback =\n (\n resolve: (value?: any) => void,\n reject: (error?: Error) => void,\n unwrapResult = true,\n ) =>\n (error: Error, response: PendingJsonRpcResponse): void => {\n if (error || response.error) {\n reject(error || response.error);\n } else {\n !unwrapResult || Array.isArray(response)\n ? resolve(response)\n : resolve(response.result);\n }\n };\n\n/**\n * Checks whether the given chain ID is valid, meaning if it is non-empty,\n * '0x'-prefixed string.\n *\n * @param chainId - The chain ID to validate.\n * @returns Whether the given chain ID is valid.\n */\nexport const isValidChainId = (chainId: unknown): chainId is string =>\n Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x');\n\n/**\n * Checks whether the given network version is valid, meaning if it is non-empty\n * string.\n *\n * @param networkVersion - The network version to validate.\n * @returns Whether the given network version is valid.\n */\nexport const isValidNetworkVersion = (\n networkVersion: unknown,\n): networkVersion is string =>\n Boolean(networkVersion) && typeof networkVersion === 'string';\n\nexport const NOOP = () => undefined;\n"]} +\ No newline at end of file ++{"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,kCAAkC;AACpE,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAOjD,OAAO,EAAE,0BAA0B,EAAE,oDAAgD;AASrF,YAAY;AAEZ,wGAAwG;AACxG,MAAM,CAAC,MAAM,aAAa,GACxB,sGAAsG,CAAC;AAEzG,uCAAuC;AACvC,MAAM,CAAC,MAAM,UAAU,GACrB,0EAA0E,CAAC;AAE7E,sCAAsC;AACtC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,kBAAkB,EAAE,+CAA+C;CACpE,CAAC,CAAC;AAEH,oBAAoB;AAEpB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,SAAsB,OAAO,EAAE,EAAE,CAAC;IAC7E,uBAAuB,EAAE;IACzB,qBAAqB,CAAC,MAAM,CAAC;IAC7B,0BAA0B,CAAC,MAAM,CAAC;CACnC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,GAAgB;IAEhB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACjC,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,kDAAkD;gBAC3D,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,qBAAqB,GAChC,CACE,OAA8B,EAC9B,MAA+B,EAC/B,YAAY,GAAG,IAAI,EACnB,EAAE,CACJ,CAAC,KAAY,EAAE,QAAsC,EAAQ,EAAE;IAC7D,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CACpE,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,cAAuB,EACU,EAAE,CACnC,OAAO,cAAc,KAAK,QAAQ;IAClC,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport { createRpcWarningMiddleware } from './middleware/createRpcWarningMiddleware';\n\nexport type Maybe = Partial | null | undefined;\n\nexport type ConsoleLike = Pick<\n Console,\n 'log' | 'warn' | 'error' | 'debug' | 'info' | 'trace'\n>;\n\n// Constants\n\n// https://github.com/thenativeweb/uuidv4/blob/bdcf3a3138bef4fb7c51f389a170666f9012c478/lib/uuidv4.ts#L5\nexport const UUID_V4_REGEX =\n /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;\n\n// https://stackoverflow.com/a/20204811\nexport const FQDN_REGEX =\n /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\\.)+[a-zA-Z]{2,63}$)/u;\n\n// https://stackoverflow.com/a/9523559\nconst POSITIVE_INTEGER_REGEX = /^(\\d*[1-9]\\d*|0)$/u;\n\nexport const EMITTED_NOTIFICATIONS = Object.freeze([\n 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager\n]);\n\n// Utility functions\n\n/**\n * Gets the default middleware for external providers, consisting of an ID\n * remapping middleware and an error middleware.\n *\n * @param logger - The logger to use in the error middleware.\n * @returns An array of @metamask/json-rpc-engine middleware functions.\n */\nexport const getDefaultExternalMiddleware = (logger: ConsoleLike = console) => [\n createIdRemapMiddleware(),\n createErrorMiddleware(logger),\n createRpcWarningMiddleware(logger),\n];\n\n/**\n * A `json-rpc-engine` middleware that logs RPC errors and validates the request\n * method.\n *\n * @param log - The logging API to use.\n * @returns A @metamask/json-rpc-engine middleware function.\n */\nfunction createErrorMiddleware(\n log: ConsoleLike,\n): JsonRpcMiddleware {\n return (request, response, next) => {\n // json-rpc-engine will terminate the request when it notices this error\n if (typeof request.method !== 'string' || !request.method) {\n response.error = rpcErrors.invalidRequest({\n message: `The request 'method' must be a non-empty string.`,\n data: request,\n });\n }\n\n next((done) => {\n const { error } = response;\n if (!error) {\n return done();\n }\n log.warn(`MetaMask - RPC Error: ${error.message}`, error);\n return done();\n });\n };\n}\n\n// resolve response.result or response, reject errors\nexport const getRpcPromiseCallback =\n (\n resolve: (value?: any) => void,\n reject: (error?: Error) => void,\n unwrapResult = true,\n ) =>\n (error: Error, response: PendingJsonRpcResponse): void => {\n if (error || response.error) {\n reject(error || response.error);\n } else {\n !unwrapResult || Array.isArray(response)\n ? resolve(response)\n : resolve(response.result);\n }\n };\n\n/**\n * Checks whether the given chain ID is valid, meaning if it is non-empty,\n * '0x'-prefixed string.\n *\n * @param chainId - The chain ID to validate.\n * @returns Whether the given chain ID is valid.\n */\nexport const isValidChainId = (chainId: unknown): chainId is string =>\n Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x');\n\n/**\n * Checks whether the given network version is valid, meaning if it is non-empty\n * integer string or the value 'loading'.\n *\n * @param networkVersion - The network version to validate.\n * @returns Whether the given network version is valid.\n */\nexport const isValidNetworkVersion = (\n networkVersion: unknown,\n): networkVersion is string | null =>\n typeof networkVersion === 'string' &&\n (POSITIVE_INTEGER_REGEX.test(networkVersion) || networkVersion === 'loading');\n\nexport const NOOP = () => undefined;\n"]} +\ No newline at end of file diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 17821d198cdd..0c1a853a08f1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -3116,11 +3116,11 @@ export default class MetamaskController extends EventEmitter { if (chains.length > 0 && !chains.includes(currentChainIdForOrigin)) { const networkClientId = this.networkController.findNetworkClientIdByChainId(chains[0]); + this.networkController.setActiveNetwork(networkClientId); this.selectedNetworkController.setNetworkClientIdForDomain( origin, networkClientId, ); - this.networkController.setActiveNetwork(networkClientId); } } }, @@ -3327,12 +3327,13 @@ export default class MetamaskController extends EventEmitter { const publicConfigStore = new ObservableStore(); const selectPublicState = async ({ isUnlocked }) => { - const { chainId, networkVersion } = await this.getProviderNetworkState(); + const { chainId, networkVersion, isConnected } = + await this.getProviderNetworkState(); return { isUnlocked, chainId, - networkVersion: networkVersion ?? 'loading', + networkVersion: isConnected ? networkVersion : 'loading', }; }; @@ -3406,9 +3407,13 @@ export default class MetamaskController extends EventEmitter { this.deprecatedNetworkVersions[networkClientId] = networkVersion; } + const metadata = + this.networkController.state.networksMetadata[networkClientId]; + return { chainId, networkVersion: networkVersion ?? 'loading', + isConnected: metadata?.status === NetworkStatus.Available, }; } diff --git a/package.json b/package.json index 276138431eed..b4449b398c64 100644 --- a/package.json +++ b/package.json @@ -251,7 +251,8 @@ "secp256k1@npm:^4.0.1": "4.0.4", "secp256k1@npm:4.0.2": "4.0.4", "secp256k1@npm:4.0.3": "4.0.4", - "undici@npm:5.28.4": "5.28.5" + "undici@npm:5.28.4": "5.28.5", + "@metamask/providers@npm:^18.3.1": "patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch" }, "dependencies": { "@babel/runtime": "patch:@babel/runtime@npm%3A7.25.9#~/.yarn/patches/@babel-runtime-npm-7.25.9-fe8c62510a.patch", @@ -332,7 +333,7 @@ "@metamask/ppom-validator": "0.36.0", "@metamask/preinstalled-example-snap": "^0.2.0", "@metamask/profile-sync-controller": "^3.1.1", - "@metamask/providers": "^18.2.0", + "@metamask/providers": "patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch", "@metamask/queued-request-controller": "^7.0.1", "@metamask/rate-limit-controller": "^6.0.0", "@metamask/remote-feature-flag-controller": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index a7ebdd5d5689..f4675b3e1dd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6087,16 +6087,33 @@ __metadata: languageName: node linkType: hard -"@metamask/providers@npm:^18.1.1, @metamask/providers@npm:^18.2.0": - version: 18.2.0 - resolution: "@metamask/providers@npm:18.2.0" +"@metamask/providers@npm:19.0.0": + version: 19.0.0 + resolution: "@metamask/providers@npm:19.0.0" dependencies: - "@metamask/json-rpc-engine": "npm:^10.0.1" - "@metamask/json-rpc-middleware-stream": "npm:^8.0.5" + "@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.1" + "@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/e45b2e90aa45db689bed582e85181d6964daff3c4b651ffc8503edcec2206a1b76677c0ae6fc0b29cef37a1b33775545e73bd1cf62802a4fc5e2841973cdafb6 + languageName: node + linkType: hard + +"@metamask/providers@patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch": + version: 19.0.0 + resolution: "@metamask/providers@patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch::version=19.0.0&hash=46053a" + dependencies: + "@metamask/json-rpc-engine": "npm:^10.0.2" "@metamask/safe-event-emitter": "npm:^3.1.1" - "@metamask/utils": "npm:^10.0.0" detect-browser: "npm:^5.2.0" extension-port-stream: "npm:^4.1.0" fast-deep-equal: "npm:^3.1.3" @@ -6104,7 +6121,7 @@ __metadata: readable-stream: "npm:^3.6.2" peerDependencies: webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 - checksum: 10/d808f14fc5cf6e240abec61c6b0cb93c0a1d883078ee3d005b9cd49c44e65767a4227d828b19c31500da8e94d85c3632d6957ab35da20b250f6f3a52746ed6b3 + checksum: 10/2999f2613502ea9b26e7693e6113d55e22cca783cc670a88b8fd9b4fc135da2db1687880fea968e6848596050eb52f3bc704438b265aa1eeebf449d7916a5d71 languageName: node linkType: hard @@ -26656,8 +26673,7 @@ __metadata: "@metamask/preferences-controller": "npm:^15.0.1" "@metamask/preinstalled-example-snap": "npm:^0.2.0" "@metamask/profile-sync-controller": "npm:^3.1.1" - "@metamask/providers": "npm:^18.2.0" - "@metamask/queued-request-controller": "npm:^7.0.1" + "@metamask/providers": "patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch" "@metamask/rate-limit-controller": "npm:^6.0.0" "@metamask/remote-feature-flag-controller": "npm:^1.1.0" "@metamask/rpc-errors": "npm:^7.0.0"