@dynamic-labs-sdk/evm 1.30.3 → 1.31.1

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.
Files changed (98) hide show
  1. package/README.md +22 -0
  2. package/dist/baseAccount.cjs +1 -1
  3. package/dist/baseAccount.esm.js +1 -1
  4. package/dist/baseAccount.native.esm.js +1 -1
  5. package/dist/core.cjs +1 -1
  6. package/dist/core.esm.js +1 -1
  7. package/dist/core.native.esm.js +1 -1
  8. package/dist/eip6963.cjs +1 -1
  9. package/dist/eip6963.esm.js +1 -1
  10. package/dist/eip6963.native.esm.js +1 -1
  11. package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts +14 -0
  12. package/dist/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.d.ts.map +1 -0
  13. package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts +2 -0
  14. package/dist/errors/MetaMaskDirectConnectNotSupportedError/index.d.ts.map +1 -0
  15. package/dist/exports/metamask.d.ts +2 -0
  16. package/dist/exports/metamask.d.ts.map +1 -1
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.esm.js +1 -1
  19. package/dist/index.native.esm.js +1 -1
  20. package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts +23 -0
  21. package/dist/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.d.ts.map +1 -0
  22. package/dist/metamask/addMetaMaskEvmExtension/index.d.ts +2 -0
  23. package/dist/metamask/addMetaMaskEvmExtension/index.d.ts.map +1 -0
  24. package/dist/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.d.ts.map +1 -1
  25. package/dist/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.d.ts.map +1 -1
  26. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts +20 -3
  27. package/dist/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.d.ts.map +1 -1
  28. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts +17 -0
  29. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.d.ts.map +1 -0
  30. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts +2 -0
  31. package/dist/metamask/getMetaMaskEvmSdkWalletProviderKey/index.d.ts.map +1 -0
  32. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts +2 -0
  33. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/index.d.ts.map +1 -0
  34. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts +18 -0
  35. package/dist/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.d.ts.map +1 -0
  36. package/dist/metamask.cjs +199 -247
  37. package/dist/metamask.cjs.map +1 -1
  38. package/dist/metamask.esm.js +201 -251
  39. package/dist/metamask.esm.js.map +1 -1
  40. package/dist/metamask.native.esm.js +201 -251
  41. package/dist/metamask.native.esm.js.map +1 -1
  42. package/dist/{package-BpU0pYfn.native.esm.js → package-BnSw-03C.native.esm.js} +2 -2
  43. package/dist/package-BnSw-03C.native.esm.js.map +1 -0
  44. package/dist/{package-BX32-jUG.cjs → package-Dk-SYXOE.cjs} +2 -2
  45. package/dist/package-Dk-SYXOE.cjs.map +1 -0
  46. package/dist/{package-D1Z3Ng_d.esm.js → package-DrSY9NJE.esm.js} +2 -2
  47. package/dist/package-DrSY9NJE.esm.js.map +1 -0
  48. package/dist/tempo.cjs +1 -1
  49. package/dist/tempo.esm.js +1 -1
  50. package/dist/tempo.native.esm.js +1 -1
  51. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  52. package/dist/viem.cjs +1 -1
  53. package/dist/viem.esm.js +1 -1
  54. package/dist/viem.native.esm.js +1 -1
  55. package/dist/waas.cjs +1 -1
  56. package/dist/waas.esm.js +1 -1
  57. package/dist/waas.native.esm.js +1 -1
  58. package/dist/walletConnect.cjs +17 -4
  59. package/dist/walletConnect.cjs.map +1 -1
  60. package/dist/walletConnect.esm.js +16 -3
  61. package/dist/walletConnect.esm.js.map +1 -1
  62. package/dist/walletConnect.native.esm.js +16 -3
  63. package/dist/walletConnect.native.esm.js.map +1 -1
  64. package/dist/windowInjected.cjs +1 -1
  65. package/dist/windowInjected.esm.js +1 -1
  66. package/dist/windowInjected.native.esm.js +1 -1
  67. package/package.json +5 -6
  68. package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js +0 -18
  69. package/dist/getEvmNetworksData-CGZjI4hV.native.esm.js.map +0 -1
  70. package/dist/getEvmNetworksData-ChkgLvCg.esm.js +0 -18
  71. package/dist/getEvmNetworksData-ChkgLvCg.esm.js.map +0 -1
  72. package/dist/getEvmNetworksData-DBJIMiOH.cjs +0 -23
  73. package/dist/getEvmNetworksData-DBJIMiOH.cjs.map +0 -1
  74. package/dist/metamask/metamask.types.d.ts +0 -14
  75. package/dist/metamask/metamask.types.d.ts.map +0 -1
  76. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts +0 -18
  77. package/dist/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.d.ts.map +0 -1
  78. package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts +0 -2
  79. package/dist/metamask/utils/createMetaMaskEvmController/index.d.ts.map +0 -1
  80. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts +0 -27
  81. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.d.ts.map +0 -1
  82. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts +0 -2
  83. package/dist/metamask/utils/getOrCreateMetaMaskEvmController/index.d.ts.map +0 -1
  84. package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts +0 -6
  85. package/dist/metamask/utils/getSupportedNetworks/getSupportedNetworks.d.ts.map +0 -1
  86. package/dist/metamask/utils/getSupportedNetworks/index.d.ts +0 -2
  87. package/dist/metamask/utils/getSupportedNetworks/index.d.ts.map +0 -1
  88. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts +0 -3
  89. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/index.d.ts.map +0 -1
  90. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts +0 -40
  91. package/dist/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.d.ts.map +0 -1
  92. package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts +0 -3
  93. package/dist/metamask/utils/warnWhenChainNotConfigured/index.d.ts.map +0 -1
  94. package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts +0 -28
  95. package/dist/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.d.ts.map +0 -1
  96. package/dist/package-BX32-jUG.cjs.map +0 -1
  97. package/dist/package-BpU0pYfn.native.esm.js.map +0 -1
  98. package/dist/package-D1Z3Ng_d.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"metamask.esm.js","names":["supportedNetworks: MetaMaskSupportedNetworks","latestDisplayUri: string | undefined","inFlightConnect: Promise<void> | null","exhaustiveCheck: never","packageName","packageVersion"],"sources":["../src/metamask/utils/getSupportedNetworks/getSupportedNetworks.ts","../src/metamask/utils/warnWhenChainNotConfigured/warnWhenChainNotConfigured.ts","../src/metamask/utils/createMetaMaskEvmController/createMetaMaskEvmController.ts","../src/metamask/utils/getOrCreateMetaMaskEvmController/getOrCreateMetaMaskEvmController.ts","../src/metamask/utils/subscribeMetaMaskEvmFacadeListener/subscribeMetaMaskEvmFacadeListener.ts","../src/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.ts","../src/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.ts","../src/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.ts","../src/metamask/getMetaMaskEvmExtensionWalletProviderKey/getMetaMaskEvmExtensionWalletProviderKey.ts","../src/exports/metamask.ts"],"sourcesContent":["import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { assertNonEmptyArray } from '@dynamic-labs-sdk/client/core';\n\nimport { getEvmNetworksData } from '../../../utils/getEvmNetworksData';\n\ntype MetaMaskSupportedNetworks = Record<`0x${string}`, string>;\n\n/** @notInstrumented */\nexport const getSupportedNetworks = (\n client: DynamicClient\n): MetaMaskSupportedNetworks => {\n // Customer enabled networks, with mainnet first if available.\n const evmNetworks = getEvmNetworksData(client).sort((a, b) => {\n if (a.networkId === '1') return -1;\n if (b.networkId === '1') return 1;\n\n return 0;\n });\n\n assertNonEmptyArray(\n evmNetworks,\n 'No EVM networks have been configured. Make sure to add at least one EVM network to your project settings in the Dynamic Dashboard.'\n );\n\n const supportedNetworks: MetaMaskSupportedNetworks = {};\n\n for (const network of evmNetworks) {\n const numericChainId = Number.parseInt(network.networkId, 10);\n const hexChainId = `0x${numericChainId.toString(16)}` as `0x${string}`;\n supportedNetworks[hexChainId] = network.rpcUrls.http[0];\n }\n\n return supportedNetworks;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\n/**\n * Params for {@link warnWhenChainNotConfigured}. `supportedNetworks` is the\n * exact map passed to `@metamask/connect-evm`'s `api.supportedNetworks` --\n * only its keys are read here, the RPC URL values must never be logged\n * since they can embed credentials/API keys.\n */\nexport type WarnWhenChainNotConfiguredParams = {\n /** The hex chain id MetaMask reports, e.g. `0x1`. */\n chainId: string;\n /** The project's configured EVM networks, keyed by hex chain id (e.g. `0x1`). */\n supportedNetworks: Record<string, string>;\n};\n\n/**\n * Warns when the chain MetaMask reports -- via its `connect` or\n * `chainChanged` events -- is not among the project's configured EVM\n * networks. MetaMask's SDK gates every signing request\n * (`personal_sign`, `eth_sendTransaction`, `eth_signTypedData_v4`) on\n * `supportedNetworks` and throws before the wallet is ever contacted when\n * the chain isn't listed, while `eth_accounts`/`eth_chainId` bypass that\n * gate entirely -- so connect appears to succeed and only signing fails,\n * with no deeplink and no obvious cause. This warn surfaces the mismatch\n * the moment it arises instead of leaving it to be diagnosed from a\n * cryptic signing failure.\n * @notInstrumented\n */\nexport const warnWhenChainNotConfigured = (\n { chainId, supportedNetworks }: WarnWhenChainNotConfiguredParams,\n client: DynamicClient\n): void => {\n const configuredChainIds = Object.keys(supportedNetworks);\n\n // A direct match is enough because both sides are canonical lowercase hex\n // with no leading zeros: our keys come from `getSupportedNetworks`\n // (`numericChainId.toString(16)`) and MetaMask derives its chain id from the\n // CAIP-2 scope's decimal reference (`BigInt(reference).toString(16)`).\n if (configuredChainIds.includes(chainId)) {\n return;\n }\n\n // Log chain ids only, never the RPC URL values in `supportedNetworks`:\n // Dynamic RPC URLs can embed credentials/API keys.\n getCore(client).logger.warn(\n `[metamask] Wallet chain ${chainId} is not in the project's configured EVM networks (${configuredChainIds.join(', ')}). Signing requests will fail before MetaMask opens until this network is added to your project's EVM networks in the Dynamic Dashboard.`\n );\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n getAppMetadata,\n getCore,\n getNativeLinkScheme,\n} from '@dynamic-labs-sdk/client/core';\nimport { clearMetaMaskSessionStorage } from '@dynamic-labs-sdk/metamask';\nimport type { DisplayUriListener } from '@dynamic-labs-sdk/metamask';\nimport { createEVMClient } from '@metamask/connect-evm';\nimport type { Hex } from '@metamask/connect-evm';\n\nimport type { MetaMaskEvmController } from '../../metamask.types';\nimport { getSupportedNetworks } from '../getSupportedNetworks';\nimport { warnWhenChainNotConfigured } from '../warnWhenChainNotConfigured';\n\n/**\n * Builds a fully-initialised `MetaMaskEvmController` for the given Dynamic\n * client. Runs the SDK in headless mode so consumers render their own QR /\n * deep-link surface, and registers `display_uri` handling as an\n * `eventHandlers` callback at construction time so the first URI emission\n * cannot be lost to a subscription race. Dapp metadata is sourced from the\n * client's `getAppMetadata`. The MWP deep-link hand-off is routed through the\n * client's configured `openDeeplink`, so this works on both web and native.\n * The MetaMask SDK's own verbose logging is tied to the Dynamic client's log\n * level, so turning on `debug` logging for the Dynamic SDK also surfaces\n * MetaMask's internal SDK trace output.\n *\n * @notInstrumented\n */\nexport const createMetaMaskEvmController = async (\n client: DynamicClient\n): Promise<MetaMaskEvmController> => {\n const supportedNetworks = getSupportedNetworks(client);\n const { appName, appLogoUrl, appUniversalLink, appNativeLink } =\n getAppMetadata(client);\n const { logger } = getCore(client);\n\n // Drop any IndexedDB session state left behind by a previous tab,\n // page reload, or abandoned pairing before the SDK initialises. The\n // SDK's auto-recovery path otherwise picks up a stale transport\n // descriptor and spends its (non-configurable) 10-second resume\n // timeout on every controller construction trying to revive a relay\n // session that no longer exists, surfacing as a long QR skeleton\n // delay on every page reload that follows an abandoned pairing.\n await clearMetaMaskSessionStorage(client);\n\n const listeners = new Set<DisplayUriListener>();\n let latestDisplayUri: string | undefined;\n\n const sdk = await createEVMClient({\n api: { supportedNetworks },\n dapp: {\n iconUrl: appLogoUrl,\n name: appName,\n nativeScheme: getNativeLinkScheme({ nativeLink: appNativeLink }),\n url: appUniversalLink ?? '',\n },\n // Mirror the Dynamic client's own debug level, so a consumer who turns on\n // Dynamic SDK debug logging also gets MetaMask's internal SDK trace\n // output without a second, MetaMask-specific toggle to remember.\n debug: logger.isEnabled('debug'),\n eventHandlers: {\n // The wallet can switch chains at any point after connecting, so the\n // same unconfigured-chain check has to re-run on every change, not\n // just at connect time.\n chainChanged: (chainId) => {\n warnWhenChainNotConfigured({ chainId, supportedNetworks }, client);\n },\n connect: ({ chainId }) => {\n latestDisplayUri = undefined;\n // MetaMask pushes the wallet's selected chain on connect, which can\n // be outside the project's configured networks; surface that now\n // rather than waiting for a signing request to fail with no clue why.\n warnWhenChainNotConfigured({ chainId, supportedNetworks }, client);\n },\n disconnect: () => {\n latestDisplayUri = undefined;\n },\n displayUri: (uri) => {\n latestDisplayUri = uri;\n for (const listener of listeners) {\n listener(uri);\n }\n },\n },\n mobile: {\n // The MetaMask Mobile Wallet Protocol transport opens the wallet by\n // assigning `window.location.href` (see @metamask/connect-multichain\n // `openDeeplink`). React Native ships a read-only `location` whose href\n // setter throws `NotSupportedError`, so on native the pairing dies at the\n // deep-link hand-off. `preferredOpenLink` is invoked instead of the\n // built-in opener at every deep-link site, so route it through the\n // client's configured `openDeeplink`: web still navigates via\n // `window.location.assign` (with the SDK's URL-scheme guard), and native\n // apps supply their own opener (e.g. `Linking.openURL`).\n preferredOpenLink: (deeplink) => {\n const { logger } = getCore(client);\n\n // The SDK builds MWP deeplinks internally, so logging the URL here is\n // the only way to see which target (scheme, session payload) the\n // pairing actually attempted when a hand-off fails on device.\n logger.debug('[metamask] opening MWP deeplink', deeplink);\n\n void getCore(client)\n .openDeeplink(deeplink)\n .then(() => {\n logger.debug('[metamask] opened MWP deeplink', deeplink);\n })\n .catch((error) => {\n logger.warn('[metamask] failed to open MWP deeplink', error);\n });\n },\n },\n ui: {\n headless: true,\n preferExtension: true,\n },\n });\n\n // Defensive cleanup: even though we cleared IndexedDB before\n // constructing the SDK, an in-flight `display_uri` emission could\n // theoretically race the storage delete on slow devices. Clearing\n // the cache here guarantees late subscribers cannot replay an URI\n // that originated from any pairing attempt prior to this\n // construction.\n latestDisplayUri = undefined;\n\n const onDisplayUri = (listener: DisplayUriListener): (() => void) => {\n listeners.add(listener);\n if (latestDisplayUri !== undefined) {\n listener(latestDisplayUri);\n }\n return () => {\n listeners.delete(listener);\n };\n };\n\n const chainIds = Object.keys(supportedNetworks) as Hex[];\n\n // Tracks an in-flight `connect` call so that overlapping invocations (most\n // commonly React's StrictMode double-invocation of effects, or a hook that\n // re-runs while the user is still scanning) await the same underlying\n // pairing instead of racing two `sdk.connect` calls against each other.\n // Without this, the second invocation tears down the first via\n // `sdk.disconnect()` and the SDK throws \"Cannot connect when state is\n // CONNECTING\".\n let inFlightConnect: Promise<void> | null = null;\n\n const connect = (): Promise<void> => {\n if (inFlightConnect) {\n return inFlightConnect;\n }\n\n inFlightConnect = (async () => {\n try {\n // If a previous pairing was cancelled mid-flight the SDK can be left\n // in `connecting` state with a dead transport descriptor; tear it\n // down so the next `connect` issues a fresh URI synchronously\n // instead of waiting for the SDK's (non-configurable) 10-second\n // resume timeout.\n if (sdk.status === 'connecting') {\n try {\n await sdk.disconnect();\n } catch (error) {\n getCore(client).logger.debug(\n '[metamask] pre-connect disconnect rejected (expected when aborting a pairing the wallet never accepted)',\n error\n );\n }\n }\n\n await sdk.connect({ chainIds });\n } finally {\n inFlightConnect = null;\n }\n })();\n\n return inFlightConnect;\n };\n\n return {\n clearCachedDisplayUri: () => {\n latestDisplayUri = undefined;\n },\n connect,\n getLatestDisplayUri: () => latestDisplayUri,\n onDisplayUri,\n sdk,\n };\n};\n","import { createRuntimeServiceAccessKey } from '@dynamic-labs-sdk/client/core';\n\nimport { createMetaMaskEvmController } from '../createMetaMaskEvmController';\n\nconst RUNTIME_SERVICE_KEY = 'metaMaskEvmController';\n\n/**\n * Per-`DynamicClient` accessor for the lazily-constructed MetaMask EVM\n * controller. Wraps `createMetaMaskEvmController` with the standard\n * `runtimeServices` cache so every caller — the EIP-1193 wallet-provider\n * façade, the `display_uri` subscription helper, and the\n * `connectWithMetaMaskEvm` URI-returning helper — shares the same\n * controller (and therefore the same SDK instance, display-URI cache, and\n * listener registry) per Dynamic client.\n *\n * This matches the pattern used by the WalletConnect `getSignClient`\n * accessor: the first call triggers construction; subsequent calls\n * (within the same client) return the cached promise without re-running\n * the builder.\n *\n * The cache is **per-Dynamic-client, not per-SDK-instance**:\n * `@metamask/connect-evm`'s `createEVMClient` is itself a singleton —\n * a second call returns the same underlying SDK — so when multiple\n * Dynamic clients coexist they end up sharing the same MetaMask SDK\n * instance (and therefore the same active pairing session) regardless\n * of this cache. The wrapper exists to own the controller's\n * `display_uri` cache and listener registry per Dynamic client, which\n * the SDK itself does not expose.\n *\n * @notInstrumented\n */\nexport const getOrCreateMetaMaskEvmController = createRuntimeServiceAccessKey(\n RUNTIME_SERVICE_KEY,\n (client) => createMetaMaskEvmController(client)\n);\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\nimport type {\n Address,\n Hex,\n EIP1193Provider as SdkEip1193Provider,\n} from '@metamask/connect-evm';\n\nimport type { EIP1193ProviderEvents } from '../../../EvmWalletProvider.types';\n\nconst NOOP_UNSUBSCRIBE = (): void => undefined;\n\n/**\n * A facade listener captured by the MetaMask EVM wallet-provider facade.\n *\n * The discriminated-union shape (rather than `{ event: string; listener:\n * (...args: unknown[]) => void }`) is what lets\n * `subscribeMetaMaskEvmFacadeListener` narrow the listener type per\n * event, so the per-event adapters stay type-safe without casts.\n */\nexport type PendingMetaMaskEvmFacadeListener = {\n [E in keyof EIP1193ProviderEvents]: {\n event: E;\n listener: EIP1193ProviderEvents[E];\n };\n}[keyof EIP1193ProviderEvents];\n\n/**\n * Subscribes a facade listener to the underlying MetaMask SDK provider,\n * forwarding events through per-event adapters:\n *\n * - `accountsChanged` — clones the readonly addresses array\n * `@metamask/connect-evm` hands the listener, since the Dynamic SDK\n * facade contract emits a mutable `Address[]`.\n * - `chainChanged` — passes the chain id through verbatim.\n * - `disconnected` — bridged to the SDK's canonical `disconnect`\n * event, which the SDK actually emits.\n *\n * Returns the unsubscribe function returned by the SDK provider so the\n * caller can clean it up later (for example, when the facade's\n * `removeAllListeners` is invoked).\n *\n * @notInstrumented\n */\nexport const subscribeMetaMaskEvmFacadeListener = ({\n client,\n pending,\n provider,\n}: {\n client: DynamicClient;\n pending: PendingMetaMaskEvmFacadeListener;\n provider: SdkEip1193Provider;\n}): (() => void) => {\n if (pending.event === 'accountsChanged') {\n return provider.on('accountsChanged', (addresses: readonly Address[]) =>\n pending.listener([...addresses])\n );\n }\n\n if (pending.event === 'chainChanged') {\n return provider.on('chainChanged', (chainId: Hex) =>\n pending.listener(chainId)\n );\n }\n\n if (pending.event === 'disconnected') {\n // The SDK emits its canonical `disconnect` event, which we bridge\n // to the facade's `disconnected` contract here.\n return provider.on('disconnect', () => pending.listener());\n }\n\n // Defensive fallthrough: a new entry was added to `EIP1193ProviderEvents`\n // but the per-event adapter list above was not updated. We log the\n // unhandled event and return a no-op unsubscribe so the consumer's\n // teardown loop still runs cleanly.\n const exhaustiveCheck: never = pending;\n getCore(client).logger.debug(\n '[metamask] subscribeMetaMaskEvmFacadeListener: unhandled event',\n (exhaustiveCheck as { event: unknown }).event\n );\n return NOOP_UNSUBSCRIBE;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n getCore,\n} from '@dynamic-labs-sdk/client/core';\nimport { MetaMaskWalletNotConnectedError } from '@dynamic-labs-sdk/metamask';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\nimport type {\n EIP1193Provider,\n EIP1193ProviderEvents,\n EIP1193ProviderRequest,\n EvmWalletProvider,\n} from '../../EvmWalletProvider.types';\nimport { createWalletProviderFromEIP1193Provider } from '../../utils/createWalletProviderFromEIP1193Provider';\nimport { getOrCreateMetaMaskEvmController } from '../utils/getOrCreateMetaMaskEvmController';\nimport type { PendingMetaMaskEvmFacadeListener } from '../utils/subscribeMetaMaskEvmFacadeListener';\nimport { subscribeMetaMaskEvmFacadeListener } from '../utils/subscribeMetaMaskEvmFacadeListener';\n\nconst METAMASK_DISPLAY_NAME = 'MetaMask';\nconst METAMASK_ICON = `${DYNAMIC_ICONIC_SPRITE_URL}#metamask`;\n\n/**\n * Builds the `EvmWalletProvider` registered AFTER a successful MetaMask\n * SDK URI pairing. Wraps the SDK's EIP-1193 provider behind the Dynamic\n * facade (`disconnect` → `disconnected` event bridge, `removeAllListeners`\n * shim) and drops `connect` so the provider is filtered out of the\n * wallet picker by `getAvailableWalletProvidersData` — mirroring how\n * WalletConnect URI sessions register a signing-only provider. The facade's\n * `request` also traces dispatch/resolution at debug level, since a signing\n * request that never gets a deep-link back to the wallet otherwise leaves\n * no signal on the Dynamic side.\n *\n * @notInstrumented\n */\nexport const createMetaMaskEvmWalletProvider = async (\n client: DynamicClient\n): Promise<EvmWalletProvider> => {\n const controller = await getOrCreateMetaMaskEvmController(client);\n\n // The provider is only meaningful once the URI pairing has produced a\n // connected account; guard so a premature or out-of-order call raises a\n // readable error instead of building a provider around an unconnected SDK.\n if (controller.sdk.getAccount() === undefined) {\n throw new MetaMaskWalletNotConnectedError();\n }\n\n const provider = controller.sdk.getProvider();\n\n const subscriberCleanups = new Set<() => void>();\n\n const eip1193Provider: EIP1193Provider = {\n // eslint-disable-next-line custom-rules/require-single-object-param -- EIP-1193 `on` signature is fixed by the interface contract.\n on: <E extends keyof EIP1193ProviderEvents>(\n event: E,\n listener: EIP1193ProviderEvents[E]\n ) => {\n const pending = { event, listener } as PendingMetaMaskEvmFacadeListener;\n subscriberCleanups.add(\n subscribeMetaMaskEvmFacadeListener({ client, pending, provider })\n );\n },\n removeAllListeners: () => {\n for (const unsubscribe of subscriberCleanups) {\n try {\n unsubscribe();\n } catch (error) {\n getCore(client).logger.error(\n '[metamask] removeAllListeners: unsubscribe failed',\n error\n );\n }\n }\n subscriberCleanups.clear();\n },\n request: async <T = unknown>(\n request: EIP1193ProviderRequest\n ): Promise<T> => {\n const { logger } = getCore(client);\n\n // `sdk.status` at dispatch time is what tells a stuck signing request\n // apart from a stale MWP relay connection: if this ever logs a status\n // other than `connected`, the request was dispatched into a transport\n // that already knew it was not usable, rather than one the wallet\n // simply never responded on.\n logger.debug('[metamask] eip1193 request dispatched', {\n method: request.method,\n status: controller.sdk.status,\n });\n\n try {\n const result = (await provider.request(request)) as T;\n logger.debug('[metamask] eip1193 request resolved', {\n method: request.method,\n });\n return result;\n } catch (error) {\n logger.warn('[metamask] eip1193 request rejected', {\n error,\n method: request.method,\n });\n throw error;\n }\n },\n };\n\n const walletProvider = createWalletProviderFromEIP1193Provider(\n {\n displayName: METAMASK_DISPLAY_NAME,\n eip1193: eip1193Provider,\n icon: METAMASK_ICON,\n walletProviderType: WalletProviderEnum.QrCode,\n },\n client\n );\n\n return {\n ...walletProvider,\n connect: undefined,\n };\n};\n","import {\n type WalletAccount,\n type WalletProviderUriConnectionResult,\n getDefaultClient,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\nimport { getOrCreateMetaMaskEvmController } from '../utils/getOrCreateMetaMaskEvmController';\n\n/**\n * Drives a MetaMask SDK URI pairing for EVM and verifies ownership of the\n * paired wallet account through message signing, returning `{ approval, uri }`\n * so consumers can render the QR / hand the URI to a deeplink.\n *\n * Unlike `connectAndVerifyWithWalletConnectEvm`, the MetaMask SDK does not\n * expose a single-round-trip authenticate primitive, so this drives two\n * sequential interactions on the wallet side: the user first approves the\n * pairing, then approves a sign-in message. The wallet account is added to\n * the Dynamic client as a verified credential (not as an unverified\n * account).\n *\n * @notInstrumented\n */\nexport const connectAndVerifyWithMetaMaskUriEvm = async (\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n registerEvmNetworkProviderBuilder(client);\n\n const { approval, uri } = await connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts: false,\n chain: 'EVM',\n getController: getOrCreateMetaMaskEvmController,\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n },\n client\n );\n\n const verifiedApproval = async (): Promise<{\n walletAccounts: WalletAccount[];\n }> => {\n const { walletAccounts } = await approval();\n\n // MetaMask SDK exposes a single active address per pairing (same\n // model as EIP-1193 `eth_accounts`), mirroring how the underlying\n // `connectWithMetaMaskUri` materializes a single account from\n // `addresses[0]`. Verify it directly.\n const [walletAccount] = walletAccounts;\n\n if (walletAccount) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n };\n\n return { approval: verifiedApproval, uri };\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport type { WalletProviderUriConnectionResult } from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\nimport { getOrCreateMetaMaskEvmController } from '../utils/getOrCreateMetaMaskEvmController';\n\nexport type ConnectWithMetaMaskUriEvmParams = {\n /** Whether to add the connected wallet account to the Dynamic client. Defaults to `true`. */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/**\n * Drives a MetaMask SDK URI pairing for EVM and returns `{ approval, uri }` so\n * consumers can render the QR / hand the URI to a deeplink. Logs an advisory\n * warning when the MetaMask extension is announced via EIP-6963; pairing still\n * proceeds, but the consumer is told which announced provider key to route\n * through for the best UX. The resulting wallet provider registers for signing\n * only and is never surfaced in the wallet picker.\n *\n * @notInstrumented\n */\nexport const connectWithMetaMaskUriEvm = (\n { addToDynamicWalletAccounts = true }: ConnectWithMetaMaskUriEvmParams = {},\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n registerEvmNetworkProviderBuilder(client);\n\n return connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts,\n chain: 'EVM',\n getController: getOrCreateMetaMaskEvmController,\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n },\n client\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getMetaMaskExtensionWalletProviderKey } from '@dynamic-labs-sdk/metamask';\n\n/**\n * Returns the wallet provider key of the MetaMask browser extension announced\n * for EVM, or `undefined` when none is announced. Pass the returned key to\n * `connectWithWalletProvider` to route through the announced provider; fall\n * back to `connectWithMetaMaskUriEvm` when `undefined`.\n *\n * @notInstrumented\n */\nexport const getMetaMaskEvmExtensionWalletProviderKey = (\n client = getDefaultClient()\n): string | undefined =>\n getMetaMaskExtensionWalletProviderKey({ chain: 'EVM' }, client);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { connectAndVerifyWithMetaMaskUriEvm } from '../metamask/connectAndVerifyWithMetaMaskUriEvm';\nexport { connectWithMetaMaskUriEvm } from '../metamask/connectWithMetaMaskUriEvm';\nexport type { ConnectWithMetaMaskUriEvmParams } from '../metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm';\nexport { getMetaMaskEvmExtensionWalletProviderKey } from '../metamask/getMetaMaskEvmExtensionWalletProviderKey';\nexport { MetaMaskDisplayUriMissingError } from '@dynamic-labs-sdk/metamask';\n"],"mappings":"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"}
1
+ {"version":3,"file":"metamask.esm.js","names":["disconnectWalletAccount: EvmWalletProvider['disconnectWalletAccount']","destroy: EvmWalletProvider['destroy']","getDefaultClient","hasExtension","hasExtension","packageName","packageVersion"],"sources":["../src/errors/MetaMaskDirectConnectNotSupportedError/MetaMaskDirectConnectNotSupportedError.ts","../src/metamask/getMetaMaskEvmSdkWalletProviderKey/getMetaMaskEvmSdkWalletProviderKey.ts","../src/metamask/createMetaMaskEvmWalletProvider/createMetaMaskEvmWalletProvider.ts","../src/metamask/addMetaMaskEvmExtension/addMetaMaskEvmExtension.ts","../src/metamask/connectAndVerifyWithMetaMaskUriEvm/connectAndVerifyWithMetaMaskUriEvm.ts","../src/metamask/warnMetaMaskEvmIntegrationIncomplete/warnMetaMaskEvmIntegrationIncomplete.ts","../src/metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm.ts","../src/metamask/getMetaMaskEvmExtensionWalletProviderKey/getMetaMaskEvmExtensionWalletProviderKey.ts","../src/exports/metamask.ts"],"sourcesContent":["import { BaseError } from '@dynamic-labs-sdk/client';\n\n/**\n * Thrown when `connect()` is called directly on the MetaMask SDK placeholder\n * wallet provider (the entry `addMetaMaskEvmExtension` registers so MetaMask\n * still shows up in the wallet picker when no browser extension is\n * installed). That placeholder has no generic connect flow of its own --\n * connecting requires the QR / deeplink pairing flow, so callers must drive\n * `connectWithMetaMaskUriEvm` (or `connectAndVerifyWithMetaMaskUriEvm`)\n * instead of the picker's default connect.\n */\nexport class MetaMaskDirectConnectNotSupportedError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'metamask_direct_connect_not_supported',\n docsUrl: null,\n name: 'MetaMaskDirectConnectNotSupportedError',\n shortMessage:\n 'MetaMask cannot be connected directly; call connectWithMetaMaskUriEvm (or connectAndVerifyWithMetaMaskUriEvm) to get a QR/URI pairing flow instead',\n });\n }\n}\n","import { formatWalletProviderKey } from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\n// Kept in sync with `createMetaMaskEvmWalletProvider`'s own copy of this\n// display name -- both derive the same deterministic key, and duplicating\n// the string here is simpler than threading a shared constant through an\n// aggregating export.\nconst METAMASK_EVM_SDK_DISPLAY_NAME = 'MetaMask';\n\n/**\n * Deterministic wallet provider key for the MetaMask SDK's connect-less EVM\n * placeholder. Computed without building the wallet provider itself, so\n * `addMetaMaskEvmExtension` can check for a matching wallet account before\n * paying the cost of `createMetaMaskEvmWalletProvider`.\n *\n * @example\n * ```ts\n * const key = getMetaMaskEvmSdkWalletProviderKey();\n * ```\n * @returns The deterministic wallet provider key.\n * @see createMetaMaskEvmWalletProvider\n * @see reconcileMetaMaskWalletProvider\n * @notInstrumented\n */\nexport const getMetaMaskEvmSdkWalletProviderKey = (): string =>\n formatWalletProviderKey({\n chain: 'EVM',\n displayName: METAMASK_EVM_SDK_DISPLAY_NAME,\n walletProviderType: WalletProviderEnum.QrCode,\n });\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n getActiveNetworkIdFromLastKnownRegistry,\n getCore,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport {\n assertMetaMaskNetworkIsGranted,\n createMetaMaskWalletProviderEventEmitter,\n disconnectMetaMaskWalletProvider,\n getOrCreateMetaMaskClientInstanceManager,\n resolveActiveMetaMaskScope,\n} from '@dynamic-labs-sdk/metamask/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\nimport { MetaMaskDirectConnectNotSupportedError } from '../../errors/MetaMaskDirectConnectNotSupportedError';\nimport type {\n EIP1193Provider,\n EIP1193ProviderRequest,\n EvmWalletProvider,\n} from '../../EvmWalletProvider.types';\nimport { createWalletProviderFromEIP1193Provider } from '../../utils/createWalletProviderFromEIP1193Provider';\nimport { getMetaMaskEvmSdkWalletProviderKey } from '../getMetaMaskEvmSdkWalletProviderKey';\n\nconst METAMASK_DISPLAY_NAME = 'MetaMask';\nconst METAMASK_ICON = `${DYNAMIC_ICONIC_SPRITE_URL}#metamask`;\n\n/**\n * Builds the `EvmWalletProvider` registered AFTER a successful MetaMask\n * SDK URI pairing. Wraps the SDK's EIP-1193 provider behind the Dynamic\n * facade and drops `connect` so the provider is filtered out of the\n * wallet picker by `getAvailableWalletProvidersData` — mirroring how\n * WalletConnect URI sessions register a signing-only provider. The facade's\n * `request` also traces dispatch/resolution at debug level, since a signing\n * request that never gets a deep-link back to the wallet otherwise leaves\n * no signal on the Dynamic side.\n *\n * `on` is a no-op: the facade doesn't yet bridge MetaMask's own\n * `accountsChanged`/`chainChanged`/`disconnected` events through to the\n * EIP-1193 listener contract.\n *\n * `switchActiveNetwork` routes through `assertMetaMaskNetworkIsGranted`\n * before persisting -- see its inline comment for why (every configured\n * network is an *optional* MetaMask scope, so signing/sending calls on an\n * ungranted one would otherwise fail). The facade's `request` similarly\n * routes its active-network lookup through `resolveActiveMetaMaskScope`\n * rather than reading the registry directly, so a default network MetaMask\n * never granted self-heals before it reaches a real signing/sending call.\n *\n * `switchActiveNetwork`/`disconnectWalletAccount` are local, Dynamic-side\n * actions with no live wallet event to bridge, so they emit `networkChanged`/\n * `disconnected` themselves via `metaMaskEvents` -- otherwise `events` would\n * never fire for MetaMask at all (unlike every other EVM wallet provider,\n * whose events come from bridging the wallet's own EIP-1193 events).\n *\n * @notInstrumented\n */\nexport const createMetaMaskEvmWalletProvider = (\n client: DynamicClient\n): EvmWalletProvider => {\n const metaMaskClientInstanceManager =\n getOrCreateMetaMaskClientInstanceManager(client);\n\n const walletProviderKey = getMetaMaskEvmSdkWalletProviderKey();\n\n // MetaMask's multichain session never fires a live wallet event we could\n // bridge for `switchActiveNetwork`/`disconnectWalletAccount` below (both are\n // local, Dynamic-side actions -- see their own comments), so this emitter is\n // the only way `onWalletProviderEvent` consumers ever hear about them.\n const metaMaskEvents = createMetaMaskWalletProviderEventEmitter();\n\n const eip1193Provider: EIP1193Provider = {\n on: () => {\n // No-op: see the `on` note in this function's JSDoc.\n },\n removeAllListeners: () => {\n // No-op: nothing is ever subscribed by `on` above.\n },\n request: async <T = unknown>(\n request: EIP1193ProviderRequest\n ): Promise<T> => {\n const { logger } = getCore(client);\n const metaMaskClient =\n await metaMaskClientInstanceManager.getMetaMaskClient();\n\n try {\n // Self-heals the active network the same way SOL does: if the\n // registry's default network (the first configured one for this\n // chain -- see `resolveActiveMetaMaskScope`) has no granted\n // account, this falls back to one that does. Without this,\n // `eth_accounts` would still report a connected address (it's an\n // unscoped EIP-1193 passthrough MetaMask never CAIP-checks -- see\n // its own JSDoc), silently masking that every *scope-checked*\n // signing/sending call below would fail against the ungranted\n // default network.\n const { networkId } = await resolveActiveMetaMaskScope(\n { chain: 'EVM', metaMaskClient, walletProviderKey },\n client\n );\n\n logger.debug('[MetaMask:Provider] eip1193 request dispatched', {\n method: request.method,\n networkId,\n status: metaMaskClient.status,\n });\n\n if (request.method === 'eth_chainId') {\n return `0x${Number(networkId).toString(16)}` as T;\n }\n\n const result = (await metaMaskClient.invokeMethod({\n request,\n scope: `eip155:${networkId}`,\n })) as T;\n\n logger.debug('[MetaMask:Provider] eip1193 request resolved', {\n method: request.method,\n });\n\n return result;\n } catch (error) {\n logger.warn('[MetaMask:Provider] eip1193 request rejected', {\n error,\n method: request.method,\n });\n throw error;\n }\n },\n };\n\n const walletProvider = createWalletProviderFromEIP1193Provider(\n {\n displayName: METAMASK_DISPLAY_NAME,\n eip1193: eip1193Provider,\n icon: METAMASK_ICON,\n walletProviderType: WalletProviderEnum.QrCode,\n },\n client\n );\n\n // The generic switchActiveNetwork (wired by createWalletProviderFromEIP1193Provider)\n // asks the wallet live via `eth_chainId`/`wallet_switchEthereumChain`, which doesn't\n // apply here: the MetaMask multichain session already grants every configured chain\n // as its own scope up front, so \"switching\" is just updating which scope `request`\n // targets next, tracked in Dynamic's own last-known-network registry. Guarded against\n // ever pointing that registry at a network MetaMask didn't actually grant an account\n // for -- unlike `eth_accounts` (a raw EIP-1193 passthrough MetaMask doesn't scope-check),\n // every other method here (`personal_sign`, `eth_sendTransaction`, etc.) IS scope-checked,\n // so switching to an ungranted network would silently break every subsequent request on\n // it -- see `assertMetaMaskNetworkIsGranted`.\n const switchActiveNetwork = async ({\n networkId,\n }: {\n networkId: string;\n }): Promise<void> => {\n const metaMaskClient =\n await metaMaskClientInstanceManager.getMetaMaskClient();\n\n await assertMetaMaskNetworkIsGranted(\n { chain: 'EVM', metaMaskClient, networkId },\n client\n );\n\n // Read the previous value before writing, so networkChanged only fires\n // on an actual change -- switching to the network that's already active\n // is a no-op as far as any `onWalletProviderEvent` subscriber is concerned.\n const { networkId: previousNetworkId } =\n await getActiveNetworkIdFromLastKnownRegistry({\n client,\n walletProviderKey,\n });\n\n await switchActiveNetworkInLastKnownRegistry({\n client,\n networkId,\n walletProviderKey,\n });\n\n if (networkId !== previousNetworkId) {\n metaMaskEvents.emitNetworkChanged({ networkId });\n }\n };\n\n // Overrides the generic EIP-1193 `destroy` (which merely revokes wallet\n // permissions): a MetaMask multichain session is scope-based rather than\n // per-provider, so ending it properly means dropping this chain's scopes\n // and cleaning up the persisted session -- see `disconnectMetaMaskWalletProvider`.\n const disconnectWalletAccount: EvmWalletProvider['disconnectWalletAccount'] =\n async () => {\n await disconnectMetaMaskWalletProvider(\n { chain: 'EVM', walletProviderKey },\n client\n );\n metaMaskEvents.emitDisconnected();\n };\n\n // Overrides the generic EIP-1193 `destroy` -- it only cleans up its own\n // internal event emitter, so `metaMaskEvents` (the emitter behind `events`\n // above) would otherwise never get cleaned up.\n const destroy: EvmWalletProvider['destroy'] = async (args) => {\n await walletProvider.destroy?.(args);\n metaMaskEvents.cleanupEventEmitter();\n };\n\n return {\n ...walletProvider,\n connect: async () => {\n throw new MetaMaskDirectConnectNotSupportedError();\n },\n destroy,\n disconnectWalletAccount,\n get events() {\n return metaMaskEvents.getEventEmitter();\n },\n switchActiveNetwork,\n };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n getDefaultClient,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\nimport { reconcileMetaMaskWalletProvider } from '@dynamic-labs-sdk/metamask/core';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\nimport { getMetaMaskEvmSdkWalletProviderKey } from '../getMetaMaskEvmSdkWalletProviderKey';\n\nexport const METAMASK_EVM_EXTENSION_KEY = 'metaMaskEvm';\n\n/**\n * Integrates MetaMask Connect (MetaMask's multichain SDK) with the Dynamic\n * client for EVM, letting users connect MetaMask on platforms where the\n * browser extension isn't available — e.g. scanning a QR code, or opening\n * the MetaMask mobile app from a website or React Native app. Call this\n * once during setup.\n *\n * @example\n * ```ts\n * const client = createDynamicClient({ environmentId: '...' });\n *\n * addMetaMaskEvmExtension(client);\n * ```\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns void\n * @see connectWithMetaMaskUriEvm\n * @see addEvmExtension\n * @notInstrumented\n */\nexport const addMetaMaskEvmExtension = (\n client: DynamicClient = getDefaultClient()\n): void => {\n if (hasExtension({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerEvmNetworkProviderBuilder(client);\n registerExtension({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client);\n\n reconcileMetaMaskWalletProvider(\n {\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n walletProviderKey: getMetaMaskEvmSdkWalletProviderKey(),\n },\n client\n );\n};\n","import {\n type WalletAccount,\n type WalletProviderUriConnectionResult,\n getDefaultClient,\n verifyWalletAccount,\n} from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\n\n/**\n * Drives a MetaMask SDK URI pairing for EVM and verifies ownership of the\n * paired wallet account through message signing, returning `{ approval, uri }`\n * so consumers can render the QR / hand the URI to a deeplink.\n *\n * Unlike `connectAndVerifyWithWalletConnectEvm`, the MetaMask SDK does not\n * expose a single-round-trip authenticate primitive, so this drives two\n * sequential interactions on the wallet side: the user first approves the\n * pairing, then approves a sign-in message. The wallet account is added to\n * the Dynamic client as a verified credential (not as an unverified\n * account).\n *\n * @notInstrumented\n */\nexport const connectAndVerifyWithMetaMaskUriEvm = async (\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n registerEvmNetworkProviderBuilder(client);\n\n const { approval, uri } = await connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts: false,\n chain: 'EVM',\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n },\n client\n );\n\n const verifiedApproval = async (): Promise<{\n walletAccounts: WalletAccount[];\n }> => {\n const { walletAccounts } = await approval();\n\n // MetaMask SDK exposes a single active address per pairing (same\n // model as EIP-1193 `eth_accounts`), mirroring how the underlying\n // `connectWithMetaMaskUri` materializes a single account from\n // `addresses[0]`. Verify it directly.\n const [walletAccount] = walletAccounts;\n\n if (walletAccount) {\n await verifyWalletAccount({ walletAccount }, client);\n }\n\n return { walletAccounts };\n };\n\n return { approval: verifiedApproval, uri };\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getCore, hasExtension } from '@dynamic-labs-sdk/client/core';\n\nimport { METAMASK_EVM_EXTENSION_KEY } from '../addMetaMaskEvmExtension/addMetaMaskEvmExtension';\n\n/**\n * Warns when `addMetaMaskEvmExtension()` hasn't been added, since a wallet\n * connected via `connectWithMetaMaskUriEvm` without it won't be restored\n * after a page reload.\n *\n * @example\n * ```ts\n * warnMetaMaskEvmIntegrationIncomplete(client);\n * ```\n * @param client - The Dynamic client instance.\n * @returns void\n * @see connectWithMetaMaskUriEvm\n * @see addMetaMaskEvmExtension\n * @notInstrumented\n */\nexport const warnMetaMaskEvmIntegrationIncomplete = (\n client: DynamicClient\n): void => {\n if (hasExtension({ extensionKey: METAMASK_EVM_EXTENSION_KEY }, client)) {\n return;\n }\n\n getCore(client).logger.warn(\n `MetaMask integration is incomplete: addMetaMaskEvmExtension() is missing. Add it during setup:\n\nimport { addMetaMaskEvmExtension } from '@dynamic-labs-sdk/evm/metamask';\nimport { createDynamicClient } from '@dynamic-labs-sdk/client';\n\nconst client = createDynamicClient({ environmentId: '...' });\n\naddMetaMaskEvmExtension(client);`\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport type { WalletProviderUriConnectionResult } from '@dynamic-labs-sdk/client';\nimport { connectWithMetaMaskUri } from '@dynamic-labs-sdk/metamask';\n\nimport { registerEvmNetworkProviderBuilder } from '../../registerEvmNetworkProviderBuilder';\nimport { createMetaMaskEvmWalletProvider } from '../createMetaMaskEvmWalletProvider';\nimport { warnMetaMaskEvmIntegrationIncomplete } from '../warnMetaMaskEvmIntegrationIncomplete';\n\nexport type ConnectWithMetaMaskUriEvmParams = {\n /** Whether to add the connected wallet account to the Dynamic client. Defaults to `true`. */\n addToDynamicWalletAccounts?: boolean;\n};\n\n/**\n * Drives a MetaMask SDK URI pairing for EVM and returns `{ approval, uri }` so\n * consumers can render the QR / hand the URI to a deeplink. Logs an advisory\n * warning when the MetaMask extension is announced via EIP-6963; pairing still\n * proceeds, but the consumer is told which announced provider key to route\n * through for the best UX. The resulting wallet provider registers for signing\n * only and is never surfaced in the wallet picker.\n *\n * @notInstrumented\n */\nexport const connectWithMetaMaskUriEvm = (\n { addToDynamicWalletAccounts = true }: ConnectWithMetaMaskUriEvmParams = {},\n client = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n warnMetaMaskEvmIntegrationIncomplete(client);\n\n registerEvmNetworkProviderBuilder(client);\n\n return connectWithMetaMaskUri(\n {\n addToDynamicWalletAccounts,\n chain: 'EVM',\n walletProviderBuilder: createMetaMaskEvmWalletProvider,\n },\n client\n );\n};\n","import { getDefaultClient } from '@dynamic-labs-sdk/client';\nimport { getMetaMaskExtensionWalletProviderKey } from '@dynamic-labs-sdk/metamask';\n\n/**\n * Returns the wallet provider key of the MetaMask browser extension announced\n * for EVM, or `undefined` when none is announced. Pass the returned key to\n * `connectWithWalletProvider` to route through the announced provider; fall\n * back to `connectWithMetaMaskUriEvm` when `undefined`.\n *\n * @notInstrumented\n */\nexport const getMetaMaskEvmExtensionWalletProviderKey = (\n client = getDefaultClient()\n): string | undefined =>\n getMetaMaskExtensionWalletProviderKey({ chain: 'EVM' }, client);\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport {\n name as packageName,\n version as packageVersion,\n} from '../../package.json';\nassertPackageVersion(packageName, packageVersion);\n\nexport { addMetaMaskEvmExtension } from '../metamask/addMetaMaskEvmExtension';\nexport { connectAndVerifyWithMetaMaskUriEvm } from '../metamask/connectAndVerifyWithMetaMaskUriEvm';\nexport { connectWithMetaMaskUriEvm } from '../metamask/connectWithMetaMaskUriEvm';\nexport type { ConnectWithMetaMaskUriEvmParams } from '../metamask/connectWithMetaMaskUriEvm/connectWithMetaMaskUriEvm';\nexport { MetaMaskDirectConnectNotSupportedError } from '../errors/MetaMaskDirectConnectNotSupportedError';\nexport { getMetaMaskEvmExtensionWalletProviderKey } from '../metamask/getMetaMaskEvmExtensionWalletProviderKey';\nexport { MetaMaskDisplayUriMissingError } from '@dynamic-labs-sdk/metamask';\n"],"mappings":"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"}