@metamask/connect-evm 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.1.0]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- `@metamask/connect-multichain` is no longer a peer dependency and will be installed transitively as a regular dependency ([#323](https://github.com/MetaMask/connect-monorepo/pull/323))
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- `EIP1193Provider.request()` now preserves JSON-RPC error `data` on provider-facing errors when `connect-multichain` surfaces a wallet error through `RPCInvokeMethodErr`. Dapps can read revert reasons, custom-error bytes, and other wallet-provided error metadata from `error.data` alongside the original wallet `error.code` and `error.message`. ([#312](https://github.com/MetaMask/connect-monorepo/pull/312))
|
|
19
|
+
|
|
10
20
|
## [2.0.0]
|
|
11
21
|
|
|
12
22
|
### Added
|
|
@@ -262,7 +272,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
262
272
|
|
|
263
273
|
- Initial release ([#58](https://github.com/MetaMask/connect-monorepo/pull/58))
|
|
264
274
|
|
|
265
|
-
[Unreleased]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-evm@2.
|
|
275
|
+
[Unreleased]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-evm@2.1.0...HEAD
|
|
276
|
+
[2.1.0]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-evm@2.0.0...@metamask/connect-evm@2.1.0
|
|
266
277
|
[2.0.0]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-evm@1.4.0...@metamask/connect-evm@2.0.0
|
|
267
278
|
[1.4.0]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-evm@1.3.1...@metamask/connect-evm@1.4.0
|
|
268
279
|
[1.3.1]: https://github.com/MetaMask/connect-monorepo/compare/@metamask/connect-evm@1.3.0...@metamask/connect-evm@1.3.1
|
|
@@ -413,10 +413,14 @@ var EIP1193Provider = class extends EventEmitter {
|
|
|
413
413
|
});
|
|
414
414
|
} catch (error) {
|
|
415
415
|
if (error instanceof RPCInvokeMethodErr && error.rpcCode !== void 0) {
|
|
416
|
+
const invokeError = error;
|
|
416
417
|
const rpcError = new Error(
|
|
417
418
|
(_d = error.rpcMessage) != null ? _d : error.reason
|
|
418
419
|
);
|
|
419
420
|
rpcError.code = error.rpcCode;
|
|
421
|
+
if (invokeError.rpcData !== void 0) {
|
|
422
|
+
rpcError.data = invokeError.rpcData;
|
|
423
|
+
}
|
|
420
424
|
throw rpcError;
|
|
421
425
|
}
|
|
422
426
|
throw error;
|
|
@@ -1435,10 +1439,10 @@ function createEVMClient(options) {
|
|
|
1435
1439
|
versions: {
|
|
1436
1440
|
// typeof guard needed: Metro (React Native) bundles TS source directly,
|
|
1437
1441
|
// bypassing the tsup build that substitutes __PACKAGE_VERSION__.
|
|
1438
|
-
"connect-evm": false ? "unknown" : "2.
|
|
1442
|
+
"connect-evm": false ? "unknown" : "2.1.0"
|
|
1439
1443
|
}
|
|
1440
1444
|
}));
|
|
1441
|
-
const multichainClientPeerRange = false ? "unknown" : "^1.
|
|
1445
|
+
const multichainClientPeerRange = false ? "unknown" : "^1.1.0";
|
|
1442
1446
|
if (multichainClientPeerRange !== "unknown" && multichainClientPeerRange !== "" && !satisfies(core.version, multichainClientPeerRange)) {
|
|
1443
1447
|
console.warn(
|
|
1444
1448
|
`@metamask/connect-evm expected @metamask/connect-multichain version ${multichainClientPeerRange}, but got ${core.version}. This may lead to unexpected behavior.`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/infura.ts","../../../src/connect.ts","../../../src/constants.ts","../../../src/logger.ts","../../../src/eip6963.ts","../../../src/provider.ts","../../../src/utils/caip.ts","../../../src/utils/type-guards.ts"],"sourcesContent":["import { getInfuraRpcUrls as getInfuraRpcUrlsMultichain } from '@metamask/connect-multichain';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport {\n hexToNumber,\n KnownCaipNamespace,\n numberToHex,\n parseCaipChainId,\n} from '@metamask/utils';\n\n/**\n * Generates Infura RPC URLs for common EVM networks keyed by hex chain ID.\n *\n * @param options - The options for generating Infura RPC URLs\n * @param options.infuraApiKey - The Infura API key\n * @param options.chainIds - Optional hex chain IDs to filter the output\n * @returns A map of hex chain IDs to Infura RPC URLs\n */\nexport const getInfuraRpcUrls = ({\n infuraApiKey,\n chainIds,\n}: {\n infuraApiKey: string;\n chainIds?: Hex[];\n}): Record<Hex, string> => {\n const caipChainIds = chainIds?.map(\n (chainId) => `eip155:${hexToNumber(chainId)}` as CaipChainId,\n );\n\n const caipMap = getInfuraRpcUrlsMultichain({\n infuraApiKey,\n caipChainIds,\n });\n\n return Object.entries(caipMap).reduce<Record<Hex, string>>(\n (acc, [key, url]) => {\n const { namespace, reference } = parseCaipChainId(key as CaipChainId);\n if (namespace !== KnownCaipNamespace.Eip155) {\n return acc;\n }\n const chainId = numberToHex(parseInt(reference, 10));\n acc[chainId] = url;\n return acc;\n },\n {},\n );\n};\n","/* eslint-disable no-restricted-syntax -- Private class properties use established patterns */\n/* eslint-disable @typescript-eslint/naming-convention -- __PACKAGE_VERSION__ and __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__ are esbuild define conventions */\nimport { analytics } from '@metamask/analytics';\nimport type {\n MultichainCore,\n MultichainOptions,\n Scope,\n SessionData,\n} from '@metamask/connect-multichain';\nimport {\n createMultichainClient,\n getWalletActionAnalyticsProperties,\n isRejectionError,\n TransportType,\n} from '@metamask/connect-multichain';\nimport { hexToNumber } from '@metamask/utils';\nimport { satisfies } from 'semver';\n\nimport { CONNECT_EVM_SESSION_PROPERTIES, IGNORED_METHODS } from './constants';\nimport { EIP6963ProviderAnnouncer } from './eip6963';\nimport { enableDebug, logger } from './logger';\nimport { EIP1193Provider } from './provider';\nimport type {\n AddEthereumChainParameter,\n Address,\n CaipAccountId,\n EventHandlers,\n Hex,\n MetamaskConnectEVMOptions,\n ProviderRequest,\n ProviderRequestInterceptor,\n} from './types';\nimport {\n getEthAccounts,\n getPermittedEthChainIds,\n parseScopeString,\n} from './utils/caip';\nimport {\n isAccountsRequest,\n isAddChainRequest,\n isChainIdRequest,\n isConnectRequest,\n isSwitchChainRequest,\n validSupportedChainsUrls,\n} from './utils/type-guards';\n\n// Values substituted by tsup at build time\ndeclare const __PACKAGE_VERSION__: string | undefined;\ndeclare const __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__: string | undefined;\n\nconst DEFAULT_CHAIN_ID = '0x1';\nconst CHAIN_STORE_KEY = 'cache_eth_chainId';\n\n/**\n * Checks whether dapp-side analytics are enabled for the multichain core.\n *\n * @param options - Current multichain options.\n * @returns Whether analytics events should be collected and sent.\n */\nfunction isAnalyticsEnabled(options: MultichainOptions | undefined): boolean {\n return options?.analytics?.enabled !== false;\n}\n\n/** The options for the connect method */\ntype ConnectOptions = {\n /** The account to connect to */\n account?: string | undefined;\n /** Whether to force a request regardless of an existing session */\n forceRequest?: boolean;\n /** All available chain IDs in the dapp in hex format */\n chainIds?: Hex[];\n};\n\ntype RequestedPermission = {\n id: string;\n parentCapability: 'eth_accounts' | 'endowment:permitted-chains';\n invoker: string;\n caveats: {\n type: 'restrictReturnedAccounts' | 'restrictNetworkSwitching';\n value: Address[] | Hex[];\n }[];\n date: number;\n};\n\nconst createPermissionId = (): string => {\n if (globalThis.crypto?.randomUUID) {\n return globalThis.crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst getDappInvoker = (options: MultichainOptions): string => {\n const { name, nativeScheme, url: dappUrl } = options.dapp;\n const fallbackInvoker = nativeScheme ?? name;\n\n if (!dappUrl) {\n return fallbackInvoker;\n }\n\n try {\n const { origin } = new URL(dappUrl);\n return origin === 'null' ? fallbackInvoker : origin;\n } catch {\n return fallbackInvoker;\n }\n};\n\nconst getRequestedPermissions = ({\n accounts,\n chainIds,\n invoker,\n}: {\n accounts: Address[];\n chainIds: Hex[];\n invoker: string;\n}): RequestedPermission[] => {\n const id = createPermissionId();\n const date = Date.now();\n\n return [\n {\n id,\n parentCapability: 'eth_accounts',\n invoker,\n caveats: [\n {\n type: 'restrictReturnedAccounts',\n value: accounts,\n },\n ],\n date,\n },\n {\n id,\n parentCapability: 'endowment:permitted-chains',\n invoker,\n caveats: [\n {\n type: 'restrictNetworkSwitching',\n value: chainIds,\n },\n ],\n date,\n },\n ];\n};\n\nexport type ConnectEvmStatus = 'disconnected' | 'connected' | 'connecting';\n\n/**\n * The MetamaskConnectEVM class provides an EIP-1193 compatible interface for connecting\n * to MetaMask and interacting with Ethereum Virtual Machine (EVM) networks.\n *\n * This class serves as a modern replacement for MetaMask SDK V1, offering enhanced\n * functionality and cross-platform compatibility. It wraps the Multichain SDK to provide\n * a simplified, EIP-1193 compliant API for dapp developers.\n *\n * Key features:\n * - EIP-1193 provider interface for seamless integration with existing dapp code\n * - Automatic session recovery when reloading or opening in new tabs\n * - Chain switching with automatic chain addition if not configured\n * - Event-driven architecture with support for connect, disconnect, accountsChanged, and chainChanged events\n * - Cross-platform support for browser extensions and mobile applications\n * - Built-in handling of common Ethereum methods (eth_accounts, wallet_switchEthereumChain, etc.)\n *\n * @example\n * ```typescript\n * const client = await createEVMClient({\n * dapp: { name: 'My DApp', url: 'https://mydapp.com' }\n * });\n *\n * const { accounts, chainId } = await client.connect({ chainIds: [1, 137] }); // Connect to Ethereum Mainnet, and Polygon\n *\n * const provider = client.getProvider();\n * const signedMessage = await provider.request({ method: 'personal_sign', params: ['0x0', accounts[0]] });\n * ```\n */\nexport class MetamaskConnectEVM {\n /** The core instance of the Multichain SDK */\n readonly #core: MultichainCore;\n\n /** An instance of the EIP-1193 provider interface */\n readonly #provider: EIP1193Provider;\n\n /** Handles EIP-6963 discovery announcements for the provider */\n readonly #eip6963Announcer: EIP6963ProviderAnnouncer;\n\n /** The session scopes currently permitted */\n #sessionScopes: SessionData['sessionScopes'] = {};\n\n /** Optional event handlers for the EIP-1193 provider events. */\n readonly #eventHandlers?: Partial<EventHandlers> | undefined;\n\n /** The handler for the wallet_sessionChanged event */\n readonly #sessionChangedHandler: (session?: SessionData) => void;\n\n /** The handler for the display_uri event */\n readonly #displayUriHandler: (uri: string) => void;\n\n /** The clean-up function for the notification handler */\n #removeNotificationHandler?: () => void;\n\n /** The current connection status */\n #status: ConnectEvmStatus = 'disconnected';\n\n /**\n * The preferred chain ID to use for the active connect() call.\n * Set to the first explicit chainId passed by the caller, cleared once the\n * connect event resolves. Takes priority over the cache in #getSelectedChainId\n * so that an explicit chainIds request always wins over a prior cached value.\n */\n #pendingPreferredChainId: Hex | undefined;\n\n /**\n * Creates a new MetamaskConnectEVM instance.\n * Use the static `create()` method instead to ensure proper async initialization.\n *\n * @param options - The options for the MetamaskConnectEVM instance\n * @param options.core - The core instance of the Multichain SDK\n * @param options.eventHandlers - Optional event handlers for EIP-1193 provider events\n */\n private constructor({ core, eventHandlers }: MetamaskConnectEVMOptions) {\n this.#core = core;\n\n this.#provider = new EIP1193Provider(\n core,\n this.#requestInterceptor.bind(this),\n );\n this.#eip6963Announcer = new EIP6963ProviderAnnouncer(this.#provider);\n\n this.#eventHandlers = eventHandlers;\n\n /**\n * Handles the wallet_sessionChanged event.\n * Updates the internal connection state with the new session data.\n *\n * @param session - The session data\n */\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#sessionChangedHandler = this.#onSessionChanged.bind(this);\n this.#core.on('wallet_sessionChanged', this.#sessionChangedHandler);\n\n /**\n * Handles the display_uri event.\n * Forwards the QR code URI to the provider for custom UI implementations.\n */\n this.#displayUriHandler = this.#onDisplayUri.bind(this);\n this.#core.on('display_uri', this.#displayUriHandler);\n\n logger('Connect/EVM constructor completed');\n }\n\n /**\n * Creates a fully initialized MetamaskConnectEVM instance.\n * This is the recommended way to instantiate the class, as it ensures\n * all async initialization (like session recovery) completes before\n * the instance is returned.\n *\n * @param options - The options for the MetamaskConnectEVM instance\n * @param options.core - The core instance of the Multichain SDK\n * @param options.eventHandlers - Optional event handlers for EIP-1193 provider events\n * @returns A promise that resolves with a fully initialized MetamaskConnectEVM instance\n */\n static async create(\n options: MetamaskConnectEVMOptions,\n ): Promise<MetamaskConnectEVM> {\n const instance = new MetamaskConnectEVM(options);\n let session;\n try {\n session = await instance.#core.provider.getSession();\n } catch {\n session = { sessionScopes: {} };\n }\n await instance.#onSessionChanged(session);\n return instance;\n }\n\n /**\n * Gets the core options for analytics checks.\n *\n * @returns The multichain options from the core instance\n */\n #getCoreOptions(): MultichainOptions {\n return (this.#core as any).options as MultichainOptions;\n }\n\n /**\n * Creates invoke options for analytics tracking.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n * @returns Invoke options object for analytics\n */\n #createInvokeOptions(\n method: string,\n scope: Scope,\n params: unknown[],\n ): {\n scope: Scope;\n request: { method: string; params: unknown[] };\n } {\n return {\n scope,\n request: { method, params },\n };\n }\n\n /**\n * Tracks a wallet action requested event.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n */\n async #trackWalletActionRequested(\n method: string,\n scope: Scope,\n params: unknown[],\n ): Promise<void> {\n const coreOptions = this.#getCoreOptions();\n if (!isAnalyticsEnabled(coreOptions)) {\n return;\n }\n\n try {\n const invokeOptions = this.#createInvokeOptions(method, scope, params);\n const props = await getWalletActionAnalyticsProperties(\n coreOptions,\n this.#core.storage,\n invokeOptions,\n this.#core.transportType,\n );\n analytics.track('mmconnect_wallet_action_requested', props);\n } catch (error) {\n logger('Error tracking mmconnect_wallet_action_requested event', error);\n }\n }\n\n /**\n * Tracks a wallet action succeeded event.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n */\n async #trackWalletActionSucceeded(\n method: string,\n scope: Scope,\n params: unknown[],\n ): Promise<void> {\n const coreOptions = this.#getCoreOptions();\n if (!isAnalyticsEnabled(coreOptions)) {\n return;\n }\n\n try {\n const invokeOptions = this.#createInvokeOptions(method, scope, params);\n const props = await getWalletActionAnalyticsProperties(\n coreOptions,\n this.#core.storage,\n invokeOptions,\n this.#core.transportType,\n );\n analytics.track('mmconnect_wallet_action_succeeded', props);\n } catch (error) {\n logger('Error tracking mmconnect_wallet_action_succeeded event', error);\n }\n }\n\n /**\n * Tracks a wallet action failed or rejected event based on the error.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n * @param error - The error that occurred\n */\n async #trackWalletActionFailed(\n method: string,\n scope: Scope,\n params: unknown[],\n error: unknown,\n ): Promise<void> {\n const coreOptions = this.#getCoreOptions();\n if (!isAnalyticsEnabled(coreOptions)) {\n return;\n }\n\n try {\n const invokeOptions = this.#createInvokeOptions(method, scope, params);\n const props = await getWalletActionAnalyticsProperties(\n coreOptions,\n this.#core.storage,\n invokeOptions,\n this.#core.transportType,\n );\n const isRejection = isRejectionError(error);\n if (isRejection) {\n analytics.track('mmconnect_wallet_action_rejected', props);\n } else {\n analytics.track('mmconnect_wallet_action_failed', props);\n }\n } catch {\n logger('Error tracking wallet action rejected or failed event', error);\n }\n }\n\n /**\n * Gets the currently selected chainId. Priority order:\n * - Explicit caller preference from an active connect() call, if permitted.\n * - Cached chainId from storage, if permitted.\n * - First permitted chain as a fallback.\n *\n * @param permittedChainIds - Array of permitted chain IDs in hex format\n * @returns The selected chainId (hex string)\n */\n async #getSelectedChainId(permittedChainIds: Hex[]): Promise<Hex> {\n // Honour an explicit caller preference set during an active connect() call\n if (\n this.#pendingPreferredChainId &&\n permittedChainIds.includes(this.#pendingPreferredChainId)\n ) {\n return this.#pendingPreferredChainId;\n }\n\n try {\n const cachedChainId =\n await this.#core.storage.adapter.get(CHAIN_STORE_KEY);\n if (cachedChainId) {\n const chainId: Hex = JSON.parse(cachedChainId);\n\n // Validate that the cached chainId is in the permitted chains list\n if (permittedChainIds.includes(chainId)) {\n return chainId;\n }\n }\n } catch (error) {\n logger('Error retrieving cached chainId', error);\n }\n\n // Fallback to the first permitted chain if cache retrieval failed or returned an invalid chain\n return permittedChainIds[0];\n }\n\n /**\n * Connects to the wallet with the specified chain ID and optional account.\n *\n * @param options - The connection options\n * @param [options.account] - Optional param to specify an account to connect to\n * @param [options.forceRequest] - Optional param to force a connection request regardless of whether there is a pre-existing session\n * @param [options.chainIds] - Array of chain IDs to request permission for (defaults to ethereum mainnet). The first entry is used as the active chain returned by the call. Ethereum mainnet is always included in the permission request as a bootstrap fallback.\n * @returns A promise that resolves with the connected accounts and chain ID\n */\n async connect({\n account,\n forceRequest,\n chainIds = [DEFAULT_CHAIN_ID],\n }: ConnectOptions = {}): Promise<{ accounts: Address[]; chainId: Hex }> {\n logger('request: connect', { account });\n\n if (!chainIds || chainIds.length === 0) {\n throw new Error('chainIds must be an array of at least one chain ID');\n }\n\n // The first explicitly-requested chain is preferred for chain selection.\n // DEFAULT_CHAIN_ID is still included in the permission request as a bootstrap\n // fallback, but it must not win over an explicit caller request.\n this.#pendingPreferredChainId = chainIds[0];\n\n const caipChainIds = Array.from(\n new Set(chainIds.concat(DEFAULT_CHAIN_ID) ?? [DEFAULT_CHAIN_ID]),\n ).map((id) => `eip155:${hexToNumber(id)}`);\n\n const caipAccountIds = account\n ? caipChainIds.map((caipChainId) => `${caipChainId}:${account}`)\n : [];\n\n this.#status = 'connecting';\n\n try {\n // Wait for the wallet_sessionChanged event to fire and set the provider properties\n const result = new Promise<{ accounts: Address[]; chainId: Hex }>(\n (resolve) => {\n this.#provider.once('connect', ({ chainId, accounts }) => {\n logger('fulfilled-request: connect', {\n chainId,\n accounts,\n });\n resolve({\n accounts,\n chainId,\n });\n });\n },\n );\n\n await this.#core.connect(\n caipChainIds as Scope[],\n caipAccountIds as CaipAccountId[],\n CONNECT_EVM_SESSION_PROPERTIES,\n forceRequest,\n );\n\n // Await here so the finally block always runs after #onSessionChanged\n // has consumed #pendingPreferredChainId, not before.\n return await result;\n } catch (error) {\n this.#status = 'disconnected';\n logger('Error connecting to wallet', error);\n throw error;\n } finally {\n this.#pendingPreferredChainId = undefined;\n }\n }\n\n /**\n * Connects to the wallet and signs a message using personal_sign.\n *\n * @param options - The connection options\n * @param options.message - The message to sign after connecting\n * @param [options.chainIds] - Optional hex chain IDs to connect to (defaults to ethereum mainnet if not provided)\n * @returns A promise that resolves with the connected accounts, chainId, and signature\n * @throws Error if the selected account is not available after timeout\n */\n async connectAndSign({\n message,\n chainIds,\n }: {\n message: string;\n chainIds?: Hex[];\n }): Promise<{ accounts: Address[]; chainId: Hex; signature: string }> {\n const { accounts, chainId } = await this.connect({\n chainIds: chainIds ?? [DEFAULT_CHAIN_ID],\n });\n\n const signature = (await this.#provider.request({\n method: 'personal_sign',\n params: [accounts[0], message],\n })) as string;\n\n this.#eventHandlers?.connectAndSign?.({\n accounts,\n chainId,\n signature,\n });\n\n return { accounts, chainId, signature };\n }\n\n /**\n * Connects to the wallet and invokes a method with specified parameters.\n *\n * @param options - The options for connecting and invoking the method\n * @param options.method - The method name to invoke\n * @param options.params - The parameters to pass to the method, or a function that receives the account and returns params\n * @param [options.chainIds] - Optional hex chain IDs to connect to (defaults to ethereum mainnet if not provided)\n * @param [options.account] - Optional specific account to connect to\n * @param [options.forceRequest] - Whether to force a request regardless of an existing session\n * @returns A promise that resolves with the connected accounts, chainId, and the result of the method invocation\n * @throws Error if the selected account is not available after timeout (for methods that require an account)\n */\n async connectWith({\n method,\n params,\n chainIds,\n account,\n forceRequest,\n }: {\n method: string;\n params: unknown[] | ((account: Address) => unknown[]);\n chainIds?: Hex[];\n account?: string | undefined;\n forceRequest?: boolean;\n }): Promise<{ accounts: Address[]; chainId: Hex; result: unknown }> {\n const { accounts: connectedAccounts, chainId: connectedChainId } =\n await this.connect({\n chainIds: chainIds ?? [DEFAULT_CHAIN_ID],\n account,\n forceRequest,\n });\n\n const resolvedParams =\n typeof params === 'function' ? params(connectedAccounts[0]) : params;\n\n const result = await this.#provider.request({\n method,\n params: resolvedParams,\n });\n\n this.#eventHandlers?.connectWith?.({\n accounts: connectedAccounts,\n chainId: connectedChainId,\n result,\n });\n\n return { accounts: connectedAccounts, chainId: connectedChainId, result };\n }\n\n /**\n * Disconnects from the wallet by revoking the session and cleaning up event listeners.\n *\n * @returns A promise that resolves when disconnection is complete\n */\n async disconnect(): Promise<void> {\n logger('request: disconnect');\n\n const sessionScopes = this.#sessionScopes;\n const eip155Scopes = Object.keys(sessionScopes).filter((scope) => {\n const { namespace } = parseScopeString(scope as Scope);\n return namespace === 'eip155';\n });\n\n await this.#core.disconnect(eip155Scopes as Scope[]);\n this.#onDisconnect();\n this.#clearConnectionState();\n\n // Note: We intentionally do NOT remove the display_uri and wallet_sessionChanged\n // listeners here. These are instance-scoped listeners that should remain active\n // for the lifetime of the SDK instance, allowing reconnection to work properly.\n // Session-scoped listeners (like the notification handler below) are removed.\n\n this.#removeNotificationHandler?.();\n this.#removeNotificationHandler = undefined;\n\n logger('fulfilled-request: disconnect');\n }\n\n /**\n * Switches the Ethereum chain. Will track state internally whenever possible.\n *\n * @param options - The options for the switch chain request\n * @param options.chainId - The chain ID to switch to\n * @param [options.chainConfiguration] - The chain configuration to use in case the chain is not present by the wallet\n * @returns A promise that resolves when the chain has been switched\n */\n async switchChain({\n chainId,\n chainConfiguration,\n }: {\n chainId: Hex;\n chainConfiguration?: AddEthereumChainParameter;\n }): Promise<void> {\n const method = 'wallet_switchEthereumChain';\n const scope: Scope = `eip155:${hexToNumber(chainId)}`;\n const params = [{ chainId }];\n\n // TODO (wenfix): better way to return here other than resolving.\n if (this.selectedChainId === chainId) {\n return Promise.resolve();\n }\n\n const permittedChainIds = getPermittedEthChainIds(this.#sessionScopes);\n\n if (\n permittedChainIds.includes(chainId) &&\n this.#core.transportType === TransportType.MWP\n ) {\n await this.#cacheChainId(chainId);\n this.#onChainChanged(chainId);\n return Promise.resolve();\n }\n\n await this.#trackWalletActionRequested(method, scope, params);\n\n try {\n const result = await this.#request({\n scope,\n method: 'wallet_switchEthereumChain',\n params,\n });\n\n await this.#trackWalletActionSucceeded(method, scope, params);\n if (result === null) {\n // result is successful we eagerly call onChainChanged to update the provider's selected chain ID.\n await this.#cacheChainId(chainId);\n this.#onChainChanged(chainId);\n }\n return Promise.resolve();\n } catch (error) {\n await this.#trackWalletActionFailed(method, scope, params, error);\n const isChainMissingInWallet = (error as Error).message.includes(\n 'Unrecognized chain ID',\n );\n if (isChainMissingInWallet && chainConfiguration) {\n return this.#addEthereumChain(chainConfiguration);\n }\n throw error;\n }\n }\n\n /**\n * Handles several EIP-1193 requests that require special handling\n * due the nature of the Multichain SDK.\n *\n * @param request - The request object containing the method and params\n * @returns The result of the request or undefined if the request is ignored\n */\n async #requestInterceptor(\n request: ProviderRequest,\n ): ReturnType<ProviderRequestInterceptor> {\n logger(`Intercepting request for method: ${request.method}`);\n\n if (IGNORED_METHODS.includes(request.method)) {\n // TODO: replace with correct method unsupported provider error\n return Promise.reject(\n new Error(\n `Method: ${request.method} is not supported by Metamask Connect/EVM`,\n ),\n );\n }\n\n if (request.method === 'wallet_revokePermissions') {\n return this.disconnect();\n }\n\n if (isConnectRequest(request)) {\n // When calling wallet_requestPermissions, we need to force a new session request to prompt\n // the user for accounts, because internally the Multichain SDK will check if\n // the user is already connected and skip the request if so, unless we\n // explicitly request a specific account. This is needed to workaround\n // wallet_requestPermissions not requesting specific accounts.\n const shouldForceConnectionRequest =\n request.method === 'wallet_requestPermissions';\n\n const { method, params } = request;\n const permitted = getPermittedEthChainIds(this.#sessionScopes);\n if (permitted.length === 0) {\n permitted.push(DEFAULT_CHAIN_ID);\n }\n\n const selected = this.#provider.selectedChainId;\n const preferred =\n selected && permitted.includes(selected) ? selected : permitted[0];\n\n const chainIds = [\n preferred,\n ...permitted.filter((id) => id !== preferred),\n ];\n\n const scope: Scope = `eip155:${hexToNumber(preferred)}`;\n\n await this.#trackWalletActionRequested(method, scope, params);\n\n try {\n const result = await this.connect({\n chainIds,\n forceRequest: shouldForceConnectionRequest,\n });\n await this.#trackWalletActionSucceeded(method, scope, params);\n if (request.method === 'eth_requestAccounts') {\n return result.accounts;\n }\n if (request.method === 'wallet_requestPermissions') {\n return getRequestedPermissions({\n accounts: result.accounts,\n chainIds: getPermittedEthChainIds(this.#sessionScopes),\n invoker: getDappInvoker(this.#getCoreOptions()),\n });\n }\n return result;\n } catch (error) {\n await this.#trackWalletActionFailed(method, scope, params, error);\n throw error;\n }\n }\n\n if (isSwitchChainRequest(request)) {\n await this.switchChain({\n chainId: request.params[0].chainId as Hex,\n });\n return null;\n }\n\n if (isAddChainRequest(request)) {\n await this.#addEthereumChain(request.params[0]);\n return null;\n }\n\n if (isAccountsRequest(request)) {\n if (request.method === 'eth_coinbase') {\n return this.#provider.selectedAccount ?? null;\n }\n return this.#provider.accounts;\n }\n\n if (isChainIdRequest(request)) {\n return this.#provider.selectedChainId;\n }\n\n logger('Request not intercepted, forwarding to default handler', request);\n return Promise.resolve();\n }\n\n /**\n * Clears the internal connection state: accounts and chainId\n */\n #clearConnectionState(): void {\n this.#provider.accounts = [];\n this.#provider.selectedChainId = undefined;\n }\n\n /**\n * Adds an Ethereum chain using the latest chain configuration received from\n * a switchEthereumChain request\n *\n * @param chainConfiguration - The chain configuration to use in case the chain is not present by the wallet\n * @returns Nothing\n */\n async #addEthereumChain(\n chainConfiguration?: AddEthereumChainParameter,\n ): Promise<void> {\n logger('addEthereumChain called', { chainConfiguration });\n const method = 'wallet_addEthereumChain';\n\n if (!chainConfiguration) {\n throw new Error('No chain configuration found.');\n }\n\n // Get chain ID from config or use current chain\n const chainId =\n (chainConfiguration.chainId as Hex) ||\n this.#provider.selectedChainId ||\n '0x1';\n const decimalChainId = hexToNumber(chainId);\n const scope: Scope = `eip155:${decimalChainId}`;\n const params = [chainConfiguration];\n\n await this.#trackWalletActionRequested(method, scope, params);\n\n try {\n const result = await this.#request({\n scope,\n method: 'wallet_addEthereumChain',\n params,\n });\n\n if (result === null) {\n // if result is successful we eagerly call onChainChanged to update the provider's selected chain ID.\n await this.#cacheChainId(chainId);\n this.#onChainChanged(chainId);\n }\n await this.#trackWalletActionSucceeded(method, scope, params);\n } catch (error) {\n await this.#trackWalletActionFailed(method, scope, params, error);\n throw error;\n }\n }\n\n /**\n * Submits an EIP-1193 passthrough request to the wallet via the multichain\n * client. The multichain `invokeMethod` dispatcher recognizes the method as a\n * passthrough and forwards the raw `{ method, params }` payload to the\n * underlying transport's `sendEip1193Message`, bypassing the\n * `wallet_invokeMethod` envelope. The router unwraps the JSON-RPC envelope\n * before returning, so the resolved value is the raw `result` (e.g. `null` for\n * a successful `wallet_switchEthereumChain`, an accounts array for\n * `eth_accounts`).\n *\n * @param request - The request object containing the scope, method, and params\n * @param request.scope - CAIP scope used for analytics/routing context\n * @param request.method - The method to request\n * @param request.params - The parameters to pass to the method\n * @returns The wallet's raw RPC result (envelope already unwrapped).\n */\n async #request(request: {\n scope: Scope;\n method: string;\n params: unknown[];\n }): Promise<unknown> {\n logger('direct request to metamask-provider called', request);\n const result = this.#core.invokeMethod({\n scope: request.scope,\n request: { method: request.method, params: request.params },\n });\n if (\n request.method === 'wallet_addEthereumChain' ||\n request.method === 'wallet_switchEthereumChain'\n ) {\n this.#core.openSimpleDeeplinkIfNeeded();\n }\n return result;\n }\n\n /**\n * Caches the chainId to storage for persistence across page refreshes.\n *\n * @param chainId - The hex chain ID\n */\n async #cacheChainId(chainId: Hex): Promise<void> {\n try {\n await this.#core.storage.adapter.set(\n CHAIN_STORE_KEY,\n JSON.stringify(chainId),\n );\n } catch (error) {\n logger('Error caching chainId', error);\n }\n }\n\n async #onSessionChanged(session?: SessionData): Promise<void> {\n logger('event: wallet_sessionChanged', session);\n this.#sessionScopes = session?.sessionScopes ?? {};\n const hexPermittedChainIds = getPermittedEthChainIds(this.#sessionScopes);\n if (hexPermittedChainIds.length === 0) {\n this.#onDisconnect();\n } else {\n let initialAccounts: Address[] = [];\n if (this.#core.status === 'connected') {\n // `eth_accounts` is registered as an EIP-1193 passthrough on the multichain\n // client, so this routes through `transport.sendEip1193Message` rather than\n // the `wallet_invokeMethod` envelope. The router unwraps the JSON-RPC\n // envelope for passthrough methods and returns just the raw `result`\n // value. Scope is informational here; the first permitted chain is used\n // for analytics context.\n initialAccounts = (await this.#core.invokeMethod({\n scope: `eip155:${hexToNumber(hexPermittedChainIds[0])}` as Scope,\n request: { method: 'eth_accounts', params: [] },\n })) as Address[];\n } else {\n initialAccounts = getEthAccounts(this.#sessionScopes);\n }\n\n const chainId = await this.#getSelectedChainId(hexPermittedChainIds);\n\n this.#onConnect({\n chainId,\n accounts: initialAccounts,\n });\n }\n }\n\n /**\n * Handles chain change events and updates the provider's selected chain ID.\n *\n * @param chainId - The new hex chain ID\n */\n #onChainChanged(chainId: Hex): void {\n if (chainId === this.#provider.selectedChainId) {\n return;\n }\n logger('handler: chainChanged', { chainId });\n this.#provider.selectedChainId = chainId;\n this.#provider.emit('chainChanged', chainId);\n this.#eventHandlers?.chainChanged?.(chainId);\n }\n\n /**\n * Handles accounts change events and updates the provider's accounts list.\n *\n * @param accounts - The new list of permitted accounts\n */\n #onAccountsChanged(accounts: Address[]): void {\n const accountsUnchanged =\n accounts.length === this.#provider.accounts.length &&\n accounts.every((acct, idx) => acct === this.#provider.accounts[idx]);\n if (accountsUnchanged) {\n return;\n }\n logger('handler: accountsChanged', accounts);\n this.#provider.accounts = accounts;\n this.#provider.emit('accountsChanged', accounts);\n this.#eventHandlers?.accountsChanged?.(accounts);\n }\n\n /**\n * Handles connection events and emits the connect event to listeners.\n *\n * @param options - The connection options\n * @param options.chainId - The hex chain ID of the connection\n * @param options.accounts - The accounts of the connection\n */\n #onConnect({\n chainId,\n accounts,\n }: {\n chainId: Hex;\n accounts: Address[];\n }): void {\n logger('handler: connect', { chainId, accounts });\n const data = {\n chainId,\n accounts,\n };\n\n if (this.#status === 'connected') {\n this.#onChainChanged(chainId);\n this.#onAccountsChanged(accounts);\n return;\n }\n\n this.#provider.selectedChainId = chainId;\n this.#provider.accounts = accounts;\n\n this.#status = 'connected';\n this.#provider.emit('connect', data);\n this.#eventHandlers?.connect?.(data);\n\n this.#provider.emit('chainChanged', chainId);\n this.#eventHandlers?.chainChanged?.(chainId);\n\n this.#provider.emit('accountsChanged', accounts);\n this.#eventHandlers?.accountsChanged?.(accounts);\n\n this.#removeNotificationHandler?.();\n\n const onAccountsChanged = (accs: string[]): void => {\n logger('core-event: accountsChanged', accs);\n this.#onAccountsChanged(accs as Address[]);\n };\n\n const onChainChanged = (chainChanged: { chainId: string }): void => {\n logger('core-event: chainChanged', chainChanged.chainId);\n this.#cacheChainId(chainChanged.chainId as Hex).catch((error) => {\n logger('Error caching chainId in notification handler', error);\n });\n this.#onChainChanged(chainChanged.chainId as Hex);\n };\n\n this.#core.on('metamask_accountsChanged', onAccountsChanged);\n this.#core.on('metamask_chainChanged', onChainChanged);\n\n this.#removeNotificationHandler = (): void => {\n this.#core.off('metamask_accountsChanged', onAccountsChanged);\n this.#core.off('metamask_chainChanged', onChainChanged);\n };\n }\n\n /**\n * Handles disconnection events and emits the disconnect event to listeners.\n * Also clears accounts by triggering an accountsChanged event with an empty array.\n */\n #onDisconnect(): void {\n if (this.#status === 'disconnected') {\n return;\n }\n this.#status = 'disconnected';\n\n logger('handler: disconnect');\n this.#provider.emit('disconnect');\n this.#eventHandlers?.disconnect?.();\n\n this.#onAccountsChanged([]);\n }\n\n /**\n * Handles display_uri events and emits them to the provider.\n * This allows consumers to display their own custom QR code UI.\n *\n * @param uri - The deeplink URI to be displayed as a QR code\n */\n #onDisplayUri(uri: string): void {\n if (this.#status !== 'connecting') {\n return;\n }\n\n logger('handler: display_uri', uri);\n this.#provider.emit('display_uri', uri);\n this.#eventHandlers?.displayUri?.(uri);\n }\n\n /**\n * Gets the EIP-1193 provider instance\n *\n * @returns The EIP-1193 provider instance\n */\n getProvider(): EIP1193Provider {\n return this.#provider;\n }\n\n /**\n * Announces the EIP-1193 provider through EIP-6963 wallet discovery.\n *\n * This is a no-op when a native MetaMask EIP-6963 provider has already\n * announced, or when running outside a browser environment. The first call\n * may take up to 300 ms while native providers are requested.\n */\n async announceProvider(): Promise<void> {\n await this.#eip6963Announcer.announce();\n }\n\n /**\n * Gets the currently selected chain ID on the wallet\n *\n * @returns The currently selected chain ID or undefined if no chain is selected\n */\n getChainId(): Hex | undefined {\n return this.selectedChainId;\n }\n\n /**\n * Gets the currently selected account on the wallet\n *\n * @returns The currently selected account or undefined if no account is selected\n */\n getAccount(): Address | undefined {\n return this.#provider.selectedAccount;\n }\n\n // Convenience getters for the EIP-1193 provider\n /**\n * Gets the currently permitted accounts\n *\n * @returns The currently permitted accounts\n */\n get accounts(): Address[] {\n return this.#provider.accounts;\n }\n\n /**\n * Gets the currently selected account on the wallet\n *\n * @returns The currently selected account or undefined if no account is selected\n */\n get selectedAccount(): Address | undefined {\n return this.#provider.selectedAccount;\n }\n\n /**\n * Gets the currently selected chain ID on the wallet\n *\n * @returns The currently selected chain ID or undefined if no chain is selected\n */\n get selectedChainId(): Hex | undefined {\n return this.#provider.selectedChainId;\n }\n\n /**\n * Gets the current connection status\n *\n * @returns The current connection status\n */\n get status(): ConnectEvmStatus {\n return this.#status;\n }\n}\n\n/**\n * Creates a new Metamask Connect/EVM instance\n *\n * @param options - The options for the Metamask Connect/EVM layer\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - API configuration including read-only RPC map\n * @param options.api.supportedNetworks - A map of hex chain IDs to RPC URLs for read-only requests\n * @param [options.analytics.enabled] - Whether to enable dapp-side analytics (defaults to true)\n * @param [options.analytics.integrationType] - Integration type for analytics\n * @param [options.ui] - UI configuration options\n * @param [options.ui.headless] - Whether to run without UI\n * @param [options.ui.preferExtension] - Whether to prefer browser extension\n * @param [options.ui.showInstallModal] - Whether to render installation modal for desktop extension\n * @param [options.mobile] - Mobile configuration options\n * @param [options.mobile.preferredOpenLink] - Custom handler for opening deeplinks (useful for React Native, etc.)\n * @param [options.mobile.useDeeplink] - Whether to use native deeplinks instead of universal links\n * @param [options.transport] - Transport configuration (e.g., extensionId)\n * @param [options.transport.extensionId] - Extension ID for browser extension transport\n * @param [options.eventHandlers] - Event handlers for the Metamask Connect/EVM layer\n * @param [options.debug] - Enable debug logging\n * @param [options.skipAutoAnnounce] - Skip automatic EIP-6963 provider announcement\n * @returns The Metamask-Connect EVM client instance\n */\nexport async function createEVMClient(\n options: Pick<\n MultichainOptions,\n 'dapp' | 'mobile' | 'transport' | 'analytics'\n > & {\n ui?: Omit<MultichainOptions['ui'], 'factory'>;\n } & {\n eventHandlers?: Partial<EventHandlers>;\n debug?: boolean;\n skipAutoAnnounce?: boolean;\n api: {\n supportedNetworks: Record<Hex, string>;\n };\n },\n): Promise<MetamaskConnectEVM> {\n if (options.debug) {\n enableDebug();\n }\n\n logger('Creating Metamask Connect/EVM with options:', options);\n\n // Validate that supportedNetworks is provided and not empty\n if (\n !options.api?.supportedNetworks ||\n Object.keys(options.api.supportedNetworks).length === 0\n ) {\n throw new Error(\n 'supportedNetworks is required and must contain at least one chain configuration',\n );\n }\n\n validSupportedChainsUrls(options.api.supportedNetworks, 'supportedNetworks');\n\n const supportedNetworksCaipChainId = Object.entries(\n options.api.supportedNetworks,\n ).reduce<Record<string, string>>((acc, [hexChainId, url]) => {\n const decimalChainId = parseInt(hexChainId, 16);\n const caip2ChainId = `eip155:${decimalChainId}`;\n acc[caip2ChainId] = url;\n return acc;\n }, {});\n\n try {\n const core = await createMultichainClient({\n ...options,\n api: {\n supportedNetworks: supportedNetworksCaipChainId,\n },\n analytics: {\n ...(options.analytics ?? {}),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n integrationType: options.analytics?.integrationType || 'direct',\n },\n versions: {\n // typeof guard needed: Metro (React Native) bundles TS source directly,\n // bypassing the tsup build that substitutes __PACKAGE_VERSION__.\n 'connect-evm':\n typeof __PACKAGE_VERSION__ === 'undefined'\n ? 'unknown'\n : __PACKAGE_VERSION__,\n },\n });\n\n const multichainClientPeerRange =\n typeof __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__ === 'undefined'\n ? 'unknown'\n : __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__;\n\n if (\n multichainClientPeerRange !== 'unknown' &&\n multichainClientPeerRange !== '' &&\n !satisfies(core.version, multichainClientPeerRange)\n ) {\n console.warn(\n `@metamask/connect-evm expected @metamask/connect-multichain version ${multichainClientPeerRange}, but got ${core.version}. This may lead to unexpected behavior.`,\n );\n }\n\n const client = await MetamaskConnectEVM.create({\n core,\n eventHandlers: options.eventHandlers,\n supportedNetworks: options.api.supportedNetworks,\n });\n\n if (!options.skipAutoAnnounce) {\n client.announceProvider().catch((error) => {\n logger('EIP-6963 provider announcement failed', error);\n });\n }\n\n return client;\n } catch (error) {\n console.error('Error creating Metamask Connect/EVM', error);\n throw error;\n }\n}\n","export const IGNORED_METHODS = [\n 'metamask_getProviderState',\n 'metamask_sendDomainMetadata',\n 'metamask_logWeb3ShimUsage',\n 'wallet_registerOnboarding',\n 'net_version',\n 'wallet_getPermissions',\n];\n\nexport const CONNECT_METHODS = [\n 'wallet_requestPermissions',\n 'eth_requestAccounts',\n];\n\nexport const ACCOUNTS_METHODS = ['eth_accounts', 'eth_coinbase'];\n\nexport const CHAIN_METHODS = ['eth_chainId'];\n\nexport const INTERCEPTABLE_METHODS = [\n ...ACCOUNTS_METHODS,\n ...IGNORED_METHODS,\n ...CONNECT_METHODS,\n ...CHAIN_METHODS,\n // These have bespoke handlers\n 'wallet_revokePermissions',\n 'wallet_switchEthereumChain',\n 'wallet_addEthereumChain',\n];\n\n/**\n * Session property key used to signal that the connection originated from an\n * EIP-1193-compatible client (i.e. `@metamask/connect-evm`).\n *\n * Wallets receiving a `wallet_createSession` request can use this property to\n * apply EIP-1193-specific UX (e.g. rendering a network picker on the dapp\n * connection bar) that does not apply to pure Multichain API connections or\n * other provider types like Solana Wallet Standard.\n */\nexport const EIP1193_COMPATIBLE_SESSION_PROPERTY = 'eip1193-compatible';\n\n/**\n * Session properties sent on every `wallet_createSession` request issued by\n * `@metamask/connect-evm` to identify the connection as EIP-1193-compatible.\n */\nexport const CONNECT_EVM_SESSION_PROPERTIES = {\n [EIP1193_COMPATIBLE_SESSION_PROPERTY]: true,\n} as const;\n","import {\n createLogger,\n enableDebug as debug,\n} from '@metamask/connect-multichain';\n\nconst namespace = 'metamask-connect:evm';\n\n// @ts-expect-error logger needs to be typed properly\nexport const logger = createLogger(namespace, '63');\n\nexport const enableDebug = (): void => {\n // @ts-expect-error logger needs to be typed properly\n debug(namespace);\n};\n","import metamaskFoxIcon from './assets/metamask-fox.svg';\nimport { logger } from './logger';\nimport type { EIP1193Provider } from './provider';\n\n/**\n * EIP-6963 event name wallets use to announce providers to dapps.\n */\nexport const EIP6963_ANNOUNCE_PROVIDER_EVENT = 'eip6963:announceProvider';\n\n/**\n * EIP-6963 event name dapps dispatch to request wallet re-announcements.\n */\nexport const EIP6963_REQUEST_PROVIDER_EVENT = 'eip6963:requestProvider';\n\n/**\n * Time to wait after requesting EIP-6963 providers before deciding whether a\n * native MetaMask provider is present.\n */\nexport const EIP6963_DETECTION_TIMEOUT_MS = 300;\n\n/**\n * Display name used for the MMConnect-managed MetaMask EIP-6963 provider.\n */\nexport const CONNECT_EVM_EIP6963_NAME = 'MetaMask';\n\n/**\n * Reverse-DNS identifier used for the MMConnect-managed MetaMask EIP-6963 provider.\n */\nexport const CONNECT_EVM_EIP6963_RDNS = 'io.metamask.mmc';\n\n/**\n * Native MetaMask EIP-6963 identifiers that should suppress SDK announcement.\n */\nexport const METAMASK_EIP6963_RDNS = [\n 'io.metamask',\n 'io.metamask.mobile',\n] as const;\n\n/**\n * Icon URI used for the MMConnect-managed MetaMask EIP-6963 provider.\n */\nexport const CONNECT_EVM_EIP6963_ICON = metamaskFoxIcon;\n\n/**\n * EIP-6963 provider metadata announced to dapps.\n */\nexport type EIP6963ProviderInfo = {\n /** Globally unique identifier for this provider instance. */\n uuid: string;\n /** Human-readable wallet name shown in wallet pickers. */\n name: string;\n /** Wallet icon URI. EIP-6963 requires a URI value. */\n icon: string;\n /** Reverse-DNS identifier for the wallet/provider. */\n rdns: string;\n};\n\n/**\n * EIP-6963 announcement payload containing wallet metadata and provider.\n */\nexport type EIP6963ProviderDetail = {\n /** Metadata wallet pickers use for display and deduplication. */\n info: EIP6963ProviderInfo;\n /** EIP-1193 provider exposed by this SDK instance. */\n provider: EIP1193Provider;\n};\n\n/**\n * Gets the current browser window when EIP-6963 events can be used.\n *\n * This intentionally uses the current `window`; it does not attempt to bridge\n * to `window.top`. EIP-6963 discovery is scoped to the frame where the SDK is\n * running.\n *\n * @returns The current browser window, or undefined outside a browser context.\n */\nconst getBrowserWindow = (): Window | undefined => {\n const { window: browserWindow } = globalThis;\n return typeof browserWindow?.dispatchEvent === 'function'\n ? browserWindow\n : undefined;\n};\n\nconst delay = async (ms: number): Promise<void> =>\n await new Promise((resolve) => setTimeout(resolve, ms));\n\nconst isNativeMetaMaskRdns = (rdns: string): boolean =>\n METAMASK_EIP6963_RDNS.some((nativeRdns) => nativeRdns === rdns);\n\nconst getAnnouncementRdns = (event: Event): string | undefined => {\n const { detail } = event as CustomEvent<Partial<EIP6963ProviderDetail>>;\n const rdns = detail?.info?.rdns;\n\n return typeof rdns === 'string' ? rdns : undefined;\n};\n\nconst UUID_BYTE_TO_HEX = Array.from({ length: 256 }, (_, byte) =>\n byte.toString(16).padStart(2, '0'),\n);\n\n/**\n * Formats random bytes as an RFC 4122 version 4 UUID.\n *\n * @param bytes - Random bytes from a cryptographically secure source.\n * @returns A UUID string.\n */\nconst formatUuidV4 = (bytes: Uint8Array): string => {\n bytes[6] = (bytes[6] % 16) + 64;\n bytes[8] = (bytes[8] % 64) + 128;\n\n return [\n UUID_BYTE_TO_HEX[bytes[0]],\n UUID_BYTE_TO_HEX[bytes[1]],\n UUID_BYTE_TO_HEX[bytes[2]],\n UUID_BYTE_TO_HEX[bytes[3]],\n '-',\n UUID_BYTE_TO_HEX[bytes[4]],\n UUID_BYTE_TO_HEX[bytes[5]],\n '-',\n UUID_BYTE_TO_HEX[bytes[6]],\n UUID_BYTE_TO_HEX[bytes[7]],\n '-',\n UUID_BYTE_TO_HEX[bytes[8]],\n UUID_BYTE_TO_HEX[bytes[9]],\n '-',\n UUID_BYTE_TO_HEX[bytes[10]],\n UUID_BYTE_TO_HEX[bytes[11]],\n UUID_BYTE_TO_HEX[bytes[12]],\n UUID_BYTE_TO_HEX[bytes[13]],\n UUID_BYTE_TO_HEX[bytes[14]],\n UUID_BYTE_TO_HEX[bytes[15]],\n ].join('');\n};\n\n/**\n * Creates a UUID for the EIP-6963 provider identity.\n *\n * Requires Web Crypto. EIP-6963 discovery is browser-only, and unsupported\n * browsers should fail this best-effort announcement path rather than receive a\n * weak UUID.\n *\n * @returns A UUID string.\n */\nconst createUuid = (): string => {\n const { crypto: cryptoProvider } = globalThis;\n\n if (cryptoProvider?.randomUUID) {\n return cryptoProvider.randomUUID();\n }\n\n if (cryptoProvider?.getRandomValues) {\n const bytes = new Uint8Array(16);\n cryptoProvider.getRandomValues(bytes);\n return formatUuidV4(bytes);\n }\n\n throw new Error('Web Crypto API is required for EIP-6963 announcement');\n};\n\n/**\n * Creates a DOM custom event with an EIP-6963 announcement payload.\n *\n * @param detail - The provider announcement detail.\n * @returns A custom event containing the announcement detail.\n */\nconst createAnnouncementEvent = (\n detail: Readonly<EIP6963ProviderDetail>,\n): CustomEvent<Readonly<EIP6963ProviderDetail>> => {\n const { CustomEvent: CustomEventConstructor } = globalThis;\n return new CustomEventConstructor(EIP6963_ANNOUNCE_PROVIDER_EVENT, {\n detail,\n });\n};\n\n/**\n * Creates a DOM event requesting EIP-6963 providers to re-announce.\n *\n * @returns A request-provider event.\n */\nconst createRequestProviderEvent = (): Event => {\n const { Event: EventConstructor } = globalThis;\n return new EventConstructor(EIP6963_REQUEST_PROVIDER_EVENT);\n};\n\n/**\n * Creates immutable metadata for one SDK provider identity.\n *\n * @returns Provider metadata for EIP-6963 announcement.\n */\nconst createProviderInfo = (): Readonly<EIP6963ProviderInfo> =>\n Object.freeze({\n uuid: createUuid(),\n name: CONNECT_EVM_EIP6963_NAME,\n icon: CONNECT_EVM_EIP6963_ICON,\n rdns: CONNECT_EVM_EIP6963_RDNS,\n });\n\n/**\n * Checks whether native MetaMask has already announced through EIP-6963.\n *\n * The listener is installed before dispatching `requestProvider` so wallets\n * that announce synchronously in response to the request are observed.\n *\n * @returns True when a native MetaMask provider rdns was observed.\n */\nconst hasNativeMetaMaskProvider = async (): Promise<boolean> => {\n const browserWindow = getBrowserWindow();\n if (!browserWindow) {\n return false;\n }\n\n const announcedRdns = new Set<string>();\n const handler = (event: Event): void => {\n const rdns = getAnnouncementRdns(event);\n if (rdns) {\n announcedRdns.add(rdns);\n }\n };\n\n browserWindow.addEventListener(EIP6963_ANNOUNCE_PROVIDER_EVENT, handler);\n try {\n browserWindow.dispatchEvent(createRequestProviderEvent());\n await delay(EIP6963_DETECTION_TIMEOUT_MS);\n } finally {\n browserWindow.removeEventListener(EIP6963_ANNOUNCE_PROVIDER_EVENT, handler);\n }\n\n return [...announcedRdns].some(isNativeMetaMaskRdns);\n};\n\n/**\n * Announces an MMConnect-managed EIP-1193 provider through EIP-6963.\n *\n * Announcement is best-effort and browser-only. Native MetaMask providers with\n * `io.metamask` or `io.metamask.mobile` suppress this SDK provider to avoid\n * duplicate MetaMask entries in wallet pickers.\n */\nexport class EIP6963ProviderAnnouncer {\n /** EIP-1193 provider exposed in EIP-6963 announcements. */\n readonly #provider: EIP1193Provider;\n\n /** Stable announcement payload for this SDK provider instance. */\n #detail?: Readonly<EIP6963ProviderDetail>;\n\n /** Whether native MetaMask detection already suppressed this provider. */\n #suppressed = false;\n\n /** Listener used to re-announce the SDK provider on future requests. */\n #requestHandler?: () => void;\n\n /** In-flight announcement detection promise, shared by concurrent calls. */\n #announcementPromise?: Promise<void>;\n\n /**\n * Creates an EIP-6963 announcer for one SDK provider instance.\n *\n * @param provider - EIP-1193 provider to announce.\n */\n constructor(provider: EIP1193Provider) {\n this.#provider = provider;\n }\n\n /**\n * Announces the SDK provider unless native MetaMask has already announced.\n *\n * Repeated calls are idempotent: once announced, this re-dispatches the same\n * provider detail and does not install duplicate request listeners. The first\n * call may take up to `EIP6963_DETECTION_TIMEOUT_MS` while native providers\n * are requested.\n *\n * @returns A promise that resolves once detection and any announcement finish.\n */\n async announce(): Promise<void> {\n try {\n if (this.#suppressed) {\n return;\n }\n\n if (this.#detail) {\n this.#dispatchAnnouncement();\n return;\n }\n\n if (!this.#announcementPromise) {\n this.#announcementPromise = this.#announceOnce()\n .catch((error) => {\n logger('EIP-6963 provider announcement failed', error);\n })\n .finally(() => {\n this.#announcementPromise = undefined;\n });\n }\n\n await this.#announcementPromise;\n } catch (error) {\n logger('EIP-6963 provider announcement failed', error);\n }\n }\n\n /**\n * Performs the first announcement flow after native provider detection.\n */\n async #announceOnce(): Promise<void> {\n if (!getBrowserWindow()) {\n return;\n }\n\n if (await hasNativeMetaMaskProvider()) {\n logger('MetaMask EIP-6963 provider is already announced. Skipping...');\n this.#suppressed = true;\n return;\n }\n\n this.#detail = Object.freeze({\n info: createProviderInfo(),\n provider: this.#provider,\n });\n this.#installRequestProviderListener();\n this.#dispatchAnnouncement();\n }\n\n /**\n * Installs a single persistent EIP-6963 request listener for re-announcement.\n */\n #installRequestProviderListener(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || this.#requestHandler) {\n return;\n }\n\n this.#requestHandler = (): void => {\n try {\n this.#dispatchAnnouncement();\n } catch (error) {\n logger('EIP-6963 provider announcement failed', error);\n }\n };\n browserWindow.addEventListener(\n EIP6963_REQUEST_PROVIDER_EVENT,\n this.#requestHandler,\n );\n }\n\n /**\n * Dispatches the current provider detail through EIP-6963.\n */\n #dispatchAnnouncement(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || !this.#detail) {\n return;\n }\n\n browserWindow.dispatchEvent(createAnnouncementEvent(this.#detail));\n }\n}\n","/* eslint-disable promise/always-return -- Legacy callback patterns */\n/* eslint-disable promise/no-callback-in-promise -- Legacy sendAsync/send API */\n/* eslint-disable consistent-return -- Legacy method returns void or Promise */\n/* eslint-disable @typescript-eslint/no-floating-promises -- Legacy fire-and-forget pattern */\n/* eslint-disable jsdoc/require-returns -- Inherited from abstract class */\nimport type { MultichainCore, Scope } from '@metamask/connect-multichain';\nimport { EventEmitter, RPCInvokeMethodErr } from '@metamask/connect-multichain';\nimport { hexToNumber } from '@metamask/utils';\n\nimport { INTERCEPTABLE_METHODS } from './constants';\nimport { logger } from './logger';\nimport type {\n Address,\n EIP1193ProviderEvents,\n Hex,\n JsonRpcCallback,\n JsonRpcRequest,\n JsonRpcResponse,\n ProviderRequest,\n ProviderRequestInterceptor,\n} from './types';\n\n/**\n * EIP-1193 Provider wrapper around the Multichain SDK.\n */\nexport class EIP1193Provider extends EventEmitter<EIP1193ProviderEvents> {\n /** The core instance of the Multichain SDK */\n readonly #core: MultichainCore;\n\n /** Interceptor function to handle specific methods */\n readonly #requestInterceptor: ProviderRequestInterceptor;\n\n /** The currently permitted accounts */\n #accounts: Address[] = [];\n\n /** The currently selected chain ID on the wallet */\n #selectedChainId?: Hex | undefined;\n\n constructor(core: MultichainCore, interceptor: ProviderRequestInterceptor) {\n super();\n this.#core = core;\n this.#requestInterceptor = interceptor;\n\n // Bind all public methods to ensure `this` context is preserved\n // when methods are extracted or passed as callbacks.\n // This eliminates the need for Proxy wrappers in consumers.\n this.request = this.request.bind(this);\n this.sendAsync = this.sendAsync.bind(this);\n this.send = this.send.bind(this);\n\n // Bind inherited EventEmitter methods\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.emit = this.emit.bind(this);\n this.once = this.once.bind(this);\n this.removeListener = this.removeListener.bind(this);\n this.listenerCount = this.listenerCount.bind(this);\n }\n\n /**\n * Performs a EIP-1193 request.\n *\n * @param request - The request object containing the method and params\n * @returns The result of the request\n */\n async request(request: ProviderRequest): Promise<unknown> {\n logger(\n `request: ${request.method} - chainId: ${this.selectedChainId}`,\n request.params,\n );\n /* Some methods require special handling, so we intercept them here\n * and handle them in MetamaskConnectEVM.requestInterceptor method. */\n if (INTERCEPTABLE_METHODS.includes(request.method)) {\n return this.#requestInterceptor?.(request);\n }\n\n if (!this.#selectedChainId) {\n // TODO: replace with a better error\n throw new Error('No chain ID selected');\n }\n\n const decimalChainId = hexToNumber(this.#selectedChainId);\n const scope: Scope = `eip155:${decimalChainId}`;\n\n // Validate that the chain is configured in supportedNetworks\n // This check is performed here to provide better error messages\n // The RpcClient will also validate, but this gives us a chance to provide\n // a clearer error message before the request is routed\n const coreOptions = (this.#core as any).options; // TODO: options is `protected readonly` property, this needs to be refactored so `any` type assertion is not necessary\n const supportedNetworks = coreOptions?.api?.supportedNetworks ?? {};\n if (!supportedNetworks[scope]) {\n throw new Error(\n `Chain ${scope} is not configured in supportedNetworks. Requests cannot be made to chains not explicitly configured in supportedNetworks.`,\n );\n }\n\n try {\n return await this.#core.invokeMethod({\n scope,\n request: {\n method: request.method,\n params: request.params,\n },\n });\n } catch (error) {\n if (error instanceof RPCInvokeMethodErr && error.rpcCode !== undefined) {\n const rpcError = new Error(\n error.rpcMessage ?? error.reason,\n ) as Error & { code: number };\n rpcError.code = error.rpcCode;\n throw rpcError;\n }\n throw error;\n }\n }\n\n // Getters and setters\n public get selectedAccount(): Address | undefined {\n return this.accounts[0];\n }\n\n public set accounts(accounts: Address[]) {\n this.#accounts = accounts;\n }\n\n public get accounts(): Address[] {\n return this.#accounts;\n }\n\n public get selectedChainId(): Hex | undefined {\n return this.#selectedChainId;\n }\n\n public set selectedChainId(chainId: Hex | undefined) {\n this.#selectedChainId = chainId;\n }\n\n // ==========================================\n // Legacy compatibility methods\n // ==========================================\n\n /**\n * Alias for selectedChainId for legacy compatibility.\n * Many dApps expect a `chainId` property on the provider.\n */\n public get chainId(): Hex | undefined {\n return this.selectedChainId;\n }\n\n /**\n * Legacy method for sending JSON-RPC requests.\n *\n * @deprecated Use `request` instead. This method is provided for backwards compatibility.\n * @param request - The JSON-RPC request object\n * @param callback - Optional callback function. If provided, the method returns void.\n * @returns A promise resolving to the JSON-RPC response, or void if a callback is provided.\n */\n async sendAsync<TParams = unknown, TResult = unknown>(\n request: JsonRpcRequest<TParams>,\n callback?: JsonRpcCallback<TResult>,\n ): Promise<JsonRpcResponse<TResult> | void> {\n const id = request.id ?? 1;\n\n const promise = this.request({\n method: request.method,\n params: request.params as unknown,\n })\n .then(\n (result): JsonRpcResponse<TResult> => ({\n id,\n jsonrpc: '2.0',\n result: result as TResult,\n }),\n )\n .catch(\n (error): JsonRpcResponse<TResult> => ({\n id,\n jsonrpc: '2.0',\n error: {\n code: error.code ?? -32603,\n message: error.message ?? 'Internal error',\n data: error.data,\n },\n }),\n );\n\n if (callback) {\n promise\n .then((response) => {\n if (response.error) {\n callback(new Error(response.error.message), response);\n } else {\n callback(null, response);\n }\n })\n .catch((error) => {\n callback(error, null);\n });\n return;\n }\n\n return promise;\n }\n\n /**\n * Legacy method for sending JSON-RPC requests synchronously (callback-based).\n *\n * @deprecated Use `request` instead. This method is provided for backwards compatibility.\n * @param request - The JSON-RPC request object\n * @param callback - The callback function to receive the response\n */\n send<TParams = unknown, TResult = unknown>(\n request: JsonRpcRequest<TParams>,\n callback: JsonRpcCallback<TResult>,\n ): void {\n this.sendAsync(request, callback);\n }\n}\n","// Inlined from `@metamask/chain-agnostic-permission@1.2.2` to avoid pulling\n// its transitive `controller-utils` / `lodash` / `bn.js` / `eth-ens-namehash`\n// chain into every consumer's `connect-evm` bundle (e.g. wagmi → LiFi).\n// Built on `@metamask/utils` primitives; semantics are identical to upstream.\n//\n// Upstream sources (pinned to commit `82aec7d`):\n// - `parseScopeString`: https://github.com/MetaMask/core/blob/82aec7d537f0cca3663c44c17e1560f6e00c9b8c/packages/chain-agnostic-permission/src/scope/types.ts#L93-L107\n// - `getEthAccounts`: https://github.com/MetaMask/core/blob/82aec7d537f0cca3663c44c17e1560f6e00c9b8c/packages/chain-agnostic-permission/src/operators/caip-permission-operator-accounts.ts#L77-L91\n// - `getPermittedEthChainIds`: https://github.com/MetaMask/core/blob/82aec7d537f0cca3663c44c17e1560f6e00c9b8c/packages/chain-agnostic-permission/src/operators/caip-permission-operator-permittedChains.ts#L43-L58\n//\n// If upstream changes semantics, mirror the change and bump the pinned commit.\n// Revisit if upstream ever splits `controller-utils` so the dep becomes cheap.\n\nimport type { SessionData } from '@metamask/connect-multichain';\nimport {\n isCaipChainId,\n isCaipNamespace,\n KnownCaipNamespace,\n parseCaipAccountId,\n parseCaipChainId,\n} from '@metamask/utils';\n\nimport type { Address, Hex } from '../types';\n\n/**\n * Result of parsing a CAIP scope string.\n */\ntype ParsedScope = {\n namespace?: string;\n reference?: string;\n};\n\n/**\n * Parses a CAIP-217 scope string (`namespace` or `namespace:reference`) into\n * its components. See file header for upstream reference.\n *\n * @param scopeString - The scope string to parse.\n * @returns An object containing `namespace` and (optionally) `reference`.\n * Returns an empty object if the input is neither a valid CAIP namespace nor\n * a valid CAIP-2 chain ID.\n */\nexport const parseScopeString = (scopeString: string): ParsedScope => {\n if (isCaipNamespace(scopeString)) {\n return { namespace: scopeString };\n }\n if (isCaipChainId(scopeString)) {\n return parseCaipChainId(scopeString);\n }\n return {};\n};\n\n/**\n * Returns true if the scope string is either an `eip155:*` chain scope or the\n * `wallet:eip155` cross-chain wallet scope.\n *\n * @param scopeString - The scope string to check.\n * @returns True if EIP-155-namespaced.\n */\nconst isEip155ScopeString = (scopeString: string): boolean => {\n const { namespace } = parseScopeString(scopeString);\n return (\n namespace === KnownCaipNamespace.Eip155 ||\n scopeString === `${KnownCaipNamespace.Wallet}:${KnownCaipNamespace.Eip155}`\n );\n};\n\n/**\n * Returns true if the value is a `0x`-prefixed strict hex string.\n *\n * @param value - The value to check.\n * @returns True if `value` matches `/^0x[0-9a-fA-F]+$/`.\n */\nconst isStrictHexString = (value: string): value is Hex =>\n /^0x[0-9a-fA-F]+$/u.test(value);\n\n/**\n * Converts a CAIP-2 EIP-155 `reference` (decimal string, e.g. `\"137\"`) into a\n * `0x`-prefixed hex chain ID. Tolerates already-hex inputs to mirror\n * `@metamask/controller-utils.toHex`. Uses `BigInt` so chain IDs larger than\n * `Number.MAX_SAFE_INTEGER` (e.g. some experimental chains) are handled\n * correctly.\n *\n * @param reference - The CAIP-2 reference component of an `eip155` scope.\n * @returns The reference as a `0x`-prefixed hex string.\n */\nconst referenceToHexChainId = (reference: string): Hex => {\n if (isStrictHexString(reference)) {\n return reference;\n }\n return `0x${BigInt(reference).toString(16)}`;\n};\n\n/**\n * Get the unique Ethereum (EIP-155) accounts from the session scopes.\n *\n * Walks every scope's `accounts` array, keeps CAIP-10 account IDs whose chain\n * is EIP-155 (or the `wallet:eip155` cross-chain wallet scope), and returns\n * the unique 0x addresses.\n *\n * @param sessionScopes - The session scopes from `wallet_createSession` /\n * `wallet_getSession` / `wallet_sessionChanged`.\n * @returns The unique Ethereum addresses across all EIP-155 scopes.\n */\nexport const getEthAccounts = (\n sessionScopes: SessionData['sessionScopes'] | undefined,\n): Address[] => {\n if (!sessionScopes) {\n return [];\n }\n\n const ethAccounts: Address[] = [];\n for (const { accounts } of Object.values(sessionScopes)) {\n if (!accounts) {\n continue;\n }\n for (const account of accounts) {\n const { address, chainId } = parseCaipAccountId(account);\n if (isEip155ScopeString(chainId) && isStrictHexString(address)) {\n ethAccounts.push(address);\n }\n }\n }\n\n return Array.from(new Set(ethAccounts));\n};\n\n/**\n * Get the unique permitted Ethereum (EIP-155) chain IDs from the session\n * scopes.\n *\n * Iterates the scope keys, keeps the `eip155:<reference>` ones, converts each\n * decimal `reference` to a `0x`-prefixed hex chain ID, and returns the unique\n * set.\n *\n * @param sessionScopes - The session scopes from `wallet_createSession` /\n * `wallet_getSession` / `wallet_sessionChanged`.\n * @returns The unique EIP-155 chain IDs as `0x`-prefixed hex strings.\n */\nexport const getPermittedEthChainIds = (\n sessionScopes: SessionData['sessionScopes'] | undefined,\n): Hex[] => {\n if (!sessionScopes) {\n return [];\n }\n\n const ethChainIds: Hex[] = [];\n for (const scopeString of Object.keys(sessionScopes)) {\n const { namespace, reference } = parseScopeString(scopeString);\n if (namespace === KnownCaipNamespace.Eip155 && reference) {\n ethChainIds.push(referenceToHexChainId(reference));\n }\n }\n\n return Array.from(new Set(ethChainIds));\n};\n","import type { ProviderRequest } from '../types';\n\n/**\n * Type guard for connect-like requests:\n * - wallet_requestPermissions\n * - eth_requestAccounts\n *\n * @param req - The request object to check\n * @returns True if the request is a connect-like request, false otherwise\n */\nexport function isConnectRequest(req: ProviderRequest): req is Extract<\n ProviderRequest,\n {\n method: 'wallet_requestPermissions' | 'eth_requestAccounts';\n }\n> {\n return (\n req.method === 'wallet_requestPermissions' ||\n req.method === 'eth_requestAccounts'\n );\n}\n\n/**\n * Type guard for wallet_switchEthereumChain request.\n *\n * @param req - The request object to check\n * @returns True if the request is a wallet_switchEthereumChain request, false otherwise\n */\nexport function isSwitchChainRequest(\n req: ProviderRequest,\n): req is Extract<ProviderRequest, { method: 'wallet_switchEthereumChain' }> {\n return req.method === 'wallet_switchEthereumChain';\n}\n\n/**\n * Type guard for wallet_addEthereumChain request.\n *\n * @param req - The request object to check\n * @returns True if the request is a wallet_addEthereumChain request, false otherwise\n */\nexport function isAddChainRequest(\n req: ProviderRequest,\n): req is Extract<ProviderRequest, { method: 'wallet_addEthereumChain' }> {\n return req.method === 'wallet_addEthereumChain';\n}\n\n/**\n * Type guard for generic accounts request:\n * - eth_accounts\n * - eth_coinbase\n *\n * @param req - The request object to check\n * @returns True if the request is a generic accounts request, false otherwise\n */\nexport function isAccountsRequest(\n req: ProviderRequest,\n): req is Extract<\n ProviderRequest,\n { method: 'eth_accounts' | 'eth_coinbase' }\n> {\n return req.method === 'eth_accounts' || req.method === 'eth_coinbase';\n}\n\n/**\n * Type guard for generic eth_chainId request.\n *\n * @param req - The request object to check\n * @returns True if the request is a eth_chainId request, false otherwise\n */\nexport function isChainIdRequest(\n req: ProviderRequest,\n): req is Extract<ProviderRequest, { method: 'eth_chainId' }> {\n return req.method === 'eth_chainId';\n}\n\n/**\n * Validates that all values in a Record are valid URLs.\n *\n * @param record - The record to validate (e.g., supportedNetworks)\n * @param recordName - The name of the record for error messages\n * @throws Error if any values are invalid URLs\n */\nexport function validSupportedChainsUrls(\n record: Record<string, string>,\n recordName: string,\n): void {\n const invalidUrls: string[] = [];\n for (const [key, url] of Object.entries(record)) {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n } catch {\n invalidUrls.push(`${key}: ${url}`);\n }\n }\n\n if (invalidUrls.length > 0) {\n throw new Error(\n `${recordName} contains invalid URLs:\\n${invalidUrls.join('\\n')}`,\n );\n }\n}\n"],"mappings":"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","names":["namespace","hexToNumber","hexToNumber","hexToNumber","_a","KnownCaipNamespace","parseCaipChainId","namespace","_core","_provider","hexToNumber","namespace"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/infura.ts","../../../src/connect.ts","../../../src/constants.ts","../../../src/logger.ts","../../../src/eip6963.ts","../../../src/provider.ts","../../../src/utils/caip.ts","../../../src/utils/type-guards.ts"],"sourcesContent":["import { getInfuraRpcUrls as getInfuraRpcUrlsMultichain } from '@metamask/connect-multichain';\nimport type { CaipChainId, Hex } from '@metamask/utils';\nimport {\n hexToNumber,\n KnownCaipNamespace,\n numberToHex,\n parseCaipChainId,\n} from '@metamask/utils';\n\n/**\n * Generates Infura RPC URLs for common EVM networks keyed by hex chain ID.\n *\n * @param options - The options for generating Infura RPC URLs\n * @param options.infuraApiKey - The Infura API key\n * @param options.chainIds - Optional hex chain IDs to filter the output\n * @returns A map of hex chain IDs to Infura RPC URLs\n */\nexport const getInfuraRpcUrls = ({\n infuraApiKey,\n chainIds,\n}: {\n infuraApiKey: string;\n chainIds?: Hex[];\n}): Record<Hex, string> => {\n const caipChainIds = chainIds?.map(\n (chainId) => `eip155:${hexToNumber(chainId)}` as CaipChainId,\n );\n\n const caipMap = getInfuraRpcUrlsMultichain({\n infuraApiKey,\n caipChainIds,\n });\n\n return Object.entries(caipMap).reduce<Record<Hex, string>>(\n (acc, [key, url]) => {\n const { namespace, reference } = parseCaipChainId(key as CaipChainId);\n if (namespace !== KnownCaipNamespace.Eip155) {\n return acc;\n }\n const chainId = numberToHex(parseInt(reference, 10));\n acc[chainId] = url;\n return acc;\n },\n {},\n );\n};\n","/* eslint-disable no-restricted-syntax -- Private class properties use established patterns */\n/* eslint-disable @typescript-eslint/naming-convention -- __PACKAGE_VERSION__ and __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__ are esbuild define conventions */\nimport { analytics } from '@metamask/analytics';\nimport type {\n MultichainCore,\n MultichainOptions,\n Scope,\n SessionData,\n} from '@metamask/connect-multichain';\nimport {\n createMultichainClient,\n getWalletActionAnalyticsProperties,\n isRejectionError,\n TransportType,\n} from '@metamask/connect-multichain';\nimport { hexToNumber } from '@metamask/utils';\nimport { satisfies } from 'semver';\n\nimport { CONNECT_EVM_SESSION_PROPERTIES, IGNORED_METHODS } from './constants';\nimport { EIP6963ProviderAnnouncer } from './eip6963';\nimport { enableDebug, logger } from './logger';\nimport { EIP1193Provider } from './provider';\nimport type {\n AddEthereumChainParameter,\n Address,\n CaipAccountId,\n EventHandlers,\n Hex,\n MetamaskConnectEVMOptions,\n ProviderRequest,\n ProviderRequestInterceptor,\n} from './types';\nimport {\n getEthAccounts,\n getPermittedEthChainIds,\n parseScopeString,\n} from './utils/caip';\nimport {\n isAccountsRequest,\n isAddChainRequest,\n isChainIdRequest,\n isConnectRequest,\n isSwitchChainRequest,\n validSupportedChainsUrls,\n} from './utils/type-guards';\n\n// Values substituted by tsup at build time\ndeclare const __PACKAGE_VERSION__: string | undefined;\ndeclare const __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__: string | undefined;\n\nconst DEFAULT_CHAIN_ID = '0x1';\nconst CHAIN_STORE_KEY = 'cache_eth_chainId';\n\n/**\n * Checks whether dapp-side analytics are enabled for the multichain core.\n *\n * @param options - Current multichain options.\n * @returns Whether analytics events should be collected and sent.\n */\nfunction isAnalyticsEnabled(options: MultichainOptions | undefined): boolean {\n return options?.analytics?.enabled !== false;\n}\n\n/** The options for the connect method */\ntype ConnectOptions = {\n /** The account to connect to */\n account?: string | undefined;\n /** Whether to force a request regardless of an existing session */\n forceRequest?: boolean;\n /** All available chain IDs in the dapp in hex format */\n chainIds?: Hex[];\n};\n\ntype RequestedPermission = {\n id: string;\n parentCapability: 'eth_accounts' | 'endowment:permitted-chains';\n invoker: string;\n caveats: {\n type: 'restrictReturnedAccounts' | 'restrictNetworkSwitching';\n value: Address[] | Hex[];\n }[];\n date: number;\n};\n\nconst createPermissionId = (): string => {\n if (globalThis.crypto?.randomUUID) {\n return globalThis.crypto.randomUUID();\n }\n\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nconst getDappInvoker = (options: MultichainOptions): string => {\n const { name, nativeScheme, url: dappUrl } = options.dapp;\n const fallbackInvoker = nativeScheme ?? name;\n\n if (!dappUrl) {\n return fallbackInvoker;\n }\n\n try {\n const { origin } = new URL(dappUrl);\n return origin === 'null' ? fallbackInvoker : origin;\n } catch {\n return fallbackInvoker;\n }\n};\n\nconst getRequestedPermissions = ({\n accounts,\n chainIds,\n invoker,\n}: {\n accounts: Address[];\n chainIds: Hex[];\n invoker: string;\n}): RequestedPermission[] => {\n const id = createPermissionId();\n const date = Date.now();\n\n return [\n {\n id,\n parentCapability: 'eth_accounts',\n invoker,\n caveats: [\n {\n type: 'restrictReturnedAccounts',\n value: accounts,\n },\n ],\n date,\n },\n {\n id,\n parentCapability: 'endowment:permitted-chains',\n invoker,\n caveats: [\n {\n type: 'restrictNetworkSwitching',\n value: chainIds,\n },\n ],\n date,\n },\n ];\n};\n\nexport type ConnectEvmStatus = 'disconnected' | 'connected' | 'connecting';\n\n/**\n * The MetamaskConnectEVM class provides an EIP-1193 compatible interface for connecting\n * to MetaMask and interacting with Ethereum Virtual Machine (EVM) networks.\n *\n * This class serves as a modern replacement for MetaMask SDK V1, offering enhanced\n * functionality and cross-platform compatibility. It wraps the Multichain SDK to provide\n * a simplified, EIP-1193 compliant API for dapp developers.\n *\n * Key features:\n * - EIP-1193 provider interface for seamless integration with existing dapp code\n * - Automatic session recovery when reloading or opening in new tabs\n * - Chain switching with automatic chain addition if not configured\n * - Event-driven architecture with support for connect, disconnect, accountsChanged, and chainChanged events\n * - Cross-platform support for browser extensions and mobile applications\n * - Built-in handling of common Ethereum methods (eth_accounts, wallet_switchEthereumChain, etc.)\n *\n * @example\n * ```typescript\n * const client = await createEVMClient({\n * dapp: { name: 'My DApp', url: 'https://mydapp.com' }\n * });\n *\n * const { accounts, chainId } = await client.connect({ chainIds: [1, 137] }); // Connect to Ethereum Mainnet, and Polygon\n *\n * const provider = client.getProvider();\n * const signedMessage = await provider.request({ method: 'personal_sign', params: ['0x0', accounts[0]] });\n * ```\n */\nexport class MetamaskConnectEVM {\n /** The core instance of the Multichain SDK */\n readonly #core: MultichainCore;\n\n /** An instance of the EIP-1193 provider interface */\n readonly #provider: EIP1193Provider;\n\n /** Handles EIP-6963 discovery announcements for the provider */\n readonly #eip6963Announcer: EIP6963ProviderAnnouncer;\n\n /** The session scopes currently permitted */\n #sessionScopes: SessionData['sessionScopes'] = {};\n\n /** Optional event handlers for the EIP-1193 provider events. */\n readonly #eventHandlers?: Partial<EventHandlers> | undefined;\n\n /** The handler for the wallet_sessionChanged event */\n readonly #sessionChangedHandler: (session?: SessionData) => void;\n\n /** The handler for the display_uri event */\n readonly #displayUriHandler: (uri: string) => void;\n\n /** The clean-up function for the notification handler */\n #removeNotificationHandler?: () => void;\n\n /** The current connection status */\n #status: ConnectEvmStatus = 'disconnected';\n\n /**\n * The preferred chain ID to use for the active connect() call.\n * Set to the first explicit chainId passed by the caller, cleared once the\n * connect event resolves. Takes priority over the cache in #getSelectedChainId\n * so that an explicit chainIds request always wins over a prior cached value.\n */\n #pendingPreferredChainId: Hex | undefined;\n\n /**\n * Creates a new MetamaskConnectEVM instance.\n * Use the static `create()` method instead to ensure proper async initialization.\n *\n * @param options - The options for the MetamaskConnectEVM instance\n * @param options.core - The core instance of the Multichain SDK\n * @param options.eventHandlers - Optional event handlers for EIP-1193 provider events\n */\n private constructor({ core, eventHandlers }: MetamaskConnectEVMOptions) {\n this.#core = core;\n\n this.#provider = new EIP1193Provider(\n core,\n this.#requestInterceptor.bind(this),\n );\n this.#eip6963Announcer = new EIP6963ProviderAnnouncer(this.#provider);\n\n this.#eventHandlers = eventHandlers;\n\n /**\n * Handles the wallet_sessionChanged event.\n * Updates the internal connection state with the new session data.\n *\n * @param session - The session data\n */\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#sessionChangedHandler = this.#onSessionChanged.bind(this);\n this.#core.on('wallet_sessionChanged', this.#sessionChangedHandler);\n\n /**\n * Handles the display_uri event.\n * Forwards the QR code URI to the provider for custom UI implementations.\n */\n this.#displayUriHandler = this.#onDisplayUri.bind(this);\n this.#core.on('display_uri', this.#displayUriHandler);\n\n logger('Connect/EVM constructor completed');\n }\n\n /**\n * Creates a fully initialized MetamaskConnectEVM instance.\n * This is the recommended way to instantiate the class, as it ensures\n * all async initialization (like session recovery) completes before\n * the instance is returned.\n *\n * @param options - The options for the MetamaskConnectEVM instance\n * @param options.core - The core instance of the Multichain SDK\n * @param options.eventHandlers - Optional event handlers for EIP-1193 provider events\n * @returns A promise that resolves with a fully initialized MetamaskConnectEVM instance\n */\n static async create(\n options: MetamaskConnectEVMOptions,\n ): Promise<MetamaskConnectEVM> {\n const instance = new MetamaskConnectEVM(options);\n let session;\n try {\n session = await instance.#core.provider.getSession();\n } catch {\n session = { sessionScopes: {} };\n }\n await instance.#onSessionChanged(session);\n return instance;\n }\n\n /**\n * Gets the core options for analytics checks.\n *\n * @returns The multichain options from the core instance\n */\n #getCoreOptions(): MultichainOptions {\n return (this.#core as any).options as MultichainOptions;\n }\n\n /**\n * Creates invoke options for analytics tracking.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n * @returns Invoke options object for analytics\n */\n #createInvokeOptions(\n method: string,\n scope: Scope,\n params: unknown[],\n ): {\n scope: Scope;\n request: { method: string; params: unknown[] };\n } {\n return {\n scope,\n request: { method, params },\n };\n }\n\n /**\n * Tracks a wallet action requested event.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n */\n async #trackWalletActionRequested(\n method: string,\n scope: Scope,\n params: unknown[],\n ): Promise<void> {\n const coreOptions = this.#getCoreOptions();\n if (!isAnalyticsEnabled(coreOptions)) {\n return;\n }\n\n try {\n const invokeOptions = this.#createInvokeOptions(method, scope, params);\n const props = await getWalletActionAnalyticsProperties(\n coreOptions,\n this.#core.storage,\n invokeOptions,\n this.#core.transportType,\n );\n analytics.track('mmconnect_wallet_action_requested', props);\n } catch (error) {\n logger('Error tracking mmconnect_wallet_action_requested event', error);\n }\n }\n\n /**\n * Tracks a wallet action succeeded event.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n */\n async #trackWalletActionSucceeded(\n method: string,\n scope: Scope,\n params: unknown[],\n ): Promise<void> {\n const coreOptions = this.#getCoreOptions();\n if (!isAnalyticsEnabled(coreOptions)) {\n return;\n }\n\n try {\n const invokeOptions = this.#createInvokeOptions(method, scope, params);\n const props = await getWalletActionAnalyticsProperties(\n coreOptions,\n this.#core.storage,\n invokeOptions,\n this.#core.transportType,\n );\n analytics.track('mmconnect_wallet_action_succeeded', props);\n } catch (error) {\n logger('Error tracking mmconnect_wallet_action_succeeded event', error);\n }\n }\n\n /**\n * Tracks a wallet action failed or rejected event based on the error.\n *\n * @param method - The RPC method name\n * @param scope - The CAIP chain ID scope\n * @param params - The method parameters\n * @param error - The error that occurred\n */\n async #trackWalletActionFailed(\n method: string,\n scope: Scope,\n params: unknown[],\n error: unknown,\n ): Promise<void> {\n const coreOptions = this.#getCoreOptions();\n if (!isAnalyticsEnabled(coreOptions)) {\n return;\n }\n\n try {\n const invokeOptions = this.#createInvokeOptions(method, scope, params);\n const props = await getWalletActionAnalyticsProperties(\n coreOptions,\n this.#core.storage,\n invokeOptions,\n this.#core.transportType,\n );\n const isRejection = isRejectionError(error);\n if (isRejection) {\n analytics.track('mmconnect_wallet_action_rejected', props);\n } else {\n analytics.track('mmconnect_wallet_action_failed', props);\n }\n } catch {\n logger('Error tracking wallet action rejected or failed event', error);\n }\n }\n\n /**\n * Gets the currently selected chainId. Priority order:\n * - Explicit caller preference from an active connect() call, if permitted.\n * - Cached chainId from storage, if permitted.\n * - First permitted chain as a fallback.\n *\n * @param permittedChainIds - Array of permitted chain IDs in hex format\n * @returns The selected chainId (hex string)\n */\n async #getSelectedChainId(permittedChainIds: Hex[]): Promise<Hex> {\n // Honour an explicit caller preference set during an active connect() call\n if (\n this.#pendingPreferredChainId &&\n permittedChainIds.includes(this.#pendingPreferredChainId)\n ) {\n return this.#pendingPreferredChainId;\n }\n\n try {\n const cachedChainId =\n await this.#core.storage.adapter.get(CHAIN_STORE_KEY);\n if (cachedChainId) {\n const chainId: Hex = JSON.parse(cachedChainId);\n\n // Validate that the cached chainId is in the permitted chains list\n if (permittedChainIds.includes(chainId)) {\n return chainId;\n }\n }\n } catch (error) {\n logger('Error retrieving cached chainId', error);\n }\n\n // Fallback to the first permitted chain if cache retrieval failed or returned an invalid chain\n return permittedChainIds[0];\n }\n\n /**\n * Connects to the wallet with the specified chain ID and optional account.\n *\n * @param options - The connection options\n * @param [options.account] - Optional param to specify an account to connect to\n * @param [options.forceRequest] - Optional param to force a connection request regardless of whether there is a pre-existing session\n * @param [options.chainIds] - Array of chain IDs to request permission for (defaults to ethereum mainnet). The first entry is used as the active chain returned by the call. Ethereum mainnet is always included in the permission request as a bootstrap fallback.\n * @returns A promise that resolves with the connected accounts and chain ID\n */\n async connect({\n account,\n forceRequest,\n chainIds = [DEFAULT_CHAIN_ID],\n }: ConnectOptions = {}): Promise<{ accounts: Address[]; chainId: Hex }> {\n logger('request: connect', { account });\n\n if (!chainIds || chainIds.length === 0) {\n throw new Error('chainIds must be an array of at least one chain ID');\n }\n\n // The first explicitly-requested chain is preferred for chain selection.\n // DEFAULT_CHAIN_ID is still included in the permission request as a bootstrap\n // fallback, but it must not win over an explicit caller request.\n this.#pendingPreferredChainId = chainIds[0];\n\n const caipChainIds = Array.from(\n new Set(chainIds.concat(DEFAULT_CHAIN_ID) ?? [DEFAULT_CHAIN_ID]),\n ).map((id) => `eip155:${hexToNumber(id)}`);\n\n const caipAccountIds = account\n ? caipChainIds.map((caipChainId) => `${caipChainId}:${account}`)\n : [];\n\n this.#status = 'connecting';\n\n try {\n // Wait for the wallet_sessionChanged event to fire and set the provider properties\n const result = new Promise<{ accounts: Address[]; chainId: Hex }>(\n (resolve) => {\n this.#provider.once('connect', ({ chainId, accounts }) => {\n logger('fulfilled-request: connect', {\n chainId,\n accounts,\n });\n resolve({\n accounts,\n chainId,\n });\n });\n },\n );\n\n await this.#core.connect(\n caipChainIds as Scope[],\n caipAccountIds as CaipAccountId[],\n CONNECT_EVM_SESSION_PROPERTIES,\n forceRequest,\n );\n\n // Await here so the finally block always runs after #onSessionChanged\n // has consumed #pendingPreferredChainId, not before.\n return await result;\n } catch (error) {\n this.#status = 'disconnected';\n logger('Error connecting to wallet', error);\n throw error;\n } finally {\n this.#pendingPreferredChainId = undefined;\n }\n }\n\n /**\n * Connects to the wallet and signs a message using personal_sign.\n *\n * @param options - The connection options\n * @param options.message - The message to sign after connecting\n * @param [options.chainIds] - Optional hex chain IDs to connect to (defaults to ethereum mainnet if not provided)\n * @returns A promise that resolves with the connected accounts, chainId, and signature\n * @throws Error if the selected account is not available after timeout\n */\n async connectAndSign({\n message,\n chainIds,\n }: {\n message: string;\n chainIds?: Hex[];\n }): Promise<{ accounts: Address[]; chainId: Hex; signature: string }> {\n const { accounts, chainId } = await this.connect({\n chainIds: chainIds ?? [DEFAULT_CHAIN_ID],\n });\n\n const signature = (await this.#provider.request({\n method: 'personal_sign',\n params: [accounts[0], message],\n })) as string;\n\n this.#eventHandlers?.connectAndSign?.({\n accounts,\n chainId,\n signature,\n });\n\n return { accounts, chainId, signature };\n }\n\n /**\n * Connects to the wallet and invokes a method with specified parameters.\n *\n * @param options - The options for connecting and invoking the method\n * @param options.method - The method name to invoke\n * @param options.params - The parameters to pass to the method, or a function that receives the account and returns params\n * @param [options.chainIds] - Optional hex chain IDs to connect to (defaults to ethereum mainnet if not provided)\n * @param [options.account] - Optional specific account to connect to\n * @param [options.forceRequest] - Whether to force a request regardless of an existing session\n * @returns A promise that resolves with the connected accounts, chainId, and the result of the method invocation\n * @throws Error if the selected account is not available after timeout (for methods that require an account)\n */\n async connectWith({\n method,\n params,\n chainIds,\n account,\n forceRequest,\n }: {\n method: string;\n params: unknown[] | ((account: Address) => unknown[]);\n chainIds?: Hex[];\n account?: string | undefined;\n forceRequest?: boolean;\n }): Promise<{ accounts: Address[]; chainId: Hex; result: unknown }> {\n const { accounts: connectedAccounts, chainId: connectedChainId } =\n await this.connect({\n chainIds: chainIds ?? [DEFAULT_CHAIN_ID],\n account,\n forceRequest,\n });\n\n const resolvedParams =\n typeof params === 'function' ? params(connectedAccounts[0]) : params;\n\n const result = await this.#provider.request({\n method,\n params: resolvedParams,\n });\n\n this.#eventHandlers?.connectWith?.({\n accounts: connectedAccounts,\n chainId: connectedChainId,\n result,\n });\n\n return { accounts: connectedAccounts, chainId: connectedChainId, result };\n }\n\n /**\n * Disconnects from the wallet by revoking the session and cleaning up event listeners.\n *\n * @returns A promise that resolves when disconnection is complete\n */\n async disconnect(): Promise<void> {\n logger('request: disconnect');\n\n const sessionScopes = this.#sessionScopes;\n const eip155Scopes = Object.keys(sessionScopes).filter((scope) => {\n const { namespace } = parseScopeString(scope as Scope);\n return namespace === 'eip155';\n });\n\n await this.#core.disconnect(eip155Scopes as Scope[]);\n this.#onDisconnect();\n this.#clearConnectionState();\n\n // Note: We intentionally do NOT remove the display_uri and wallet_sessionChanged\n // listeners here. These are instance-scoped listeners that should remain active\n // for the lifetime of the SDK instance, allowing reconnection to work properly.\n // Session-scoped listeners (like the notification handler below) are removed.\n\n this.#removeNotificationHandler?.();\n this.#removeNotificationHandler = undefined;\n\n logger('fulfilled-request: disconnect');\n }\n\n /**\n * Switches the Ethereum chain. Will track state internally whenever possible.\n *\n * @param options - The options for the switch chain request\n * @param options.chainId - The chain ID to switch to\n * @param [options.chainConfiguration] - The chain configuration to use in case the chain is not present by the wallet\n * @returns A promise that resolves when the chain has been switched\n */\n async switchChain({\n chainId,\n chainConfiguration,\n }: {\n chainId: Hex;\n chainConfiguration?: AddEthereumChainParameter;\n }): Promise<void> {\n const method = 'wallet_switchEthereumChain';\n const scope: Scope = `eip155:${hexToNumber(chainId)}`;\n const params = [{ chainId }];\n\n // TODO (wenfix): better way to return here other than resolving.\n if (this.selectedChainId === chainId) {\n return Promise.resolve();\n }\n\n const permittedChainIds = getPermittedEthChainIds(this.#sessionScopes);\n\n if (\n permittedChainIds.includes(chainId) &&\n this.#core.transportType === TransportType.MWP\n ) {\n await this.#cacheChainId(chainId);\n this.#onChainChanged(chainId);\n return Promise.resolve();\n }\n\n await this.#trackWalletActionRequested(method, scope, params);\n\n try {\n const result = await this.#request({\n scope,\n method: 'wallet_switchEthereumChain',\n params,\n });\n\n await this.#trackWalletActionSucceeded(method, scope, params);\n if (result === null) {\n // result is successful we eagerly call onChainChanged to update the provider's selected chain ID.\n await this.#cacheChainId(chainId);\n this.#onChainChanged(chainId);\n }\n return Promise.resolve();\n } catch (error) {\n await this.#trackWalletActionFailed(method, scope, params, error);\n const isChainMissingInWallet = (error as Error).message.includes(\n 'Unrecognized chain ID',\n );\n if (isChainMissingInWallet && chainConfiguration) {\n return this.#addEthereumChain(chainConfiguration);\n }\n throw error;\n }\n }\n\n /**\n * Handles several EIP-1193 requests that require special handling\n * due the nature of the Multichain SDK.\n *\n * @param request - The request object containing the method and params\n * @returns The result of the request or undefined if the request is ignored\n */\n async #requestInterceptor(\n request: ProviderRequest,\n ): ReturnType<ProviderRequestInterceptor> {\n logger(`Intercepting request for method: ${request.method}`);\n\n if (IGNORED_METHODS.includes(request.method)) {\n // TODO: replace with correct method unsupported provider error\n return Promise.reject(\n new Error(\n `Method: ${request.method} is not supported by Metamask Connect/EVM`,\n ),\n );\n }\n\n if (request.method === 'wallet_revokePermissions') {\n return this.disconnect();\n }\n\n if (isConnectRequest(request)) {\n // When calling wallet_requestPermissions, we need to force a new session request to prompt\n // the user for accounts, because internally the Multichain SDK will check if\n // the user is already connected and skip the request if so, unless we\n // explicitly request a specific account. This is needed to workaround\n // wallet_requestPermissions not requesting specific accounts.\n const shouldForceConnectionRequest =\n request.method === 'wallet_requestPermissions';\n\n const { method, params } = request;\n const permitted = getPermittedEthChainIds(this.#sessionScopes);\n if (permitted.length === 0) {\n permitted.push(DEFAULT_CHAIN_ID);\n }\n\n const selected = this.#provider.selectedChainId;\n const preferred =\n selected && permitted.includes(selected) ? selected : permitted[0];\n\n const chainIds = [\n preferred,\n ...permitted.filter((id) => id !== preferred),\n ];\n\n const scope: Scope = `eip155:${hexToNumber(preferred)}`;\n\n await this.#trackWalletActionRequested(method, scope, params);\n\n try {\n const result = await this.connect({\n chainIds,\n forceRequest: shouldForceConnectionRequest,\n });\n await this.#trackWalletActionSucceeded(method, scope, params);\n if (request.method === 'eth_requestAccounts') {\n return result.accounts;\n }\n if (request.method === 'wallet_requestPermissions') {\n return getRequestedPermissions({\n accounts: result.accounts,\n chainIds: getPermittedEthChainIds(this.#sessionScopes),\n invoker: getDappInvoker(this.#getCoreOptions()),\n });\n }\n return result;\n } catch (error) {\n await this.#trackWalletActionFailed(method, scope, params, error);\n throw error;\n }\n }\n\n if (isSwitchChainRequest(request)) {\n await this.switchChain({\n chainId: request.params[0].chainId as Hex,\n });\n return null;\n }\n\n if (isAddChainRequest(request)) {\n await this.#addEthereumChain(request.params[0]);\n return null;\n }\n\n if (isAccountsRequest(request)) {\n if (request.method === 'eth_coinbase') {\n return this.#provider.selectedAccount ?? null;\n }\n return this.#provider.accounts;\n }\n\n if (isChainIdRequest(request)) {\n return this.#provider.selectedChainId;\n }\n\n logger('Request not intercepted, forwarding to default handler', request);\n return Promise.resolve();\n }\n\n /**\n * Clears the internal connection state: accounts and chainId\n */\n #clearConnectionState(): void {\n this.#provider.accounts = [];\n this.#provider.selectedChainId = undefined;\n }\n\n /**\n * Adds an Ethereum chain using the latest chain configuration received from\n * a switchEthereumChain request\n *\n * @param chainConfiguration - The chain configuration to use in case the chain is not present by the wallet\n * @returns Nothing\n */\n async #addEthereumChain(\n chainConfiguration?: AddEthereumChainParameter,\n ): Promise<void> {\n logger('addEthereumChain called', { chainConfiguration });\n const method = 'wallet_addEthereumChain';\n\n if (!chainConfiguration) {\n throw new Error('No chain configuration found.');\n }\n\n // Get chain ID from config or use current chain\n const chainId =\n (chainConfiguration.chainId as Hex) ||\n this.#provider.selectedChainId ||\n '0x1';\n const decimalChainId = hexToNumber(chainId);\n const scope: Scope = `eip155:${decimalChainId}`;\n const params = [chainConfiguration];\n\n await this.#trackWalletActionRequested(method, scope, params);\n\n try {\n const result = await this.#request({\n scope,\n method: 'wallet_addEthereumChain',\n params,\n });\n\n if (result === null) {\n // if result is successful we eagerly call onChainChanged to update the provider's selected chain ID.\n await this.#cacheChainId(chainId);\n this.#onChainChanged(chainId);\n }\n await this.#trackWalletActionSucceeded(method, scope, params);\n } catch (error) {\n await this.#trackWalletActionFailed(method, scope, params, error);\n throw error;\n }\n }\n\n /**\n * Submits an EIP-1193 passthrough request to the wallet via the multichain\n * client. The multichain `invokeMethod` dispatcher recognizes the method as a\n * passthrough and forwards the raw `{ method, params }` payload to the\n * underlying transport's `sendEip1193Message`, bypassing the\n * `wallet_invokeMethod` envelope. The router unwraps the JSON-RPC envelope\n * before returning, so the resolved value is the raw `result` (e.g. `null` for\n * a successful `wallet_switchEthereumChain`, an accounts array for\n * `eth_accounts`).\n *\n * @param request - The request object containing the scope, method, and params\n * @param request.scope - CAIP scope used for analytics/routing context\n * @param request.method - The method to request\n * @param request.params - The parameters to pass to the method\n * @returns The wallet's raw RPC result (envelope already unwrapped).\n */\n async #request(request: {\n scope: Scope;\n method: string;\n params: unknown[];\n }): Promise<unknown> {\n logger('direct request to metamask-provider called', request);\n const result = this.#core.invokeMethod({\n scope: request.scope,\n request: { method: request.method, params: request.params },\n });\n if (\n request.method === 'wallet_addEthereumChain' ||\n request.method === 'wallet_switchEthereumChain'\n ) {\n this.#core.openSimpleDeeplinkIfNeeded();\n }\n return result;\n }\n\n /**\n * Caches the chainId to storage for persistence across page refreshes.\n *\n * @param chainId - The hex chain ID\n */\n async #cacheChainId(chainId: Hex): Promise<void> {\n try {\n await this.#core.storage.adapter.set(\n CHAIN_STORE_KEY,\n JSON.stringify(chainId),\n );\n } catch (error) {\n logger('Error caching chainId', error);\n }\n }\n\n async #onSessionChanged(session?: SessionData): Promise<void> {\n logger('event: wallet_sessionChanged', session);\n this.#sessionScopes = session?.sessionScopes ?? {};\n const hexPermittedChainIds = getPermittedEthChainIds(this.#sessionScopes);\n if (hexPermittedChainIds.length === 0) {\n this.#onDisconnect();\n } else {\n let initialAccounts: Address[] = [];\n if (this.#core.status === 'connected') {\n // `eth_accounts` is registered as an EIP-1193 passthrough on the multichain\n // client, so this routes through `transport.sendEip1193Message` rather than\n // the `wallet_invokeMethod` envelope. The router unwraps the JSON-RPC\n // envelope for passthrough methods and returns just the raw `result`\n // value. Scope is informational here; the first permitted chain is used\n // for analytics context.\n initialAccounts = (await this.#core.invokeMethod({\n scope: `eip155:${hexToNumber(hexPermittedChainIds[0])}` as Scope,\n request: { method: 'eth_accounts', params: [] },\n })) as Address[];\n } else {\n initialAccounts = getEthAccounts(this.#sessionScopes);\n }\n\n const chainId = await this.#getSelectedChainId(hexPermittedChainIds);\n\n this.#onConnect({\n chainId,\n accounts: initialAccounts,\n });\n }\n }\n\n /**\n * Handles chain change events and updates the provider's selected chain ID.\n *\n * @param chainId - The new hex chain ID\n */\n #onChainChanged(chainId: Hex): void {\n if (chainId === this.#provider.selectedChainId) {\n return;\n }\n logger('handler: chainChanged', { chainId });\n this.#provider.selectedChainId = chainId;\n this.#provider.emit('chainChanged', chainId);\n this.#eventHandlers?.chainChanged?.(chainId);\n }\n\n /**\n * Handles accounts change events and updates the provider's accounts list.\n *\n * @param accounts - The new list of permitted accounts\n */\n #onAccountsChanged(accounts: Address[]): void {\n const accountsUnchanged =\n accounts.length === this.#provider.accounts.length &&\n accounts.every((acct, idx) => acct === this.#provider.accounts[idx]);\n if (accountsUnchanged) {\n return;\n }\n logger('handler: accountsChanged', accounts);\n this.#provider.accounts = accounts;\n this.#provider.emit('accountsChanged', accounts);\n this.#eventHandlers?.accountsChanged?.(accounts);\n }\n\n /**\n * Handles connection events and emits the connect event to listeners.\n *\n * @param options - The connection options\n * @param options.chainId - The hex chain ID of the connection\n * @param options.accounts - The accounts of the connection\n */\n #onConnect({\n chainId,\n accounts,\n }: {\n chainId: Hex;\n accounts: Address[];\n }): void {\n logger('handler: connect', { chainId, accounts });\n const data = {\n chainId,\n accounts,\n };\n\n if (this.#status === 'connected') {\n this.#onChainChanged(chainId);\n this.#onAccountsChanged(accounts);\n return;\n }\n\n this.#provider.selectedChainId = chainId;\n this.#provider.accounts = accounts;\n\n this.#status = 'connected';\n this.#provider.emit('connect', data);\n this.#eventHandlers?.connect?.(data);\n\n this.#provider.emit('chainChanged', chainId);\n this.#eventHandlers?.chainChanged?.(chainId);\n\n this.#provider.emit('accountsChanged', accounts);\n this.#eventHandlers?.accountsChanged?.(accounts);\n\n this.#removeNotificationHandler?.();\n\n const onAccountsChanged = (accs: string[]): void => {\n logger('core-event: accountsChanged', accs);\n this.#onAccountsChanged(accs as Address[]);\n };\n\n const onChainChanged = (chainChanged: { chainId: string }): void => {\n logger('core-event: chainChanged', chainChanged.chainId);\n this.#cacheChainId(chainChanged.chainId as Hex).catch((error) => {\n logger('Error caching chainId in notification handler', error);\n });\n this.#onChainChanged(chainChanged.chainId as Hex);\n };\n\n this.#core.on('metamask_accountsChanged', onAccountsChanged);\n this.#core.on('metamask_chainChanged', onChainChanged);\n\n this.#removeNotificationHandler = (): void => {\n this.#core.off('metamask_accountsChanged', onAccountsChanged);\n this.#core.off('metamask_chainChanged', onChainChanged);\n };\n }\n\n /**\n * Handles disconnection events and emits the disconnect event to listeners.\n * Also clears accounts by triggering an accountsChanged event with an empty array.\n */\n #onDisconnect(): void {\n if (this.#status === 'disconnected') {\n return;\n }\n this.#status = 'disconnected';\n\n logger('handler: disconnect');\n this.#provider.emit('disconnect');\n this.#eventHandlers?.disconnect?.();\n\n this.#onAccountsChanged([]);\n }\n\n /**\n * Handles display_uri events and emits them to the provider.\n * This allows consumers to display their own custom QR code UI.\n *\n * @param uri - The deeplink URI to be displayed as a QR code\n */\n #onDisplayUri(uri: string): void {\n if (this.#status !== 'connecting') {\n return;\n }\n\n logger('handler: display_uri', uri);\n this.#provider.emit('display_uri', uri);\n this.#eventHandlers?.displayUri?.(uri);\n }\n\n /**\n * Gets the EIP-1193 provider instance\n *\n * @returns The EIP-1193 provider instance\n */\n getProvider(): EIP1193Provider {\n return this.#provider;\n }\n\n /**\n * Announces the EIP-1193 provider through EIP-6963 wallet discovery.\n *\n * This is a no-op when a native MetaMask EIP-6963 provider has already\n * announced, or when running outside a browser environment. The first call\n * may take up to 300 ms while native providers are requested.\n */\n async announceProvider(): Promise<void> {\n await this.#eip6963Announcer.announce();\n }\n\n /**\n * Gets the currently selected chain ID on the wallet\n *\n * @returns The currently selected chain ID or undefined if no chain is selected\n */\n getChainId(): Hex | undefined {\n return this.selectedChainId;\n }\n\n /**\n * Gets the currently selected account on the wallet\n *\n * @returns The currently selected account or undefined if no account is selected\n */\n getAccount(): Address | undefined {\n return this.#provider.selectedAccount;\n }\n\n // Convenience getters for the EIP-1193 provider\n /**\n * Gets the currently permitted accounts\n *\n * @returns The currently permitted accounts\n */\n get accounts(): Address[] {\n return this.#provider.accounts;\n }\n\n /**\n * Gets the currently selected account on the wallet\n *\n * @returns The currently selected account or undefined if no account is selected\n */\n get selectedAccount(): Address | undefined {\n return this.#provider.selectedAccount;\n }\n\n /**\n * Gets the currently selected chain ID on the wallet\n *\n * @returns The currently selected chain ID or undefined if no chain is selected\n */\n get selectedChainId(): Hex | undefined {\n return this.#provider.selectedChainId;\n }\n\n /**\n * Gets the current connection status\n *\n * @returns The current connection status\n */\n get status(): ConnectEvmStatus {\n return this.#status;\n }\n}\n\n/**\n * Creates a new Metamask Connect/EVM instance\n *\n * @param options - The options for the Metamask Connect/EVM layer\n * @param options.dapp - Dapp identification and branding settings\n * @param options.api - API configuration including read-only RPC map\n * @param options.api.supportedNetworks - A map of hex chain IDs to RPC URLs for read-only requests\n * @param [options.analytics.enabled] - Whether to enable dapp-side analytics (defaults to true)\n * @param [options.analytics.integrationType] - Integration type for analytics\n * @param [options.ui] - UI configuration options\n * @param [options.ui.headless] - Whether to run without UI\n * @param [options.ui.preferExtension] - Whether to prefer browser extension\n * @param [options.ui.showInstallModal] - Whether to render installation modal for desktop extension\n * @param [options.mobile] - Mobile configuration options\n * @param [options.mobile.preferredOpenLink] - Custom handler for opening deeplinks (useful for React Native, etc.)\n * @param [options.mobile.useDeeplink] - Whether to use native deeplinks instead of universal links\n * @param [options.transport] - Transport configuration (e.g., extensionId)\n * @param [options.transport.extensionId] - Extension ID for browser extension transport\n * @param [options.eventHandlers] - Event handlers for the Metamask Connect/EVM layer\n * @param [options.debug] - Enable debug logging\n * @param [options.skipAutoAnnounce] - Skip automatic EIP-6963 provider announcement\n * @returns The Metamask-Connect EVM client instance\n */\nexport async function createEVMClient(\n options: Pick<\n MultichainOptions,\n 'dapp' | 'mobile' | 'transport' | 'analytics'\n > & {\n ui?: Omit<MultichainOptions['ui'], 'factory'>;\n } & {\n eventHandlers?: Partial<EventHandlers>;\n debug?: boolean;\n skipAutoAnnounce?: boolean;\n api: {\n supportedNetworks: Record<Hex, string>;\n };\n },\n): Promise<MetamaskConnectEVM> {\n if (options.debug) {\n enableDebug();\n }\n\n logger('Creating Metamask Connect/EVM with options:', options);\n\n // Validate that supportedNetworks is provided and not empty\n if (\n !options.api?.supportedNetworks ||\n Object.keys(options.api.supportedNetworks).length === 0\n ) {\n throw new Error(\n 'supportedNetworks is required and must contain at least one chain configuration',\n );\n }\n\n validSupportedChainsUrls(options.api.supportedNetworks, 'supportedNetworks');\n\n const supportedNetworksCaipChainId = Object.entries(\n options.api.supportedNetworks,\n ).reduce<Record<string, string>>((acc, [hexChainId, url]) => {\n const decimalChainId = parseInt(hexChainId, 16);\n const caip2ChainId = `eip155:${decimalChainId}`;\n acc[caip2ChainId] = url;\n return acc;\n }, {});\n\n try {\n const core = await createMultichainClient({\n ...options,\n api: {\n supportedNetworks: supportedNetworksCaipChainId,\n },\n analytics: {\n ...(options.analytics ?? {}),\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n integrationType: options.analytics?.integrationType || 'direct',\n },\n versions: {\n // typeof guard needed: Metro (React Native) bundles TS source directly,\n // bypassing the tsup build that substitutes __PACKAGE_VERSION__.\n 'connect-evm':\n typeof __PACKAGE_VERSION__ === 'undefined'\n ? 'unknown'\n : __PACKAGE_VERSION__,\n },\n });\n\n const multichainClientPeerRange =\n typeof __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__ === 'undefined'\n ? 'unknown'\n : __CONNECT_MULTICHAIN_PEER_VERSION_RANGE__;\n\n if (\n multichainClientPeerRange !== 'unknown' &&\n multichainClientPeerRange !== '' &&\n !satisfies(core.version, multichainClientPeerRange)\n ) {\n console.warn(\n `@metamask/connect-evm expected @metamask/connect-multichain version ${multichainClientPeerRange}, but got ${core.version}. This may lead to unexpected behavior.`,\n );\n }\n\n const client = await MetamaskConnectEVM.create({\n core,\n eventHandlers: options.eventHandlers,\n supportedNetworks: options.api.supportedNetworks,\n });\n\n if (!options.skipAutoAnnounce) {\n client.announceProvider().catch((error) => {\n logger('EIP-6963 provider announcement failed', error);\n });\n }\n\n return client;\n } catch (error) {\n console.error('Error creating Metamask Connect/EVM', error);\n throw error;\n }\n}\n","export const IGNORED_METHODS = [\n 'metamask_getProviderState',\n 'metamask_sendDomainMetadata',\n 'metamask_logWeb3ShimUsage',\n 'wallet_registerOnboarding',\n 'net_version',\n 'wallet_getPermissions',\n];\n\nexport const CONNECT_METHODS = [\n 'wallet_requestPermissions',\n 'eth_requestAccounts',\n];\n\nexport const ACCOUNTS_METHODS = ['eth_accounts', 'eth_coinbase'];\n\nexport const CHAIN_METHODS = ['eth_chainId'];\n\nexport const INTERCEPTABLE_METHODS = [\n ...ACCOUNTS_METHODS,\n ...IGNORED_METHODS,\n ...CONNECT_METHODS,\n ...CHAIN_METHODS,\n // These have bespoke handlers\n 'wallet_revokePermissions',\n 'wallet_switchEthereumChain',\n 'wallet_addEthereumChain',\n];\n\n/**\n * Session property key used to signal that the connection originated from an\n * EIP-1193-compatible client (i.e. `@metamask/connect-evm`).\n *\n * Wallets receiving a `wallet_createSession` request can use this property to\n * apply EIP-1193-specific UX (e.g. rendering a network picker on the dapp\n * connection bar) that does not apply to pure Multichain API connections or\n * other provider types like Solana Wallet Standard.\n */\nexport const EIP1193_COMPATIBLE_SESSION_PROPERTY = 'eip1193-compatible';\n\n/**\n * Session properties sent on every `wallet_createSession` request issued by\n * `@metamask/connect-evm` to identify the connection as EIP-1193-compatible.\n */\nexport const CONNECT_EVM_SESSION_PROPERTIES = {\n [EIP1193_COMPATIBLE_SESSION_PROPERTY]: true,\n} as const;\n","import {\n createLogger,\n enableDebug as debug,\n} from '@metamask/connect-multichain';\n\nconst namespace = 'metamask-connect:evm';\n\n// @ts-expect-error logger needs to be typed properly\nexport const logger = createLogger(namespace, '63');\n\nexport const enableDebug = (): void => {\n // @ts-expect-error logger needs to be typed properly\n debug(namespace);\n};\n","import metamaskFoxIcon from './assets/metamask-fox.svg';\nimport { logger } from './logger';\nimport type { EIP1193Provider } from './provider';\n\n/**\n * EIP-6963 event name wallets use to announce providers to dapps.\n */\nexport const EIP6963_ANNOUNCE_PROVIDER_EVENT = 'eip6963:announceProvider';\n\n/**\n * EIP-6963 event name dapps dispatch to request wallet re-announcements.\n */\nexport const EIP6963_REQUEST_PROVIDER_EVENT = 'eip6963:requestProvider';\n\n/**\n * Time to wait after requesting EIP-6963 providers before deciding whether a\n * native MetaMask provider is present.\n */\nexport const EIP6963_DETECTION_TIMEOUT_MS = 300;\n\n/**\n * Display name used for the MMConnect-managed MetaMask EIP-6963 provider.\n */\nexport const CONNECT_EVM_EIP6963_NAME = 'MetaMask';\n\n/**\n * Reverse-DNS identifier used for the MMConnect-managed MetaMask EIP-6963 provider.\n */\nexport const CONNECT_EVM_EIP6963_RDNS = 'io.metamask.mmc';\n\n/**\n * Native MetaMask EIP-6963 identifiers that should suppress SDK announcement.\n */\nexport const METAMASK_EIP6963_RDNS = [\n 'io.metamask',\n 'io.metamask.mobile',\n] as const;\n\n/**\n * Icon URI used for the MMConnect-managed MetaMask EIP-6963 provider.\n */\nexport const CONNECT_EVM_EIP6963_ICON = metamaskFoxIcon;\n\n/**\n * EIP-6963 provider metadata announced to dapps.\n */\nexport type EIP6963ProviderInfo = {\n /** Globally unique identifier for this provider instance. */\n uuid: string;\n /** Human-readable wallet name shown in wallet pickers. */\n name: string;\n /** Wallet icon URI. EIP-6963 requires a URI value. */\n icon: string;\n /** Reverse-DNS identifier for the wallet/provider. */\n rdns: string;\n};\n\n/**\n * EIP-6963 announcement payload containing wallet metadata and provider.\n */\nexport type EIP6963ProviderDetail = {\n /** Metadata wallet pickers use for display and deduplication. */\n info: EIP6963ProviderInfo;\n /** EIP-1193 provider exposed by this SDK instance. */\n provider: EIP1193Provider;\n};\n\n/**\n * Gets the current browser window when EIP-6963 events can be used.\n *\n * This intentionally uses the current `window`; it does not attempt to bridge\n * to `window.top`. EIP-6963 discovery is scoped to the frame where the SDK is\n * running.\n *\n * @returns The current browser window, or undefined outside a browser context.\n */\nconst getBrowserWindow = (): Window | undefined => {\n const { window: browserWindow } = globalThis;\n return typeof browserWindow?.dispatchEvent === 'function'\n ? browserWindow\n : undefined;\n};\n\nconst delay = async (ms: number): Promise<void> =>\n await new Promise((resolve) => setTimeout(resolve, ms));\n\nconst isNativeMetaMaskRdns = (rdns: string): boolean =>\n METAMASK_EIP6963_RDNS.some((nativeRdns) => nativeRdns === rdns);\n\nconst getAnnouncementRdns = (event: Event): string | undefined => {\n const { detail } = event as CustomEvent<Partial<EIP6963ProviderDetail>>;\n const rdns = detail?.info?.rdns;\n\n return typeof rdns === 'string' ? rdns : undefined;\n};\n\nconst UUID_BYTE_TO_HEX = Array.from({ length: 256 }, (_, byte) =>\n byte.toString(16).padStart(2, '0'),\n);\n\n/**\n * Formats random bytes as an RFC 4122 version 4 UUID.\n *\n * @param bytes - Random bytes from a cryptographically secure source.\n * @returns A UUID string.\n */\nconst formatUuidV4 = (bytes: Uint8Array): string => {\n bytes[6] = (bytes[6] % 16) + 64;\n bytes[8] = (bytes[8] % 64) + 128;\n\n return [\n UUID_BYTE_TO_HEX[bytes[0]],\n UUID_BYTE_TO_HEX[bytes[1]],\n UUID_BYTE_TO_HEX[bytes[2]],\n UUID_BYTE_TO_HEX[bytes[3]],\n '-',\n UUID_BYTE_TO_HEX[bytes[4]],\n UUID_BYTE_TO_HEX[bytes[5]],\n '-',\n UUID_BYTE_TO_HEX[bytes[6]],\n UUID_BYTE_TO_HEX[bytes[7]],\n '-',\n UUID_BYTE_TO_HEX[bytes[8]],\n UUID_BYTE_TO_HEX[bytes[9]],\n '-',\n UUID_BYTE_TO_HEX[bytes[10]],\n UUID_BYTE_TO_HEX[bytes[11]],\n UUID_BYTE_TO_HEX[bytes[12]],\n UUID_BYTE_TO_HEX[bytes[13]],\n UUID_BYTE_TO_HEX[bytes[14]],\n UUID_BYTE_TO_HEX[bytes[15]],\n ].join('');\n};\n\n/**\n * Creates a UUID for the EIP-6963 provider identity.\n *\n * Requires Web Crypto. EIP-6963 discovery is browser-only, and unsupported\n * browsers should fail this best-effort announcement path rather than receive a\n * weak UUID.\n *\n * @returns A UUID string.\n */\nconst createUuid = (): string => {\n const { crypto: cryptoProvider } = globalThis;\n\n if (cryptoProvider?.randomUUID) {\n return cryptoProvider.randomUUID();\n }\n\n if (cryptoProvider?.getRandomValues) {\n const bytes = new Uint8Array(16);\n cryptoProvider.getRandomValues(bytes);\n return formatUuidV4(bytes);\n }\n\n throw new Error('Web Crypto API is required for EIP-6963 announcement');\n};\n\n/**\n * Creates a DOM custom event with an EIP-6963 announcement payload.\n *\n * @param detail - The provider announcement detail.\n * @returns A custom event containing the announcement detail.\n */\nconst createAnnouncementEvent = (\n detail: Readonly<EIP6963ProviderDetail>,\n): CustomEvent<Readonly<EIP6963ProviderDetail>> => {\n const { CustomEvent: CustomEventConstructor } = globalThis;\n return new CustomEventConstructor(EIP6963_ANNOUNCE_PROVIDER_EVENT, {\n detail,\n });\n};\n\n/**\n * Creates a DOM event requesting EIP-6963 providers to re-announce.\n *\n * @returns A request-provider event.\n */\nconst createRequestProviderEvent = (): Event => {\n const { Event: EventConstructor } = globalThis;\n return new EventConstructor(EIP6963_REQUEST_PROVIDER_EVENT);\n};\n\n/**\n * Creates immutable metadata for one SDK provider identity.\n *\n * @returns Provider metadata for EIP-6963 announcement.\n */\nconst createProviderInfo = (): Readonly<EIP6963ProviderInfo> =>\n Object.freeze({\n uuid: createUuid(),\n name: CONNECT_EVM_EIP6963_NAME,\n icon: CONNECT_EVM_EIP6963_ICON,\n rdns: CONNECT_EVM_EIP6963_RDNS,\n });\n\n/**\n * Checks whether native MetaMask has already announced through EIP-6963.\n *\n * The listener is installed before dispatching `requestProvider` so wallets\n * that announce synchronously in response to the request are observed.\n *\n * @returns True when a native MetaMask provider rdns was observed.\n */\nconst hasNativeMetaMaskProvider = async (): Promise<boolean> => {\n const browserWindow = getBrowserWindow();\n if (!browserWindow) {\n return false;\n }\n\n const announcedRdns = new Set<string>();\n const handler = (event: Event): void => {\n const rdns = getAnnouncementRdns(event);\n if (rdns) {\n announcedRdns.add(rdns);\n }\n };\n\n browserWindow.addEventListener(EIP6963_ANNOUNCE_PROVIDER_EVENT, handler);\n try {\n browserWindow.dispatchEvent(createRequestProviderEvent());\n await delay(EIP6963_DETECTION_TIMEOUT_MS);\n } finally {\n browserWindow.removeEventListener(EIP6963_ANNOUNCE_PROVIDER_EVENT, handler);\n }\n\n return [...announcedRdns].some(isNativeMetaMaskRdns);\n};\n\n/**\n * Announces an MMConnect-managed EIP-1193 provider through EIP-6963.\n *\n * Announcement is best-effort and browser-only. Native MetaMask providers with\n * `io.metamask` or `io.metamask.mobile` suppress this SDK provider to avoid\n * duplicate MetaMask entries in wallet pickers.\n */\nexport class EIP6963ProviderAnnouncer {\n /** EIP-1193 provider exposed in EIP-6963 announcements. */\n readonly #provider: EIP1193Provider;\n\n /** Stable announcement payload for this SDK provider instance. */\n #detail?: Readonly<EIP6963ProviderDetail>;\n\n /** Whether native MetaMask detection already suppressed this provider. */\n #suppressed = false;\n\n /** Listener used to re-announce the SDK provider on future requests. */\n #requestHandler?: () => void;\n\n /** In-flight announcement detection promise, shared by concurrent calls. */\n #announcementPromise?: Promise<void>;\n\n /**\n * Creates an EIP-6963 announcer for one SDK provider instance.\n *\n * @param provider - EIP-1193 provider to announce.\n */\n constructor(provider: EIP1193Provider) {\n this.#provider = provider;\n }\n\n /**\n * Announces the SDK provider unless native MetaMask has already announced.\n *\n * Repeated calls are idempotent: once announced, this re-dispatches the same\n * provider detail and does not install duplicate request listeners. The first\n * call may take up to `EIP6963_DETECTION_TIMEOUT_MS` while native providers\n * are requested.\n *\n * @returns A promise that resolves once detection and any announcement finish.\n */\n async announce(): Promise<void> {\n try {\n if (this.#suppressed) {\n return;\n }\n\n if (this.#detail) {\n this.#dispatchAnnouncement();\n return;\n }\n\n if (!this.#announcementPromise) {\n this.#announcementPromise = this.#announceOnce()\n .catch((error) => {\n logger('EIP-6963 provider announcement failed', error);\n })\n .finally(() => {\n this.#announcementPromise = undefined;\n });\n }\n\n await this.#announcementPromise;\n } catch (error) {\n logger('EIP-6963 provider announcement failed', error);\n }\n }\n\n /**\n * Performs the first announcement flow after native provider detection.\n */\n async #announceOnce(): Promise<void> {\n if (!getBrowserWindow()) {\n return;\n }\n\n if (await hasNativeMetaMaskProvider()) {\n logger('MetaMask EIP-6963 provider is already announced. Skipping...');\n this.#suppressed = true;\n return;\n }\n\n this.#detail = Object.freeze({\n info: createProviderInfo(),\n provider: this.#provider,\n });\n this.#installRequestProviderListener();\n this.#dispatchAnnouncement();\n }\n\n /**\n * Installs a single persistent EIP-6963 request listener for re-announcement.\n */\n #installRequestProviderListener(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || this.#requestHandler) {\n return;\n }\n\n this.#requestHandler = (): void => {\n try {\n this.#dispatchAnnouncement();\n } catch (error) {\n logger('EIP-6963 provider announcement failed', error);\n }\n };\n browserWindow.addEventListener(\n EIP6963_REQUEST_PROVIDER_EVENT,\n this.#requestHandler,\n );\n }\n\n /**\n * Dispatches the current provider detail through EIP-6963.\n */\n #dispatchAnnouncement(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || !this.#detail) {\n return;\n }\n\n browserWindow.dispatchEvent(createAnnouncementEvent(this.#detail));\n }\n}\n","/* eslint-disable promise/always-return -- Legacy callback patterns */\n/* eslint-disable promise/no-callback-in-promise -- Legacy sendAsync/send API */\n/* eslint-disable consistent-return -- Legacy method returns void or Promise */\n/* eslint-disable @typescript-eslint/no-floating-promises -- Legacy fire-and-forget pattern */\n/* eslint-disable jsdoc/require-returns -- Inherited from abstract class */\nimport type { MultichainCore, Scope } from '@metamask/connect-multichain';\nimport { EventEmitter, RPCInvokeMethodErr } from '@metamask/connect-multichain';\nimport { hexToNumber } from '@metamask/utils';\n\nimport { INTERCEPTABLE_METHODS } from './constants';\nimport { logger } from './logger';\nimport type {\n Address,\n EIP1193ProviderEvents,\n Hex,\n JsonRpcCallback,\n JsonRpcRequest,\n JsonRpcResponse,\n ProviderRequest,\n ProviderRequestInterceptor,\n} from './types';\n\n/**\n * EIP-1193 Provider wrapper around the Multichain SDK.\n */\nexport class EIP1193Provider extends EventEmitter<EIP1193ProviderEvents> {\n /** The core instance of the Multichain SDK */\n readonly #core: MultichainCore;\n\n /** Interceptor function to handle specific methods */\n readonly #requestInterceptor: ProviderRequestInterceptor;\n\n /** The currently permitted accounts */\n #accounts: Address[] = [];\n\n /** The currently selected chain ID on the wallet */\n #selectedChainId?: Hex | undefined;\n\n constructor(core: MultichainCore, interceptor: ProviderRequestInterceptor) {\n super();\n this.#core = core;\n this.#requestInterceptor = interceptor;\n\n // Bind all public methods to ensure `this` context is preserved\n // when methods are extracted or passed as callbacks.\n // This eliminates the need for Proxy wrappers in consumers.\n this.request = this.request.bind(this);\n this.sendAsync = this.sendAsync.bind(this);\n this.send = this.send.bind(this);\n\n // Bind inherited EventEmitter methods\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.emit = this.emit.bind(this);\n this.once = this.once.bind(this);\n this.removeListener = this.removeListener.bind(this);\n this.listenerCount = this.listenerCount.bind(this);\n }\n\n /**\n * Performs a EIP-1193 request.\n *\n * @param request - The request object containing the method and params\n * @returns The result of the request\n */\n async request(request: ProviderRequest): Promise<unknown> {\n logger(\n `request: ${request.method} - chainId: ${this.selectedChainId}`,\n request.params,\n );\n /* Some methods require special handling, so we intercept them here\n * and handle them in MetamaskConnectEVM.requestInterceptor method. */\n if (INTERCEPTABLE_METHODS.includes(request.method)) {\n return this.#requestInterceptor?.(request);\n }\n\n if (!this.#selectedChainId) {\n // TODO: replace with a better error\n throw new Error('No chain ID selected');\n }\n\n const decimalChainId = hexToNumber(this.#selectedChainId);\n const scope: Scope = `eip155:${decimalChainId}`;\n\n // Validate that the chain is configured in supportedNetworks\n // This check is performed here to provide better error messages\n // The RpcClient will also validate, but this gives us a chance to provide\n // a clearer error message before the request is routed\n const coreOptions = (this.#core as any).options; // TODO: options is `protected readonly` property, this needs to be refactored so `any` type assertion is not necessary\n const supportedNetworks = coreOptions?.api?.supportedNetworks ?? {};\n if (!supportedNetworks[scope]) {\n throw new Error(\n `Chain ${scope} is not configured in supportedNetworks. Requests cannot be made to chains not explicitly configured in supportedNetworks.`,\n );\n }\n\n try {\n return await this.#core.invokeMethod({\n scope,\n request: {\n method: request.method,\n params: request.params,\n },\n });\n } catch (error) {\n if (error instanceof RPCInvokeMethodErr && error.rpcCode !== undefined) {\n const invokeError = error;\n const rpcError = new Error(\n error.rpcMessage ?? error.reason,\n ) as Error & { code: number; data?: unknown };\n rpcError.code = error.rpcCode;\n if (invokeError.rpcData !== undefined) {\n rpcError.data = invokeError.rpcData;\n }\n throw rpcError;\n }\n throw error;\n }\n }\n\n // Getters and setters\n public get selectedAccount(): Address | undefined {\n return this.accounts[0];\n }\n\n public set accounts(accounts: Address[]) {\n this.#accounts = accounts;\n }\n\n public get accounts(): Address[] {\n return this.#accounts;\n }\n\n public get selectedChainId(): Hex | undefined {\n return this.#selectedChainId;\n }\n\n public set selectedChainId(chainId: Hex | undefined) {\n this.#selectedChainId = chainId;\n }\n\n // ==========================================\n // Legacy compatibility methods\n // ==========================================\n\n /**\n * Alias for selectedChainId for legacy compatibility.\n * Many dApps expect a `chainId` property on the provider.\n */\n public get chainId(): Hex | undefined {\n return this.selectedChainId;\n }\n\n /**\n * Legacy method for sending JSON-RPC requests.\n *\n * @deprecated Use `request` instead. This method is provided for backwards compatibility.\n * @param request - The JSON-RPC request object\n * @param callback - Optional callback function. If provided, the method returns void.\n * @returns A promise resolving to the JSON-RPC response, or void if a callback is provided.\n */\n async sendAsync<TParams = unknown, TResult = unknown>(\n request: JsonRpcRequest<TParams>,\n callback?: JsonRpcCallback<TResult>,\n ): Promise<JsonRpcResponse<TResult> | void> {\n const id = request.id ?? 1;\n\n const promise = this.request({\n method: request.method,\n params: request.params as unknown,\n })\n .then(\n (result): JsonRpcResponse<TResult> => ({\n id,\n jsonrpc: '2.0',\n result: result as TResult,\n }),\n )\n .catch(\n (error): JsonRpcResponse<TResult> => ({\n id,\n jsonrpc: '2.0',\n error: {\n code: error.code ?? -32603,\n message: error.message ?? 'Internal error',\n data: error.data,\n },\n }),\n );\n\n if (callback) {\n promise\n .then((response) => {\n if (response.error) {\n callback(new Error(response.error.message), response);\n } else {\n callback(null, response);\n }\n })\n .catch((error) => {\n callback(error, null);\n });\n return;\n }\n\n return promise;\n }\n\n /**\n * Legacy method for sending JSON-RPC requests synchronously (callback-based).\n *\n * @deprecated Use `request` instead. This method is provided for backwards compatibility.\n * @param request - The JSON-RPC request object\n * @param callback - The callback function to receive the response\n */\n send<TParams = unknown, TResult = unknown>(\n request: JsonRpcRequest<TParams>,\n callback: JsonRpcCallback<TResult>,\n ): void {\n this.sendAsync(request, callback);\n }\n}\n","// Inlined from `@metamask/chain-agnostic-permission@1.2.2` to avoid pulling\n// its transitive `controller-utils` / `lodash` / `bn.js` / `eth-ens-namehash`\n// chain into every consumer's `connect-evm` bundle (e.g. wagmi → LiFi).\n// Built on `@metamask/utils` primitives; semantics are identical to upstream.\n//\n// Upstream sources (pinned to commit `82aec7d`):\n// - `parseScopeString`: https://github.com/MetaMask/core/blob/82aec7d537f0cca3663c44c17e1560f6e00c9b8c/packages/chain-agnostic-permission/src/scope/types.ts#L93-L107\n// - `getEthAccounts`: https://github.com/MetaMask/core/blob/82aec7d537f0cca3663c44c17e1560f6e00c9b8c/packages/chain-agnostic-permission/src/operators/caip-permission-operator-accounts.ts#L77-L91\n// - `getPermittedEthChainIds`: https://github.com/MetaMask/core/blob/82aec7d537f0cca3663c44c17e1560f6e00c9b8c/packages/chain-agnostic-permission/src/operators/caip-permission-operator-permittedChains.ts#L43-L58\n//\n// If upstream changes semantics, mirror the change and bump the pinned commit.\n// Revisit if upstream ever splits `controller-utils` so the dep becomes cheap.\n\nimport type { SessionData } from '@metamask/connect-multichain';\nimport {\n isCaipChainId,\n isCaipNamespace,\n KnownCaipNamespace,\n parseCaipAccountId,\n parseCaipChainId,\n} from '@metamask/utils';\n\nimport type { Address, Hex } from '../types';\n\n/**\n * Result of parsing a CAIP scope string.\n */\ntype ParsedScope = {\n namespace?: string;\n reference?: string;\n};\n\n/**\n * Parses a CAIP-217 scope string (`namespace` or `namespace:reference`) into\n * its components. See file header for upstream reference.\n *\n * @param scopeString - The scope string to parse.\n * @returns An object containing `namespace` and (optionally) `reference`.\n * Returns an empty object if the input is neither a valid CAIP namespace nor\n * a valid CAIP-2 chain ID.\n */\nexport const parseScopeString = (scopeString: string): ParsedScope => {\n if (isCaipNamespace(scopeString)) {\n return { namespace: scopeString };\n }\n if (isCaipChainId(scopeString)) {\n return parseCaipChainId(scopeString);\n }\n return {};\n};\n\n/**\n * Returns true if the scope string is either an `eip155:*` chain scope or the\n * `wallet:eip155` cross-chain wallet scope.\n *\n * @param scopeString - The scope string to check.\n * @returns True if EIP-155-namespaced.\n */\nconst isEip155ScopeString = (scopeString: string): boolean => {\n const { namespace } = parseScopeString(scopeString);\n return (\n namespace === KnownCaipNamespace.Eip155 ||\n scopeString === `${KnownCaipNamespace.Wallet}:${KnownCaipNamespace.Eip155}`\n );\n};\n\n/**\n * Returns true if the value is a `0x`-prefixed strict hex string.\n *\n * @param value - The value to check.\n * @returns True if `value` matches `/^0x[0-9a-fA-F]+$/`.\n */\nconst isStrictHexString = (value: string): value is Hex =>\n /^0x[0-9a-fA-F]+$/u.test(value);\n\n/**\n * Converts a CAIP-2 EIP-155 `reference` (decimal string, e.g. `\"137\"`) into a\n * `0x`-prefixed hex chain ID. Tolerates already-hex inputs to mirror\n * `@metamask/controller-utils.toHex`. Uses `BigInt` so chain IDs larger than\n * `Number.MAX_SAFE_INTEGER` (e.g. some experimental chains) are handled\n * correctly.\n *\n * @param reference - The CAIP-2 reference component of an `eip155` scope.\n * @returns The reference as a `0x`-prefixed hex string.\n */\nconst referenceToHexChainId = (reference: string): Hex => {\n if (isStrictHexString(reference)) {\n return reference;\n }\n return `0x${BigInt(reference).toString(16)}`;\n};\n\n/**\n * Get the unique Ethereum (EIP-155) accounts from the session scopes.\n *\n * Walks every scope's `accounts` array, keeps CAIP-10 account IDs whose chain\n * is EIP-155 (or the `wallet:eip155` cross-chain wallet scope), and returns\n * the unique 0x addresses.\n *\n * @param sessionScopes - The session scopes from `wallet_createSession` /\n * `wallet_getSession` / `wallet_sessionChanged`.\n * @returns The unique Ethereum addresses across all EIP-155 scopes.\n */\nexport const getEthAccounts = (\n sessionScopes: SessionData['sessionScopes'] | undefined,\n): Address[] => {\n if (!sessionScopes) {\n return [];\n }\n\n const ethAccounts: Address[] = [];\n for (const { accounts } of Object.values(sessionScopes)) {\n if (!accounts) {\n continue;\n }\n for (const account of accounts) {\n const { address, chainId } = parseCaipAccountId(account);\n if (isEip155ScopeString(chainId) && isStrictHexString(address)) {\n ethAccounts.push(address);\n }\n }\n }\n\n return Array.from(new Set(ethAccounts));\n};\n\n/**\n * Get the unique permitted Ethereum (EIP-155) chain IDs from the session\n * scopes.\n *\n * Iterates the scope keys, keeps the `eip155:<reference>` ones, converts each\n * decimal `reference` to a `0x`-prefixed hex chain ID, and returns the unique\n * set.\n *\n * @param sessionScopes - The session scopes from `wallet_createSession` /\n * `wallet_getSession` / `wallet_sessionChanged`.\n * @returns The unique EIP-155 chain IDs as `0x`-prefixed hex strings.\n */\nexport const getPermittedEthChainIds = (\n sessionScopes: SessionData['sessionScopes'] | undefined,\n): Hex[] => {\n if (!sessionScopes) {\n return [];\n }\n\n const ethChainIds: Hex[] = [];\n for (const scopeString of Object.keys(sessionScopes)) {\n const { namespace, reference } = parseScopeString(scopeString);\n if (namespace === KnownCaipNamespace.Eip155 && reference) {\n ethChainIds.push(referenceToHexChainId(reference));\n }\n }\n\n return Array.from(new Set(ethChainIds));\n};\n","import type { ProviderRequest } from '../types';\n\n/**\n * Type guard for connect-like requests:\n * - wallet_requestPermissions\n * - eth_requestAccounts\n *\n * @param req - The request object to check\n * @returns True if the request is a connect-like request, false otherwise\n */\nexport function isConnectRequest(req: ProviderRequest): req is Extract<\n ProviderRequest,\n {\n method: 'wallet_requestPermissions' | 'eth_requestAccounts';\n }\n> {\n return (\n req.method === 'wallet_requestPermissions' ||\n req.method === 'eth_requestAccounts'\n );\n}\n\n/**\n * Type guard for wallet_switchEthereumChain request.\n *\n * @param req - The request object to check\n * @returns True if the request is a wallet_switchEthereumChain request, false otherwise\n */\nexport function isSwitchChainRequest(\n req: ProviderRequest,\n): req is Extract<ProviderRequest, { method: 'wallet_switchEthereumChain' }> {\n return req.method === 'wallet_switchEthereumChain';\n}\n\n/**\n * Type guard for wallet_addEthereumChain request.\n *\n * @param req - The request object to check\n * @returns True if the request is a wallet_addEthereumChain request, false otherwise\n */\nexport function isAddChainRequest(\n req: ProviderRequest,\n): req is Extract<ProviderRequest, { method: 'wallet_addEthereumChain' }> {\n return req.method === 'wallet_addEthereumChain';\n}\n\n/**\n * Type guard for generic accounts request:\n * - eth_accounts\n * - eth_coinbase\n *\n * @param req - The request object to check\n * @returns True if the request is a generic accounts request, false otherwise\n */\nexport function isAccountsRequest(\n req: ProviderRequest,\n): req is Extract<\n ProviderRequest,\n { method: 'eth_accounts' | 'eth_coinbase' }\n> {\n return req.method === 'eth_accounts' || req.method === 'eth_coinbase';\n}\n\n/**\n * Type guard for generic eth_chainId request.\n *\n * @param req - The request object to check\n * @returns True if the request is a eth_chainId request, false otherwise\n */\nexport function isChainIdRequest(\n req: ProviderRequest,\n): req is Extract<ProviderRequest, { method: 'eth_chainId' }> {\n return req.method === 'eth_chainId';\n}\n\n/**\n * Validates that all values in a Record are valid URLs.\n *\n * @param record - The record to validate (e.g., supportedNetworks)\n * @param recordName - The name of the record for error messages\n * @throws Error if any values are invalid URLs\n */\nexport function validSupportedChainsUrls(\n record: Record<string, string>,\n recordName: string,\n): void {\n const invalidUrls: string[] = [];\n for (const [key, url] of Object.entries(record)) {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n } catch {\n invalidUrls.push(`${key}: ${url}`);\n }\n }\n\n if (invalidUrls.length > 0) {\n throw new Error(\n `${recordName} contains invalid URLs:\\n${invalidUrls.join('\\n')}`,\n );\n }\n}\n"],"mappings":"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","names":["namespace","hexToNumber","hexToNumber","hexToNumber","_a","KnownCaipNamespace","parseCaipChainId","namespace","_core","_provider","hexToNumber","namespace"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAsB,MAAM,8BAA8B,CAAC;AAKhF,OAAO,KAAK,EACV,OAAO,EACP,qBAAqB,EACrB,GAAG,EACH,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;;gBAa1D,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,0BAA0B;IAqBzE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAsB,MAAM,8BAA8B,CAAC;AAKhF,OAAO,KAAK,EACV,OAAO,EACP,qBAAqB,EACrB,GAAG,EACH,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY,CAAC,qBAAqB,CAAC;;gBAa1D,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,0BAA0B;IAqBzE;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDzD,IAAW,eAAe,IAAI,OAAO,GAAG,SAAS,CAEhD;IAED,IAAW,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAEtC;IAED,IAAW,QAAQ,IAAI,OAAO,EAAE,CAE/B;IAED,IAAW,eAAe,IAAI,GAAG,GAAG,SAAS,CAE5C;IAED,IAAW,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,EAElD;IAMD;;;OAGG;IACH,IAAW,OAAO,IAAI,GAAG,GAAG,SAAS,CAEpC;IAED;;;;;;;OAOG;IACG,SAAS,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAClD,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAClC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IA4C3C;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACvC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,GACjC,IAAI;CAGR"}
|
package/dist/src/provider.js
CHANGED
|
@@ -94,8 +94,12 @@ export class EIP1193Provider extends EventEmitter {
|
|
|
94
94
|
}
|
|
95
95
|
catch (error) {
|
|
96
96
|
if (error instanceof RPCInvokeMethodErr && error.rpcCode !== undefined) {
|
|
97
|
+
const invokeError = error;
|
|
97
98
|
const rpcError = new Error((_d = error.rpcMessage) !== null && _d !== void 0 ? _d : error.reason);
|
|
98
99
|
rpcError.code = error.rpcCode;
|
|
100
|
+
if (invokeError.rpcData !== undefined) {
|
|
101
|
+
rpcError.data = invokeError.rpcData;
|
|
102
|
+
}
|
|
99
103
|
throw rpcError;
|
|
100
104
|
}
|
|
101
105
|
throw error;
|
package/dist/src/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/connect-evm",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "MetaMask Connect EVM adapter — EIP-1193 provider over the multichain client",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -55,12 +55,12 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@metamask/analytics": "^0.6.0",
|
|
58
|
+
"@metamask/connect-multichain": "^1.1.0",
|
|
58
59
|
"@metamask/utils": "^11.8.1",
|
|
59
60
|
"semver": "^7.7.4"
|
|
60
61
|
},
|
|
61
62
|
"devDependencies": {
|
|
62
63
|
"@metamask/auto-changelog": "^3.4.4",
|
|
63
|
-
"@metamask/connect-multichain": "^1.0.0",
|
|
64
64
|
"@types/jsdom": "^21.1.7",
|
|
65
65
|
"@types/semver": "^7.7.1",
|
|
66
66
|
"@vitest/coverage-v8": "^3.2.4",
|
|
@@ -72,9 +72,6 @@
|
|
|
72
72
|
"typescript": "^5.9.3",
|
|
73
73
|
"vitest": "^3.1.2"
|
|
74
74
|
},
|
|
75
|
-
"peerDependencies": {
|
|
76
|
-
"@metamask/connect-multichain": "^1.0.0"
|
|
77
|
-
},
|
|
78
75
|
"engines": {
|
|
79
76
|
"node": ">=20.19.0"
|
|
80
77
|
},
|