{"version":3,"file":"index.cjs","names":["clearMetaMaskStorage","BaseError","WalletProviderEnum","getMetaMaskScopes","getOrCreateMetaMaskClientInstanceManager","uri: string","WalletProviderPriority","NoAddressFoundError","name","version"],"sources":["../src/clearMetaMaskSessionStorage/clearMetaMaskSessionStorage.ts","../src/errors/MetaMaskDisplayUriMissingError/MetaMaskDisplayUriMissingError.ts","../src/getMetaMaskExtensionWalletProviderKey/getMetaMaskExtensionWalletProviderKey.ts","../src/connectWithMetaMaskUri/connectWithMetaMaskUri.ts","../src/exports/index.ts"],"sourcesContent":["import type { DynamicClient } from '@dynamic-labs-sdk/client';\n\nimport { clearMetaMaskStorage } from '../metaMaskStorage/clearMetaMaskStorage';\n\n/**\n * Resets the MetaMask SDK's persisted session so the next connect call\n * emits a fresh `display_uri` instead of resuming a stale pairing.\n *\n * @deprecated The clearMetaMaskSessionStorage is not needed anymore since the SDK itself will handle the storage\n *\n * @example\n * ```ts\n * await clearMetaMaskSessionStorage(client);\n * // Next connectWithMetaMaskUri call will emit a fresh URI immediately.\n * ```\n *\n * @param client - The Dynamic client instance. Required (rather than\n * defaulting to the last-initialized client) so a storage-clear failure is\n * always logged against the client that actually requested it.\n * @returns A promise that resolves once the persisted session is reset.\n * @see connectWithMetaMaskUri\n * @see createMetaMaskClientInstanceManager\n * @notInstrumented\n */\nexport const clearMetaMaskSessionStorage = (\n  // eslint-disable-next-line custom-rules/check-dynamic-client-param-in-external-functions\n  client: DynamicClient\n): Promise<void> => clearMetaMaskStorage(client);\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\n/**\n * Thrown when the MetaMask SDK's `connect()` call settles (resolves or\n * rejects) without ever emitting a `display_uri` event. `connectWithMetaMaskUri`\n * requires that event to produce the pairing URI/QR code; without it, there\n * is nothing to render and the caller would otherwise hang indefinitely\n * awaiting a URI that will never arrive.\n *\n * @example\n * ```ts\n * try {\n *   await connectWithMetaMaskUri({ onDisplayUri }, client);\n * } catch (error) {\n *   if (error instanceof MetaMaskDisplayUriMissingError) {\n *     // The MetaMask SDK never produced a pairing URI; surface a generic\n *     // connection failure instead of hanging.\n *   }\n * }\n * ```\n * @see connectWithMetaMaskUri\n * @see MetaMaskUnscopedNetworkError\n */\nexport class MetaMaskDisplayUriMissingError extends BaseError {\n  constructor() {\n    super({\n      cause: null,\n      code: 'metamask_display_uri_missing',\n      docsUrl: null,\n      name: 'MetaMaskDisplayUriMissingError',\n      shortMessage:\n        'MetaMask SDK completed the connection without emitting a display_uri. The connect helper requires the SDK to produce a pairing URI. Please reach out to Dynamic about this error.',\n    });\n  }\n}\n","import type { Chain, DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n  getDefaultClient,\n  getWalletProviderRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\n\nconst METAMASK_NAME_NEEDLE = 'metamask';\n\ntype GetMetaMaskExtensionWalletProviderKeyParams = {\n  /** Chain to scope the lookup to. */\n  chain: Chain;\n};\n\n/**\n * Returns the wallet provider key of the MetaMask browser extension announced\n * for the given chain (EIP-6963 on EVM, Wallet Standard on Solana), or\n * `undefined` when none is announced. Matches on normalized display name to\n * cover MetaMask, Flask, and other variants. Synchronous and safe to call from\n * a React render. Pass the returned key to `connectWithWalletProvider` to route\n * the connection through the announced provider; fall back to the chain's\n * `connectWithMetaMaskUri<Chain>` helper when `undefined`.\n *\n * @example\n * ```ts\n * const key = getMetaMaskExtensionWalletProviderKey({ chain: 'EVM' });\n * if (key) {\n *   await connectWithWalletProvider({ walletProviderKey: key });\n * }\n * ```\n *\n * @param params.chain - Chain to scope the lookup to.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The wallet provider key string, or `undefined` if no MetaMask extension is announced.\n * @see connectWithMetaMaskUri\n * @see clearMetaMaskStorage\n * @notInstrumented\n */\nexport const getMetaMaskExtensionWalletProviderKey = (\n  { chain }: GetMetaMaskExtensionWalletProviderKeyParams,\n  client: DynamicClient = getDefaultClient()\n): string | undefined => {\n  const providers = getWalletProviderRegistry(client).listProviders();\n\n  const match = providers.find(\n    (provider) =>\n      provider.chain === chain &&\n      provider.walletProviderType === WalletProviderEnum.BrowserExtension &&\n      provider.metadata.displayName\n        ?.toLowerCase()\n        .includes(METAMASK_NAME_NEEDLE)\n  );\n\n  return match?.key;\n};\n","import type {\n  Chain,\n  DynamicClient,\n  WalletAccount,\n  WalletProviderUriConnectionResult,\n} from '@dynamic-labs-sdk/client';\nimport { NoAddressFoundError } from '@dynamic-labs-sdk/client';\nimport type { WalletProvider } from '@dynamic-labs-sdk/client/core';\nimport {\n  WalletProviderPriority,\n  createDeferredPromise,\n  formatWalletAccountId,\n  getCore,\n  getDefaultClient,\n  getWalletProviderRegistry,\n  reconcileWalletAccountsAgainstClient,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { MetaMaskDisplayUriMissingError } from '../errors/MetaMaskDisplayUriMissingError';\nimport { getMetaMaskExtensionWalletProviderKey } from '../getMetaMaskExtensionWalletProviderKey';\nimport { getMetaMaskScopes } from '../getMetaMaskScopes';\nimport { getOrCreateMetaMaskClientInstanceManager } from '../metaMaskClientInstanceManager/getOrCreateMetaMaskClientInstanceManager';\n\nexport type ConnectWithMetaMaskUriParams = {\n  /** Whether to add the connected wallet account to the Dynamic client. Defaults to `true`. */\n  addToDynamicWalletAccounts?: boolean;\n  /** Chain being connected; used to scope the extension-installed lookup. */\n  chain: Chain;\n  /**\n   * Builds the chain-specific `WalletProvider` AFTER the pairing has been\n   * approved. Must NOT include a `connect` method — the provider is registered\n   * purely for signing routing and would otherwise leak into the wallet picker.\n   */\n  walletProviderBuilder: (client: DynamicClient) => WalletProvider;\n};\n\n/**\n * Drives a MetaMask SDK pairing for any chain and returns `{ approval, uri }`\n * so consumers can render the QR / hand the URI to a deeplink. Logs an\n * advisory warning when the extension is already announced for the chain —\n * pairing still proceeds, but the consumer is told which announced provider\n * key to route through for the best UX. Builds and registers the chain-\n * specific wallet provider only after pairing is approved; the provider\n * therefore never appears in the wallet picker (no `connect` method).\n *\n * @example\n * ```ts\n * const { uri, approval } = await connectWithMetaMaskUri({\n *   chain: 'EVM',\n *   walletProviderBuilder: (client) => buildEvmWalletProvider(client),\n * });\n * // Render QR code with `uri`, then await approval()\n * ```\n *\n * @param params.chain - Chain being connected; used to scope the extension-installed lookup.\n * @param params.walletProviderBuilder - Builds the chain-specific WalletProvider after pairing approval.\n * @param [params.addToDynamicWalletAccounts] - Whether to add the wallet to the client. Defaults to `true`.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns An object with `uri` (the pairing URI) and `approval` (async function resolving to wallet accounts).\n * @throws {MetaMaskDisplayUriMissingError} If `connect` settles before a display_uri is emitted.\n * @throws {NoAddressFoundError} If no address is returned after pairing approval.\n * @see clearMetaMaskStorage\n * @see getMetaMaskExtensionWalletProviderKey\n * @notInstrumented\n */\nexport const connectWithMetaMaskUri = async (\n  {\n    addToDynamicWalletAccounts = true,\n    chain,\n    walletProviderBuilder,\n  }: ConnectWithMetaMaskUriParams,\n  client: DynamicClient = getDefaultClient()\n): Promise<WalletProviderUriConnectionResult> => {\n  const { logger } = getCore(client);\n  const announcedKey = getMetaMaskExtensionWalletProviderKey({ chain }, client);\n  const uriDeferred = createDeferredPromise<string>();\n  const connectionScopes = getMetaMaskScopes({ chain }, client);\n  const metaMaskClientInstanceManager =\n    getOrCreateMetaMaskClientInstanceManager(client);\n\n  await metaMaskClientInstanceManager.clearMetaMaskStorageAndInstance();\n\n  const metaMaskClient =\n    await metaMaskClientInstanceManager.getMetaMaskClient();\n\n  if (announcedKey !== undefined) {\n    logger.warn(\n      `[MetaMask:Connect] Extension is announced for ${chain} as wallet provider \"${announcedKey}\"; proceeding with URI pairing anyway. Consider connectWithWalletProvider({ walletProviderKey: \"${announcedKey}\" }) for the best user experience.`\n    );\n  }\n\n  // eslint-disable-next-line custom-rules/require-single-object-param -- signature dictated by the SDK's `display_uri` event\n  const onDisplayUri = (displayUri: string) => {\n    logger.debug('[MetaMask:Connect] Received display_uri event', {\n      displayUri,\n    });\n\n    uriDeferred.resolve(displayUri);\n  };\n\n  metaMaskClientInstanceManager.events.on('display_uri', onDisplayUri);\n\n  logger.debug('[MetaMask:Connect] Requesting URI pairing', {\n    chain,\n    connectionScopes,\n  });\n\n  const connectPromise = metaMaskClient.connect(connectionScopes, []);\n\n  connectPromise\n    .then(() => {\n      uriDeferred.reject(new MetaMaskDisplayUriMissingError());\n    })\n    .catch((error: unknown) => {\n      uriDeferred.reject(error);\n    });\n\n  let uri: string;\n  try {\n    uri = await uriDeferred.promise;\n    logger.debug('[MetaMask:Connect] URI ready for display', { chain });\n  } finally {\n    metaMaskClientInstanceManager.events.off('display_uri', onDisplayUri);\n  }\n\n  const approval = async (): Promise<{ walletAccounts: WalletAccount[] }> => {\n    await connectPromise;\n    logger.debug('[MetaMask:Connect] Pairing approved', { chain });\n\n    const walletProvider = walletProviderBuilder(client);\n\n    // A chain extension (e.g. addMetaMaskEvmExtension) may have already\n    // registered a connect-less SDK placeholder under this same deterministic\n    // key at this same WALLET_SDK priority. register() only overwrites an\n    // existing key on a strictly higher priority, so registering directly\n    // here would silently no-op and leave the placeholder in place -- clear\n    // it first so the now-connected provider always takes its slot.\n    getWalletProviderRegistry(client).unregister(walletProvider.key);\n    getWalletProviderRegistry(client).register({\n      priority: WalletProviderPriority.WALLET_SDK,\n      walletProvider,\n    });\n\n    const { addresses } = await walletProvider.getConnectedAddresses();\n    logger.debug('[MetaMask:Connect] Connected addresses resolved', {\n      addresses,\n      chain,\n    });\n\n    // MetaMask SDK exposes a single active address per pairing (same model as\n    // EIP-1193 `eth_accounts`); we only materialize the first one.\n    const mainAddress = addresses[0];\n\n    if (mainAddress === undefined) {\n      throw new NoAddressFoundError();\n    }\n\n    const walletAccount: WalletAccount = {\n      address: mainAddress,\n      chain: walletProvider.chain,\n      id: formatWalletAccountId({\n        address: mainAddress,\n        chain: walletProvider.chain,\n        walletProviderKey: walletProvider.key,\n      }),\n      lastSelectedAt: null,\n      verifiedCredentialId: null,\n      walletProviderKey: walletProvider.key,\n    };\n\n    const walletAccounts = reconcileWalletAccountsAgainstClient(\n      {\n        addToDynamicWalletAccounts,\n        walletAccounts: [walletAccount],\n        walletProviderKey: walletProvider.key,\n      },\n      client\n    );\n\n    return { walletAccounts };\n  };\n  return { approval, uri };\n};\n","import { assertPackageVersion } from '@dynamic-labs-sdk/assert-package-version';\n\nimport { name, version } from '../../package.json';\nimport { forceImportMetaMaskSubPackages } from '../forceImportMetaMaskSubPackages';\n\nassertPackageVersion(name, version);\nforceImportMetaMaskSubPackages();\n\nexport { clearMetaMaskSessionStorage } from '../clearMetaMaskSessionStorage';\nexport { connectWithMetaMaskUri } from '../connectWithMetaMaskUri';\nexport type { ConnectWithMetaMaskUriParams } from '../connectWithMetaMaskUri';\nexport { MetaMaskDisplayUriMissingError } from '../errors/MetaMaskDisplayUriMissingError';\nexport { MetaMaskUnscopedNetworkError } from '../errors/MetaMaskUnscopedNetworkError';\nexport { getMetaMaskExtensionWalletProviderKey } from '../getMetaMaskExtensionWalletProviderKey';\nexport type { DisplayUriListener } from '../metamask.types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,+BAEX,WACkBA,sEAAqB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;ACJhD,IAAa,iCAAb,cAAoDC,mCAAU;CAC5D,cAAc;AACZ,QAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,cACE;GACH,CAAC;;;;;;ACzBN,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;AA+B7B,MAAa,yCACX,EAAE,SACF,8DAA0C,KACnB;AAYvB,qEAX4C,OAAO,CAAC,eAAe,CAE3C,MACrB,aACC,SAAS,UAAU,SACnB,SAAS,uBAAuBC,8CAAmB,oBACnD,SAAS,SAAS,aACd,aAAa,CACd,SAAS,qBAAqB,CACpC,EAEa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACYhB,MAAa,yBAAyB,OACpC,EACE,6BAA6B,MAC7B,OACA,yBAEF,8DAA0C,KACK;CAC/C,MAAM,EAAE,sDAAmB,OAAO;CAClC,MAAM,eAAe,sCAAsC,EAAE,OAAO,EAAE,OAAO;CAC7E,MAAM,wEAA6C;CACnD,MAAM,mBAAmBC,mEAAkB,EAAE,OAAO,EAAE,OAAO;CAC7D,MAAM,gCACJC,0FAAyC,OAAO;AAElD,OAAM,8BAA8B,iCAAiC;CAErE,MAAM,iBACJ,MAAM,8BAA8B,mBAAmB;AAEzD,KAAI,iBAAiB,OACnB,QAAO,KACL,iDAAiD,MAAM,uBAAuB,aAAa,kGAAkG,aAAa,oCAC3M;CAIH,MAAM,gBAAgB,eAAuB;AAC3C,SAAO,MAAM,iDAAiD,EAC5D,YACD,CAAC;AAEF,cAAY,QAAQ,WAAW;;AAGjC,+BAA8B,OAAO,GAAG,eAAe,aAAa;AAEpE,QAAO,MAAM,6CAA6C;EACxD;EACA;EACD,CAAC;CAEF,MAAM,iBAAiB,eAAe,QAAQ,kBAAkB,EAAE,CAAC;AAEnE,gBACG,WAAW;AACV,cAAY,OAAO,IAAI,gCAAgC,CAAC;GACxD,CACD,OAAO,UAAmB;AACzB,cAAY,OAAO,MAAM;GACzB;CAEJ,IAAIC;AACJ,KAAI;AACF,QAAM,MAAM,YAAY;AACxB,SAAO,MAAM,4CAA4C,EAAE,OAAO,CAAC;WAC3D;AACR,gCAA8B,OAAO,IAAI,eAAe,aAAa;;CAGvE,MAAM,WAAW,YAA0D;AACzE,QAAM;AACN,SAAO,MAAM,uCAAuC,EAAE,OAAO,CAAC;EAE9D,MAAM,iBAAiB,sBAAsB,OAAO;AAQpD,+DAA0B,OAAO,CAAC,WAAW,eAAe,IAAI;AAChE,+DAA0B,OAAO,CAAC,SAAS;GACzC,UAAUC,qDAAuB;GACjC;GACD,CAAC;EAEF,MAAM,EAAE,cAAc,MAAM,eAAe,uBAAuB;AAClE,SAAO,MAAM,mDAAmD;GAC9D;GACA;GACD,CAAC;EAIF,MAAM,cAAc,UAAU;AAE9B,MAAI,gBAAgB,OAClB,OAAM,IAAIC,8CAAqB;AAyBjC,SAAO,EAAE,wFARP;GACE;GACA,gBAAgB,CAhBiB;IACnC,SAAS;IACT,OAAO,eAAe;IACtB,6DAA0B;KACxB,SAAS;KACT,OAAO,eAAe;KACtB,mBAAmB,eAAe;KACnC,CAAC;IACF,gBAAgB;IAChB,sBAAsB;IACtB,mBAAmB,eAAe;IACnC,CAKkC;GAC/B,mBAAmB,eAAe;GACnC,EACD,OACD,EAEwB;;AAE3B,QAAO;EAAE;EAAU;EAAK;;;;;mEChLLC,uDAAMC,yDAAQ"}