@dynamic-labs-sdk/client 1.31.0 → 1.31.2

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 (168) hide show
  1. package/dist/{apiClient-DpzKqY39.native.esm.js → apiClient-d2qJyIvx.native.esm.js} +2 -2
  2. package/dist/{apiClient-DpzKqY39.native.esm.js.map → apiClient-d2qJyIvx.native.esm.js.map} +1 -1
  3. package/dist/core.cjs +78 -5
  4. package/dist/core.cjs.map +1 -1
  5. package/dist/core.esm.js +78 -8
  6. package/dist/core.esm.js.map +1 -1
  7. package/dist/core.native.esm.js +78 -8
  8. package/dist/core.native.esm.js.map +1 -1
  9. package/dist/errors/AmbiguousWalletChainError.d.ts +32 -0
  10. package/dist/errors/AmbiguousWalletChainError.d.ts.map +1 -0
  11. package/dist/errors/ConnectionUriHandlerMissingError.d.ts +37 -0
  12. package/dist/errors/ConnectionUriHandlerMissingError.d.ts.map +1 -0
  13. package/dist/errors/NoConnectionOptionAvailableError.d.ts +39 -0
  14. package/dist/errors/NoConnectionOptionAvailableError.d.ts.map +1 -0
  15. package/dist/errors/WalletOptionNotFoundError.d.ts +30 -0
  16. package/dist/errors/WalletOptionNotFoundError.d.ts.map +1 -0
  17. package/dist/exports/core.d.ts +8 -0
  18. package/dist/exports/core.d.ts.map +1 -1
  19. package/dist/exports/index.d.ts +8 -1
  20. package/dist/exports/index.d.ts.map +1 -1
  21. package/dist/{getNetworkProviderFromNetworkId-BN2jUhHm.esm.js → getNetworkProviderFromNetworkId-D9nx6Od5.esm.js} +29 -25
  22. package/dist/getNetworkProviderFromNetworkId-D9nx6Od5.esm.js.map +1 -0
  23. package/dist/{getNetworkProviderFromNetworkId-DUym3Qq0.native.esm.js → getNetworkProviderFromNetworkId-DF9kPibD.native.esm.js} +30 -26
  24. package/dist/getNetworkProviderFromNetworkId-DF9kPibD.native.esm.js.map +1 -0
  25. package/dist/{getNetworkProviderFromNetworkId-BoNAPSjx.cjs → getNetworkProviderFromNetworkId-DueBnAl6.cjs} +23 -19
  26. package/dist/{getNetworkProviderFromNetworkId-BoNAPSjx.cjs.map → getNetworkProviderFromNetworkId-DueBnAl6.cjs.map} +1 -1
  27. package/dist/{getSignedSessionId-DxpqG4pv.esm.js → getSignedSessionId-5q4uyZsv.native.esm.js} +34 -4
  28. package/dist/getSignedSessionId-5q4uyZsv.native.esm.js.map +1 -0
  29. package/dist/{getSignedSessionId-9ADIJCl1.cjs → getSignedSessionId-B5oxmSTs.cjs} +39 -3
  30. package/dist/getSignedSessionId-B5oxmSTs.cjs.map +1 -0
  31. package/dist/{getSignedSessionId-Dr4Ic68X.native.esm.js → getSignedSessionId-BKfQycNo.esm.js} +34 -4
  32. package/dist/getSignedSessionId-BKfQycNo.esm.js.map +1 -0
  33. package/dist/{getVerifiedCredentialForWalletAccount-C2o5idph.cjs → getVerifiedCredentialForWalletAccount-Bx0HlvfW.cjs} +2 -2
  34. package/dist/{getVerifiedCredentialForWalletAccount-C2o5idph.cjs.map → getVerifiedCredentialForWalletAccount-Bx0HlvfW.cjs.map} +1 -1
  35. package/dist/{getVerifiedCredentialForWalletAccount-Cjwoeej7.esm.js → getVerifiedCredentialForWalletAccount-_3MExyld.esm.js} +2 -2
  36. package/dist/{getVerifiedCredentialForWalletAccount-Cjwoeej7.esm.js.map → getVerifiedCredentialForWalletAccount-_3MExyld.esm.js.map} +1 -1
  37. package/dist/index.cjs +536 -80
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.esm.js +534 -83
  40. package/dist/index.esm.js.map +1 -1
  41. package/dist/index.native.esm.js +492 -83
  42. package/dist/index.native.esm.js.map +1 -1
  43. package/dist/{isMfaRequiredForAction-BIBmJbV9.esm.js → isMfaRequiredForAction-BDmY2_Sj.esm.js} +2 -2
  44. package/dist/{isMfaRequiredForAction-BIBmJbV9.esm.js.map → isMfaRequiredForAction-BDmY2_Sj.esm.js.map} +1 -1
  45. package/dist/{isMfaRequiredForAction-DuSU67yq.native.esm.js → isMfaRequiredForAction-BrRCSvEX.native.esm.js} +2 -2
  46. package/dist/{isMfaRequiredForAction-DuSU67yq.native.esm.js.map → isMfaRequiredForAction-BrRCSvEX.native.esm.js.map} +1 -1
  47. package/dist/{isMfaRequiredForAction-yM84r7l7.cjs → isMfaRequiredForAction-DnKzPDZk.cjs} +2 -2
  48. package/dist/{isMfaRequiredForAction-yM84r7l7.cjs.map → isMfaRequiredForAction-DnKzPDZk.cjs.map} +1 -1
  49. package/dist/{isUserOnboardingComplete-BRTOnK8V.cjs → isUserOnboardingComplete-7GzNYU2g.cjs} +3 -3
  50. package/dist/{isUserOnboardingComplete-BRTOnK8V.cjs.map → isUserOnboardingComplete-7GzNYU2g.cjs.map} +1 -1
  51. package/dist/{isUserOnboardingComplete-DCIlkCub.native.esm.js → isUserOnboardingComplete-BfMMBtkF.native.esm.js} +3 -3
  52. package/dist/{isUserOnboardingComplete-DCIlkCub.native.esm.js.map → isUserOnboardingComplete-BfMMBtkF.native.esm.js.map} +1 -1
  53. package/dist/{isUserOnboardingComplete-B2Ha2dkP.esm.js → isUserOnboardingComplete-D1-QluDm.esm.js} +3 -3
  54. package/dist/{isUserOnboardingComplete-B2Ha2dkP.esm.js.map → isUserOnboardingComplete-D1-QluDm.esm.js.map} +1 -1
  55. package/dist/{logoutWithReason-HqGlUccb.native.esm.js → logoutWithReason-3UICYir7.native.esm.js} +2 -2
  56. package/dist/{logoutWithReason-HqGlUccb.native.esm.js.map → logoutWithReason-3UICYir7.native.esm.js.map} +1 -1
  57. package/dist/{logoutWithReason-DV89zJmJ.esm.js → logoutWithReason-CHyuBHdx.esm.js} +2 -2
  58. package/dist/{logoutWithReason-DV89zJmJ.esm.js.map → logoutWithReason-CHyuBHdx.esm.js.map} +1 -1
  59. package/dist/{logoutWithReason-DlA15deT.cjs → logoutWithReason-C_T7KddM.cjs} +2 -2
  60. package/dist/{logoutWithReason-DlA15deT.cjs.map → logoutWithReason-C_T7KddM.cjs.map} +1 -1
  61. package/dist/{migrateFromFireblocks-CiOS4_Nq.esm.js → migrateFromFireblocks-BMO3u6rO.esm.js} +2 -2
  62. package/dist/{migrateFromFireblocks-CiOS4_Nq.esm.js.map → migrateFromFireblocks-BMO3u6rO.esm.js.map} +1 -1
  63. package/dist/{migrateFromFireblocks-CqIpxGRS.cjs → migrateFromFireblocks-C9Kuke5V.cjs} +2 -2
  64. package/dist/{migrateFromFireblocks-CqIpxGRS.cjs.map → migrateFromFireblocks-C9Kuke5V.cjs.map} +1 -1
  65. package/dist/{migrateFromFireblocks-DnQsGmIW.native.esm.js → migrateFromFireblocks-DJt9bktR.native.esm.js} +2 -2
  66. package/dist/{migrateFromFireblocks-DnQsGmIW.native.esm.js.map → migrateFromFireblocks-DJt9bktR.native.esm.js.map} +1 -1
  67. package/dist/modules/auth/social/oauth/clearSocialRedirectParams/clearSocialRedirectParams.d.ts +7 -1
  68. package/dist/modules/auth/social/oauth/clearSocialRedirectParams/clearSocialRedirectParams.d.ts.map +1 -1
  69. package/dist/modules/auth/social/oauth/clearSocialRedirectParams/clearSocialRedirectParams.types.d.ts +4 -0
  70. package/dist/modules/auth/social/oauth/clearSocialRedirectParams/clearSocialRedirectParams.types.d.ts.map +1 -0
  71. package/dist/modules/auth/social/oauth/completeSocialRedirect/completeSocialRedirect.d.ts +9 -0
  72. package/dist/modules/auth/social/oauth/completeSocialRedirect/completeSocialRedirect.d.ts.map +1 -1
  73. package/dist/modules/walletOptionsCatalogue/buildInAppBrowserOptions/buildInAppBrowserOptions.d.ts +9 -1
  74. package/dist/modules/walletOptionsCatalogue/buildInAppBrowserOptions/buildInAppBrowserOptions.d.ts.map +1 -1
  75. package/dist/modules/walletOptionsCatalogue/buildInstallationUrlsByWalletOptionKey/buildInstallationUrlsByWalletOptionKey.d.ts +7 -1
  76. package/dist/modules/walletOptionsCatalogue/buildInstallationUrlsByWalletOptionKey/buildInstallationUrlsByWalletOptionKey.d.ts.map +1 -1
  77. package/dist/modules/walletOptionsCatalogue/filterConnectionOptionsByEnabledChains/filterConnectionOptionsByEnabledChains.d.ts +30 -0
  78. package/dist/modules/walletOptionsCatalogue/filterConnectionOptionsByEnabledChains/filterConnectionOptionsByEnabledChains.d.ts.map +1 -0
  79. package/dist/modules/walletOptionsCatalogue/filterConnectionOptionsByEnabledChains/index.d.ts +2 -0
  80. package/dist/modules/walletOptionsCatalogue/filterConnectionOptionsByEnabledChains/index.d.ts.map +1 -0
  81. package/dist/modules/walletOptionsCatalogue/getWalletOptionsCatalogue/getWalletOptionsCatalogue.d.ts +4 -0
  82. package/dist/modules/walletOptionsCatalogue/getWalletOptionsCatalogue/getWalletOptionsCatalogue.d.ts.map +1 -1
  83. package/dist/modules/walletOptionsCatalogue/walletOptionsCatalogue.types.d.ts +2 -1
  84. package/dist/modules/walletOptionsCatalogue/walletOptionsCatalogue.types.d.ts.map +1 -1
  85. package/dist/modules/wallets/connectWallet.types.d.ts +35 -0
  86. package/dist/modules/wallets/connectWallet.types.d.ts.map +1 -0
  87. package/dist/modules/wallets/connectWithUriConnectionOption/connectWithUriConnectionOption.d.ts +52 -0
  88. package/dist/modules/wallets/connectWithUriConnectionOption/connectWithUriConnectionOption.d.ts.map +1 -0
  89. package/dist/modules/wallets/connectWithUriConnectionOption/getConnectionUriDeeplink/getConnectionUriDeeplink.d.ts +34 -0
  90. package/dist/modules/wallets/connectWithUriConnectionOption/getConnectionUriDeeplink/getConnectionUriDeeplink.d.ts.map +1 -0
  91. package/dist/modules/wallets/connectWithUriConnectionOption/getConnectionUriDeeplink/index.d.ts +2 -0
  92. package/dist/modules/wallets/connectWithUriConnectionOption/getConnectionUriDeeplink/index.d.ts.map +1 -0
  93. package/dist/modules/wallets/connectWithUriConnectionOption/index.d.ts +2 -0
  94. package/dist/modules/wallets/connectWithUriConnectionOption/index.d.ts.map +1 -0
  95. package/dist/modules/wallets/networks/getEnabledChains/getEnabledChains.d.ts +25 -0
  96. package/dist/modules/wallets/networks/getEnabledChains/getEnabledChains.d.ts.map +1 -0
  97. package/dist/modules/wallets/networks/getEnabledChains/index.d.ts +2 -0
  98. package/dist/modules/wallets/networks/getEnabledChains/index.d.ts.map +1 -0
  99. package/dist/modules/wallets/networks/networkProviderBuilderRegistry/createNetworkProviderBuilderRegistry/createNetworkProviderBuilderRegistry.d.ts +2 -1
  100. package/dist/modules/wallets/networks/networkProviderBuilderRegistry/createNetworkProviderBuilderRegistry/createNetworkProviderBuilderRegistry.d.ts.map +1 -1
  101. package/dist/modules/wallets/networks/networkProviderBuilderRegistry/events.d.ts +16 -0
  102. package/dist/modules/wallets/networks/networkProviderBuilderRegistry/events.d.ts.map +1 -0
  103. package/dist/modules/wallets/redirectToInAppBrowser/index.d.ts +2 -0
  104. package/dist/modules/wallets/redirectToInAppBrowser/index.d.ts.map +1 -0
  105. package/dist/modules/wallets/redirectToInAppBrowser/redirectToInAppBrowser.d.ts +60 -0
  106. package/dist/modules/wallets/redirectToInAppBrowser/redirectToInAppBrowser.d.ts.map +1 -0
  107. package/dist/modules/wallets/resolveWalletConnectionOption/index.d.ts +3 -0
  108. package/dist/modules/wallets/resolveWalletConnectionOption/index.d.ts.map +1 -0
  109. package/dist/modules/wallets/resolveWalletConnectionOption/resolveWalletConnectionOption.d.ts +36 -0
  110. package/dist/modules/wallets/resolveWalletConnectionOption/resolveWalletConnectionOption.d.ts.map +1 -0
  111. package/dist/modules/wallets/uriConnectionStarterRegistry/createUriConnectionStarterRegistry/createUriConnectionStarterRegistry.d.ts +22 -0
  112. package/dist/modules/wallets/uriConnectionStarterRegistry/createUriConnectionStarterRegistry/createUriConnectionStarterRegistry.d.ts.map +1 -0
  113. package/dist/modules/wallets/uriConnectionStarterRegistry/createUriConnectionStarterRegistry/index.d.ts +2 -0
  114. package/dist/modules/wallets/uriConnectionStarterRegistry/createUriConnectionStarterRegistry/index.d.ts.map +1 -0
  115. package/dist/modules/wallets/uriConnectionStarterRegistry/events.d.ts +18 -0
  116. package/dist/modules/wallets/uriConnectionStarterRegistry/events.d.ts.map +1 -0
  117. package/dist/modules/wallets/uriConnectionStarterRegistry/getUriConnectionStarterRegistry/getUriConnectionStarterRegistry.d.ts +22 -0
  118. package/dist/modules/wallets/uriConnectionStarterRegistry/getUriConnectionStarterRegistry/getUriConnectionStarterRegistry.d.ts.map +1 -0
  119. package/dist/modules/wallets/uriConnectionStarterRegistry/getUriConnectionStarterRegistry/index.d.ts +2 -0
  120. package/dist/modules/wallets/uriConnectionStarterRegistry/getUriConnectionStarterRegistry/index.d.ts.map +1 -0
  121. package/dist/modules/wallets/uriConnectionStarterRegistry/index.d.ts +3 -0
  122. package/dist/modules/wallets/uriConnectionStarterRegistry/index.d.ts.map +1 -0
  123. package/dist/modules/wallets/uriConnectionStarterRegistry/uriConnectionStarterRegistry.types.d.ts +32 -0
  124. package/dist/modules/wallets/uriConnectionStarterRegistry/uriConnectionStarterRegistry.types.d.ts.map +1 -0
  125. package/dist/modules/wallets/walletProviderUriConnection.types.d.ts +19 -0
  126. package/dist/modules/wallets/walletProviderUriConnection.types.d.ts.map +1 -1
  127. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  128. package/dist/utils/buildInAppBrowserUrl/buildInAppBrowserUrl.d.ts +32 -0
  129. package/dist/utils/buildInAppBrowserUrl/buildInAppBrowserUrl.d.ts.map +1 -0
  130. package/dist/utils/buildInAppBrowserUrl/index.d.ts +2 -0
  131. package/dist/utils/buildInAppBrowserUrl/index.d.ts.map +1 -0
  132. package/dist/utils/getPreferredWalletDeepLink/getPreferredWalletDeepLink.d.ts +33 -0
  133. package/dist/utils/getPreferredWalletDeepLink/getPreferredWalletDeepLink.d.ts.map +1 -0
  134. package/dist/utils/getPreferredWalletDeepLink/index.d.ts +2 -0
  135. package/dist/utils/getPreferredWalletDeepLink/index.d.ts.map +1 -0
  136. package/dist/utils/isAndroid/index.d.ts +2 -0
  137. package/dist/utils/isAndroid/index.d.ts.map +1 -0
  138. package/dist/utils/isAndroid/isAndroid.d.ts +20 -0
  139. package/dist/utils/isAndroid/isAndroid.d.ts.map +1 -0
  140. package/dist/utils/isIOS/index.d.ts +2 -0
  141. package/dist/utils/isIOS/index.d.ts.map +1 -0
  142. package/dist/utils/isIOS/isIOS.d.ts +23 -0
  143. package/dist/utils/isIOS/isIOS.d.ts.map +1 -0
  144. package/dist/utils/isMobile/isMobile.d.ts +17 -36
  145. package/dist/utils/isMobile/isMobile.d.ts.map +1 -1
  146. package/dist/utils/userAgentChecks/userAgentChecks.d.ts +35 -0
  147. package/dist/utils/userAgentChecks/userAgentChecks.d.ts.map +1 -0
  148. package/dist/{waas-CkQYVo6U.native.esm.js → waas-9QajYGeK.native.esm.js} +4 -4
  149. package/dist/{waas-CkQYVo6U.native.esm.js.map → waas-9QajYGeK.native.esm.js.map} +1 -1
  150. package/dist/{waas-BOKafCeH.cjs → waas-Bxsd0-HG.cjs} +4 -4
  151. package/dist/{waas-BOKafCeH.cjs.map → waas-Bxsd0-HG.cjs.map} +1 -1
  152. package/dist/{waas-CUDgU2pl.esm.js → waas-T_dHXyI9.esm.js} +4 -4
  153. package/dist/{waas-CUDgU2pl.esm.js.map → waas-T_dHXyI9.esm.js.map} +1 -1
  154. package/dist/waas.cjs +4 -4
  155. package/dist/waas.esm.js +4 -4
  156. package/dist/waas.native.esm.js +4 -4
  157. package/dist/waasCore.cjs +10 -40
  158. package/dist/waasCore.cjs.map +1 -1
  159. package/dist/waasCore.esm.js +5 -35
  160. package/dist/waasCore.esm.js.map +1 -1
  161. package/dist/waasCore.native.esm.js +5 -35
  162. package/dist/waasCore.native.esm.js.map +1 -1
  163. package/package.json +2 -2
  164. package/dist/getNetworkProviderFromNetworkId-BN2jUhHm.esm.js.map +0 -1
  165. package/dist/getNetworkProviderFromNetworkId-DUym3Qq0.native.esm.js.map +0 -1
  166. package/dist/getSignedSessionId-9ADIJCl1.cjs.map +0 -1
  167. package/dist/getSignedSessionId-Dr4Ic68X.native.esm.js.map +0 -1
  168. package/dist/getSignedSessionId-DxpqG4pv.esm.js.map +0 -1
package/dist/index.esm.js CHANGED
@@ -1,14 +1,14 @@
1
- import { $ as updateNoncePoolStorage, A as getWalletProviders, C as initializeWaasClientsForEagerRecovery, Ct as BaseError, Et as version, F as onEvent, G as splitWalletProviderKey, H as CHAINS_INFO_MAP, I as onceEvent, M as getWalletProviderRegistry, N as emitEvent, P as offEvent, Q as fetchAndStoreNonces, R as getWalletAccounts, St as getCore, Tt as name, U as formatWalletAccountId, V as getChainFromVerifiedCredentialChain, W as normalizeAddress, Z as getNonce, _ as upsertElevatedAccessToken, _t as randomString, a as retryOnFail, at as MfaInvalidOtpError, b as InvalidParamError, bt as setDefaultClient, c as createApiClient, ct as APIError, d as scrubParameters, dt as SDK_API_CORE_VERSION, et as createStorageKeySchema, f as DEFAULT_PII_FIELDS, g as updateAuthFromVerifyResponse, gt as getElevatedAccessToken, h as extractSessionId, ht as ValueMustBeDefinedError, i as isSignedIn, it as MfaRateLimitedError, j as WalletProviderPriority, l as __refreshAuth_wrapped, m as getOperatingSystem, mt as assertDefined, n as generateSessionKeys, nt as UnauthorizedError, o as getWalletProviderFromWalletAccount, ot as LinkCredentialError, p as getUserAgent, pt as isCookieEnabled, q as isUserMissingMfaAuth, r as fetchProjectSettings, rt as SandboxMaximumThresholdReachedError, s as NoWalletProviderFoundError, st as InvalidExternalAuthError, t as __logoutWithReason_wrapped, tt as NONCE_POOL_SIZE, u as instrumentFunction, ut as DYNAMIC_ICONIC_SPRITE_URL, v as parseElevatedAccessToken, vt as getPlatform, wt as TokenScope, x as checkAndRaiseWalletAccountsChangedEvent, y as decodeJwt, yt as getDefaultClient } from "./logoutWithReason-DV89zJmJ.esm.js";
2
- import { a as TransactionBroadcastError, i as NotWaasWalletAccountError } from "./migrateFromFireblocks-CiOS4_Nq.esm.js";
3
- import { Q as WaasChainEnum } from "./waas-CUDgU2pl.esm.js";
4
- import { A as createEventEmitter, B as REFRESH_USER_STATE_FROM_VALID_TOKEN_TRACKER_KEY, C as getKeychainIndexedDBName, D as assertSafeNavigationUrl, E as createKeychainService, F as createAppForegroundSubscriber, H as subscribeWithSelector, I as FETCH_PROJECT_SETTINGS_TRACKER_KEY, J as UnavailableInServerSideError, K as createLocalStorageAdapter, L as GENERATE_SESSION_KEYS_TRACKER_KEY, N as CannotTrackError, P as createDeferredPromise, R as INITIALIZE_STORAGE_SYNC_TRACKER_KEY, S as MergeAccountsConfirmationError, T as assertSafeDeeplinkUrl, U as isEqualShallow, V as getBuffer, W as createStorage, _ as consumeCaptchaToken, a as verifyMessageSignatureOwnership, b as WalletAlreadyLinkedToAnotherUserError, c as formatSignInMessage, d as updateWalletProviderKeysForVerifiedCredentials, f as setUnverifiedWalletAccounts, g as MethodNotImplementedError, h as __setCaptchaToken_wrapped, i as getNetworksData, j as createCrossTabBroadcast, k as createLogger, l as getAppMetadata, m as hasExtension, o as removeUnverifiedWalletAccount, p as createVisit, q as isServerSideRendering, s as createSignInMessageStatement, t as getNetworkProviderFromNetworkId, u as reconcileWalletAccountsAgainstClient, v as isCaptchaRequired, w as createRealtimeService, x as NoNetworkProvidersError, y as WalletScreeningBlockedError, z as REFRESH_USER_STATE_FROM_COOKIE_TRACKER_KEY } from "./getNetworkProviderFromNetworkId-BN2jUhHm.esm.js";
5
- import { n as getWalletProviderByKey, t as getVerifiedCredentialForWalletAccount } from "./getVerifiedCredentialForWalletAccount-Cjwoeej7.esm.js";
6
- import { a as WaasRbacStaleRetryUnsafeError, i as preconnectWaasIframe, n as isPendingRecoveryCodesAcknowledgment, o as WaasOnboardingIncompleteError, r as isDeviceRegistrationRequired, s as WaasLoadFailedError, t as isUserOnboardingComplete } from "./isUserOnboardingComplete-B2Ha2dkP.esm.js";
7
- import { n as getMfaMethods, r as __consumeMfaToken_wrapped, t as isMfaRequiredForAction } from "./isMfaRequiredForAction-BIBmJbV9.esm.js";
1
+ import { $ as updateNoncePoolStorage, A as getWalletProviders, C as initializeWaasClientsForEagerRecovery, Ct as BaseError, Et as version, F as onEvent, G as splitWalletProviderKey, H as CHAINS_INFO_MAP, I as onceEvent, M as getWalletProviderRegistry, N as emitEvent, P as offEvent, Q as fetchAndStoreNonces, R as getWalletAccounts, St as getCore, Tt as name, U as formatWalletAccountId, V as getChainFromVerifiedCredentialChain, W as normalizeAddress, Z as getNonce, _ as upsertElevatedAccessToken, _t as randomString, a as retryOnFail, at as MfaInvalidOtpError, b as InvalidParamError, bt as setDefaultClient, c as createApiClient, ct as APIError, d as scrubParameters, dt as SDK_API_CORE_VERSION, et as createStorageKeySchema, f as DEFAULT_PII_FIELDS, g as updateAuthFromVerifyResponse, gt as getElevatedAccessToken, h as extractSessionId, ht as ValueMustBeDefinedError, i as isSignedIn, it as MfaRateLimitedError, j as WalletProviderPriority, l as __refreshAuth_wrapped, m as getOperatingSystem, mt as assertDefined, n as generateSessionKeys, nt as UnauthorizedError, o as getWalletProviderFromWalletAccount, ot as LinkCredentialError, p as getUserAgent, pt as isCookieEnabled, q as isUserMissingMfaAuth, r as fetchProjectSettings, rt as SandboxMaximumThresholdReachedError, s as NoWalletProviderFoundError, st as InvalidExternalAuthError, t as __logoutWithReason_wrapped, tt as NONCE_POOL_SIZE, u as instrumentFunction, ut as DYNAMIC_ICONIC_SPRITE_URL, v as parseElevatedAccessToken, vt as getPlatform, wt as TokenScope, x as checkAndRaiseWalletAccountsChangedEvent, y as decodeJwt, yt as getDefaultClient } from "./logoutWithReason-CHyuBHdx.esm.js";
2
+ import { a as TransactionBroadcastError, i as NotWaasWalletAccountError } from "./migrateFromFireblocks-BMO3u6rO.esm.js";
3
+ import { Q as WaasChainEnum } from "./waas-T_dHXyI9.esm.js";
4
+ import { A as createEventEmitter, B as REFRESH_USER_STATE_FROM_VALID_TOKEN_TRACKER_KEY, C as getKeychainIndexedDBName, D as assertSafeNavigationUrl, E as createKeychainService, F as createAppForegroundSubscriber, H as subscribeWithSelector, I as FETCH_PROJECT_SETTINGS_TRACKER_KEY, J as UnavailableInServerSideError, K as createLocalStorageAdapter, L as GENERATE_SESSION_KEYS_TRACKER_KEY, N as CannotTrackError, P as createDeferredPromise, R as INITIALIZE_STORAGE_SYNC_TRACKER_KEY, S as MergeAccountsConfirmationError, T as assertSafeDeeplinkUrl, U as isEqualShallow, V as getBuffer, W as createStorage, _ as consumeCaptchaToken, a as removeUnverifiedWalletAccount, b as WalletAlreadyLinkedToAnotherUserError, c as getAppMetadata, d as setUnverifiedWalletAccounts, f as createVisit, g as MethodNotImplementedError, h as __setCaptchaToken_wrapped, i as verifyMessageSignatureOwnership, j as createCrossTabBroadcast, k as createLogger, l as reconcileWalletAccountsAgainstClient, m as hasExtension, o as createSignInMessageStatement, p as getNetworkProviderBuilderRegistry, q as isServerSideRendering, r as getNetworksData, s as formatSignInMessage, t as getNetworkProviderFromNetworkId, u as updateWalletProviderKeysForVerifiedCredentials, v as isCaptchaRequired, w as createRealtimeService, x as NoNetworkProvidersError, y as WalletScreeningBlockedError, z as REFRESH_USER_STATE_FROM_COOKIE_TRACKER_KEY } from "./getNetworkProviderFromNetworkId-D9nx6Od5.esm.js";
5
+ import { n as getWalletProviderByKey, t as getVerifiedCredentialForWalletAccount } from "./getVerifiedCredentialForWalletAccount-_3MExyld.esm.js";
6
+ import { a as WaasRbacStaleRetryUnsafeError, i as preconnectWaasIframe, n as isPendingRecoveryCodesAcknowledgment, o as WaasOnboardingIncompleteError, r as isDeviceRegistrationRequired, s as WaasLoadFailedError, t as isUserOnboardingComplete } from "./isUserOnboardingComplete-D1-QluDm.esm.js";
7
+ import { n as getMfaMethods, r as __consumeMfaToken_wrapped, t as isMfaRequiredForAction } from "./isMfaRequiredForAction-BDmY2_Sj.esm.js";
8
8
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
9
9
  import { AuthModeEnum, CaptchaProviderEnum as CaptchaProviderEnum$1, ChainEnum, ExchangeKeyEnum, JwtVerifiedCredentialFormatEnum as JwtVerifiedCredentialFormatEnum$1, MFAAction as MFAAction$1, MfaBackupCodeAcknowledgement, ProviderEnum as ProviderEnum$1, TokenScope as TokenScope$1, WaasBackupOptionsEnum, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
10
10
  import * as z from "zod/mini";
11
- import { EventEmitter as EventEmitter$1 } from "eventemitter3";
11
+ import { EventEmitter } from "eventemitter3";
12
12
  import { browserSupportsWebAuthn, startAuthentication, startRegistration } from "@simplewebauthn/browser";
13
13
 
14
14
  //#region src/modules/state/raiseStateEvents/events.ts
@@ -556,7 +556,7 @@ const initializeClient = async (client = getDefaultClient()) => {
556
556
  */
557
557
  if (isCookieEnabled(client)) await __refreshAuth_wrapped(client).catch(async (error) => {
558
558
  if (error.status === 401) {
559
- core.logger.error("Session expired during initialization", error);
559
+ core.logger.warn("Session expired during initialization", error);
560
560
  if (client.user) await __logoutWithReason_wrapped({ reason: "session-refresh-unauthorized" }, client);
561
561
  } else throw error;
562
562
  });
@@ -631,7 +631,7 @@ const createAsyncTrack = () => {
631
631
  * This ensures no process is missed (as it would throw when tracked on a different node tick).
632
632
  */
633
633
  let isTrackEnabled = true;
634
- const eventEmitter = new EventEmitter$1();
634
+ const eventEmitter = new EventEmitter();
635
635
  const allSettledPromise = createDeferredPromise();
636
636
  const tracker = /* @__PURE__ */ new Map();
637
637
  /**
@@ -1203,6 +1203,46 @@ const __createDynamicClient_wrapped = instrumentFunction({
1203
1203
  }
1204
1204
  });
1205
1205
 
1206
+ //#endregion
1207
+ //#region src/errors/AmbiguousWalletChainError.ts
1208
+ /**
1209
+ * Thrown when a wallet can be connected on more than one of the client's
1210
+ * enabled chains and no chain was passed to `connectWallet`.
1211
+ *
1212
+ * Multi-chain wallets such as MetaMask or Phantom connect to a different
1213
+ * account per chain, so the chain has to be an explicit choice rather than one
1214
+ * Dynamic makes on the customer's behalf.
1215
+ *
1216
+ * @example
1217
+ * ```ts
1218
+ * try {
1219
+ * await connectWallet({ walletKey: 'phantom' });
1220
+ * } catch (error) {
1221
+ * if (error instanceof AmbiguousWalletChainError) {
1222
+ * await connectWallet({ chain: 'SOL', walletKey: 'phantom' });
1223
+ * }
1224
+ * }
1225
+ * ```
1226
+ * @see connectWallet
1227
+ * @see getWalletOptionsCatalogue
1228
+ */
1229
+ var AmbiguousWalletChainError = class extends BaseError {
1230
+ constructor({ chains, walletKey }) {
1231
+ super({
1232
+ cause: null,
1233
+ code: "ambiguous_wallet_chain",
1234
+ docsUrl: null,
1235
+ metaMessages: [
1236
+ `Wallet key: ${walletKey}`,
1237
+ `Available chains: ${chains.join(", ")}`,
1238
+ "Pass the chain param to pick which one to connect on."
1239
+ ],
1240
+ name: "AmbiguousWalletChainError",
1241
+ shortMessage: `Wallet ${walletKey} can be connected on more than one chain, so the chain param is required.`
1242
+ });
1243
+ }
1244
+ };
1245
+
1206
1246
  //#endregion
1207
1247
  //#region src/errors/CheckoutSessionTokenMissingError.ts
1208
1248
  var CheckoutSessionTokenMissingError = class extends BaseError {
@@ -1602,6 +1642,54 @@ var NoAddressFoundError = class extends BaseError {
1602
1642
  }
1603
1643
  };
1604
1644
 
1645
+ //#endregion
1646
+ //#region src/errors/NoConnectionOptionAvailableError.ts
1647
+ /**
1648
+ * Thrown when a wallet exists in the catalogue but has no connection option
1649
+ * this client can drive.
1650
+ *
1651
+ * Happens when the wallet is not installed on the device and no URI pairing is
1652
+ * available for it — either the wallet does not support one, or the chain
1653
+ * extension providing that pairing was not added to the client.
1654
+ *
1655
+ * @example
1656
+ * ```ts
1657
+ * try {
1658
+ * await connectWallet({ walletKey: 'rainbow' });
1659
+ * } catch (error) {
1660
+ * if (error instanceof NoConnectionOptionAvailableError) {
1661
+ * promptWalletInstall(error.installationUrls);
1662
+ * }
1663
+ * }
1664
+ * ```
1665
+ * @see connectWallet
1666
+ * @see getWalletOptionsCatalogue
1667
+ */
1668
+ var NoConnectionOptionAvailableError = class extends BaseError {
1669
+ /**
1670
+ * Install / download links for the wallet, when the wallet book carries any
1671
+ * for this device. Prompt the user to install the wallet with these.
1672
+ */
1673
+ installationUrls;
1674
+ constructor({ chain, installationUrls, walletKey }) {
1675
+ super({
1676
+ cause: null,
1677
+ code: "no_connection_option_available",
1678
+ docsUrl: null,
1679
+ metaMessages: [
1680
+ `Wallet key: ${walletKey}`,
1681
+ ...chain ? [`Chain: ${chain}`] : [],
1682
+ "The wallet is not installed and no URI pairing is available for it on this client.",
1683
+ "URI pairing requires the chain extension that provides it — addWalletConnect<Chain>Extension for WalletConnect, addMetaMask<Chain>Extension for MetaMask.",
1684
+ "Use this error's installationUrls to prompt the user to install the wallet."
1685
+ ],
1686
+ name: "NoConnectionOptionAvailableError",
1687
+ shortMessage: `No connection option available for wallet: ${walletKey}`
1688
+ });
1689
+ this.installationUrls = installationUrls;
1690
+ }
1691
+ };
1692
+
1605
1693
  //#endregion
1606
1694
  //#region src/errors/NoPasskeyCredentialsFoundError.ts
1607
1695
  var NoPasskeyCredentialsFoundError = class extends BaseError {
@@ -1796,6 +1884,46 @@ var WalletAccountNotSelectedError = class extends BaseError {
1796
1884
  }
1797
1885
  };
1798
1886
 
1887
+ //#endregion
1888
+ //#region src/errors/WalletOptionNotFoundError.ts
1889
+ /**
1890
+ * Thrown when `connectWallet` is given a wallet key that no wallet option in
1891
+ * the catalogue matches.
1892
+ *
1893
+ * A wallet is only surfaced for the chains this client has an extension for, so
1894
+ * this also covers keys that are valid in the wallet book but not reachable
1895
+ * with the client's current chain extensions.
1896
+ *
1897
+ * @example
1898
+ * ```ts
1899
+ * try {
1900
+ * await connectWallet({ walletKey: 'metmask' });
1901
+ * } catch (error) {
1902
+ * if (error instanceof WalletOptionNotFoundError) {
1903
+ * showUnknownWalletMessage();
1904
+ * }
1905
+ * }
1906
+ * ```
1907
+ * @see connectWallet
1908
+ * @see getWalletOptionsCatalogue
1909
+ */
1910
+ var WalletOptionNotFoundError = class extends BaseError {
1911
+ constructor({ walletKey }) {
1912
+ super({
1913
+ cause: null,
1914
+ code: "wallet_option_not_found",
1915
+ docsUrl: null,
1916
+ metaMessages: [
1917
+ `Wallet key: ${walletKey}`,
1918
+ "The key must match a wallet option surfaced by getWalletOptionsCatalogue (e.g. \"metamask\", \"phantom\").",
1919
+ "A wallet is only surfaced on chains this client has an extension for, so make sure the relevant chain extension is added."
1920
+ ],
1921
+ name: "WalletOptionNotFoundError",
1922
+ shortMessage: `No wallet option found for key: ${walletKey}`
1923
+ });
1924
+ }
1925
+ };
1926
+
1799
1927
  //#endregion
1800
1928
  //#region src/errors/WalletProviderMethodUnavailableError.ts
1801
1929
  var WalletProviderMethodUnavailableError = class extends BaseError {
@@ -2521,6 +2649,10 @@ const __authenticateWithSocial_wrapped = instrumentFunction({
2521
2649
  * browser. Calling it during server-side rendering (no `window`) throws
2522
2650
  * `UnavailableInServerSideError`.
2523
2651
  *
2652
+ * @param [params.expectedState] - When given, the parameters are only removed
2653
+ * while the current URL still carries this `dynamicOauthState`. Use it to
2654
+ * clean up after a specific callback without touching a newer one that has
2655
+ * meanwhile landed in the address bar.
2524
2656
  * @returns Nothing. The current URL is rewritten in place via
2525
2657
  * `window.history.replaceState`.
2526
2658
  *
@@ -2540,9 +2672,12 @@ const __authenticateWithSocial_wrapped = instrumentFunction({
2540
2672
  *
2541
2673
  * @notInstrumented
2542
2674
  */
2543
- const clearSocialRedirectParams = () => {
2675
+ const clearSocialRedirectParams = ({ expectedState } = {}) => {
2544
2676
  if (isServerSideRendering()) throw new UnavailableInServerSideError("clearSocialRedirectParams");
2545
- window.history.replaceState({}, "", removeDynamicOauthParamsFromUrl(window.location.href));
2677
+ const currentHref = window.location.href;
2678
+ const currentState = new URL(currentHref).searchParams.get("dynamicOauthState");
2679
+ if (expectedState !== void 0 && currentState !== expectedState) return;
2680
+ window.history.replaceState({}, "", removeDynamicOauthParamsFromUrl(currentHref));
2546
2681
  };
2547
2682
 
2548
2683
  //#endregion
@@ -2626,6 +2761,14 @@ const __processSocialCallback_wrapped = instrumentFunction({
2626
2761
  * authenticating (or linking) the user with the social provider. This is the
2627
2762
  * final step after `signInWithSocialRedirect` + `detectSocialRedirectUrl`.
2628
2763
  *
2764
+ * A callback URL whose stored redirect state is missing or does not match can
2765
+ * never complete, so its OAuth parameters are stripped from the browser URL
2766
+ * before the error is rethrown. Callers that decide whether to complete a
2767
+ * redirect by inspecting the URL therefore see the failure once instead of
2768
+ * retrying the same doomed callback on every render. The clean-up is scoped to
2769
+ * the state of the callback it failed on, so a newer callback sitting in the
2770
+ * address bar is left alone.
2771
+ *
2629
2772
  * @example
2630
2773
  * ```ts
2631
2774
  * const redirectUrl = detectSocialRedirectUrl();
@@ -2639,16 +2782,30 @@ const __processSocialCallback_wrapped = instrumentFunction({
2639
2782
  * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
2640
2783
  * @returns A promise that resolves to the authenticated user or null.
2641
2784
  * @throws MissingSocialUrlParamError If required OAuth parameters are missing.
2785
+ * @throws MissingRedirectStorageStateError If no stored redirect state exists.
2642
2786
  * @throws InvalidRedirectStorageStateError If the stored state doesn't match.
2643
2787
  * @see signInWithSocialRedirect
2644
2788
  * @see detectSocialRedirectUrl
2645
2789
  * @see clearSocialRedirectParams
2646
2790
  * @instrumented
2647
2791
  */
2648
- const completeSocialRedirect = ({ url, requestedScopes }, client = getDefaultClient()) => __processSocialCallback_wrapped({
2649
- requestedScopes,
2650
- url
2651
- }, client);
2792
+ const completeSocialRedirect = async ({ url, requestedScopes }, client = getDefaultClient()) => {
2793
+ try {
2794
+ return await __processSocialCallback_wrapped({
2795
+ requestedScopes,
2796
+ url
2797
+ }, client);
2798
+ } catch (error) {
2799
+ const hasUnusableRedirectState = error instanceof MissingRedirectStorageStateError || error instanceof InvalidRedirectStorageStateError;
2800
+ const failedState = url.searchParams.get("dynamicOauthState");
2801
+ if (hasUnusableRedirectState && failedState !== null) try {
2802
+ clearSocialRedirectParams({ expectedState: failedState });
2803
+ } catch (clearError) {
2804
+ getCore(client).logger.debug("[completeSocialRedirect] failed to clear the social redirect params", clearError);
2805
+ }
2806
+ throw error;
2807
+ }
2808
+ };
2652
2809
  const __completeSocialRedirect_impl = completeSocialRedirect;
2653
2810
  const __completeSocialRedirect_wrapped = instrumentFunction({
2654
2811
  fn: __completeSocialRedirect_impl,
@@ -7241,20 +7398,46 @@ const hasAllGoogleDriveBackupScopes = (grantedScopes) => findMissingGoogleDriveB
7241
7398
  const isInsufficientGoogleDriveScopesError = (err) => err instanceof Error && err.message.includes(ACCESS_DENIED_PHRASE);
7242
7399
 
7243
7400
  //#endregion
7244
- //#region src/utils/isMobile/isMobile.ts
7401
+ //#region src/utils/isAndroid/isAndroid.ts
7402
+ /**
7403
+ * Tells whether the SDK is running on Android.
7404
+ *
7405
+ * The operating system comes from {@link getOperatingSystem}, which reads
7406
+ * `Platform.OS` in React Native and the user agent on web.
7407
+ *
7408
+ * @example
7409
+ * ```ts
7410
+ * if (isAndroid()) {
7411
+ * return installationUrls.android;
7412
+ * }
7413
+ * ```
7414
+ *
7415
+ * @returns `true` when the current device runs Android.
7416
+ * @see getOperatingSystem
7417
+ * @see isIOS
7418
+ * @notInstrumented
7419
+ */
7420
+ const isAndroid = () => getOperatingSystem() === "android";
7421
+
7422
+ //#endregion
7423
+ //#region src/utils/userAgentChecks/userAgentChecks.ts
7245
7424
  /**
7246
7425
  * Sourced from http://detectmobilebrowsers.com/
7426
+ *
7427
+ * iOS devices are matched by {@link isIOSUserAgent} instead of a bare `ios`
7428
+ * alternative, which would also match unrelated words such as `kiosk`.
7247
7429
  * @notInstrumented
7248
7430
  */
7249
- const userAgentRegex1 = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ios|ipad|playbook|silk/i;
7431
+ const userAgentRegex1 = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i;
7250
7432
  const userAgentRegex2 = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i;
7251
- /** @notInstrumented */
7252
- const isMobile = (maxTouchPointsOverride) => {
7253
- if (typeof window === "undefined" || typeof navigator === "undefined") return false;
7254
- return userAgentRegex1.test(navigator.userAgent) || userAgentRegex2.test(navigator.userAgent.substring(0, 4)) || isIPad(maxTouchPointsOverride) || isIPhone();
7255
- };
7256
- /** @notInstrumented */
7257
- const isIPhone = () => typeof window === "undefined" || typeof navigator === "undefined" ? false : /iPhone|ios/.test(navigator.userAgent);
7433
+ /**
7434
+ * Matches the device names Apple's handhelds report, plus the standalone `ios`
7435
+ * token that embedded web views and custom in-app browsers use in place of a
7436
+ * device name. The token must stand alone so that unrelated words containing
7437
+ * `ios` (`kiosk`, for instance) don't match.
7438
+ * @notInstrumented
7439
+ */
7440
+ const isIOSUserAgent = () => typeof window === "undefined" || typeof navigator === "undefined" ? false : /iPhone|iPod|(?:^|[^a-z])ios(?:[^a-z]|$)/i.test(navigator.userAgent);
7258
7441
  /**
7259
7442
  * @param [optional] maxTouchPointsOverride - this is used for testing since
7260
7443
  * it seems that JSDOM doesn't support maxTouchPoints, so it was impossible
@@ -7267,13 +7450,11 @@ const isIPad = (maxTouchPointsOverride) => {
7267
7450
  return /iPad/.test(navigator.userAgent) || /Mac/.test(navigator.userAgent) && maxTouchPoints === 5;
7268
7451
  };
7269
7452
  /** @notInstrumented */
7270
- const isIOS = (maxTouchPointsOverride) => {
7453
+ const isMobileUserAgent = (maxTouchPointsOverride) => {
7271
7454
  if (typeof window === "undefined" || typeof navigator === "undefined") return false;
7272
- return isIPhone() || isIPad(maxTouchPointsOverride);
7455
+ return userAgentRegex1.test(navigator.userAgent) || userAgentRegex2.test(navigator.userAgent.substring(0, 4)) || isIPad(maxTouchPointsOverride) || isIOSUserAgent();
7273
7456
  };
7274
7457
  /** @notInstrumented */
7275
- const isAndroid = () => isMobile() && !isIOS();
7276
- /** @notInstrumented */
7277
7458
  const isSafariBrowser = () => {
7278
7459
  if (typeof window === "undefined" || typeof navigator === "undefined") return false;
7279
7460
  const { userAgent } = navigator;
@@ -7300,6 +7481,31 @@ const isChromeBrowser = () => {
7300
7481
  return /\bChrome\//.test(navigator.userAgent) && !isEdgeBrowser() && !isOperaBrowser();
7301
7482
  };
7302
7483
 
7484
+ //#endregion
7485
+ //#region src/utils/isIOS/isIOS.ts
7486
+ /**
7487
+ * Tells whether the SDK is running on iOS or iPadOS.
7488
+ *
7489
+ * The operating system comes from {@link getOperatingSystem}, which reads
7490
+ * `Platform.OS` in React Native and the user agent on web. Two user agents
7491
+ * escape it: an iPad in desktop mode announces itself as macOS, and embedded
7492
+ * web views may carry a lowercase `ios` token instead of a device name.
7493
+ *
7494
+ * @example
7495
+ * ```ts
7496
+ * if (isIOS()) {
7497
+ * return installationUrls.ios;
7498
+ * }
7499
+ * ```
7500
+ *
7501
+ * @returns `true` when the current device runs iOS or iPadOS.
7502
+ * @see getOperatingSystem
7503
+ * @see isIPad
7504
+ * @see isIOSUserAgent
7505
+ * @notInstrumented
7506
+ */
7507
+ const isIOS = () => getOperatingSystem() === "ios" || isIOSUserAgent() || isIPad();
7508
+
7303
7509
  //#endregion
7304
7510
  //#region src/modules/walletOptionsCatalogue/getInstallationLinkForCurrentPlatform/getInstallationLinkForCurrentPlatform.ts
7305
7511
  /**
@@ -7340,6 +7546,77 @@ const getInstallationLinkForCurrentPlatform = ({ installationUrls }) => {
7340
7546
  if (isChromeBrowser()) return installationUrls.chrome;
7341
7547
  };
7342
7548
 
7549
+ //#endregion
7550
+ //#region src/modules/wallets/networks/getEnabledChains/getEnabledChains.ts
7551
+ /**
7552
+ * Returns the chains this client can operate on — a chain is enabled once
7553
+ * one of its extensions has been added (`addEvmExtension`,
7554
+ * `addSolanaExtension`, …), since every chain extension registers a
7555
+ * network provider builder for its chain.
7556
+ *
7557
+ * Reading the builder registry keeps chain awareness out of the client
7558
+ * package: the set is whatever the extensions registered, so no
7559
+ * chain-specific branch is needed here.
7560
+ *
7561
+ * @param client - The Dynamic client instance.
7562
+ * @returns The set of chains the client has an extension for.
7563
+ * @example
7564
+ * ```typescript
7565
+ * // client created with addEvmExtension only
7566
+ * getEnabledChains(client); // Set { 'EVM' }
7567
+ * ```
7568
+ * @see {@link getNetworkProviderBuilderRegistry} for the registry the chains are read from.
7569
+ * @see {@link getNetworkProviders} for the other consumer of that registry.
7570
+ * @notInstrumented
7571
+ */
7572
+ const getEnabledChains = (client) => {
7573
+ const networkProviderBuilderRegistry = getNetworkProviderBuilderRegistry(client);
7574
+ return new Set(networkProviderBuilderRegistry.get().keys());
7575
+ };
7576
+
7577
+ //#endregion
7578
+ //#region src/modules/legacyWalletBook/getWalletConnectCatalog/getChainsFromWalletSchema/getChainsFromWalletSchema.ts
7579
+ /**
7580
+ * Returns every chain a wallet book entry advertises support for —
7581
+ * deduped, in `injectedConfig` order, then `chains` order. Used by the
7582
+ * catalogue's WalletConnect builder so a multi-chain wallet (e.g. Trust
7583
+ * supports EVM + SOL) gets one option per chain rather than one option
7584
+ * for whichever chain `getChainFromWalletSchema` happened to pick first.
7585
+ *
7586
+ * Falls back to {@link getChainFromWalletSchema}'s single-result behavior
7587
+ * (`['EVM']` default) when neither field is populated, so the helper
7588
+ * never returns an empty array — every eligible wallet emits at least
7589
+ * one option.
7590
+ *
7591
+ * @param params.wallet - The wallet schema from the wallet book.
7592
+ * @param [params.walletKey] - The wallet key identifier (used as last-resort fallback).
7593
+ * @returns Ordered, deduped array of Chains.
7594
+ * @notInstrumented
7595
+ */
7596
+ const getChainsFromWalletSchema = ({ wallet, walletKey }) => {
7597
+ const chains = /* @__PURE__ */ new Set();
7598
+ for (const entry of wallet.injectedConfig ?? []) {
7599
+ if (!entry.chain) continue;
7600
+ const chain = getChainFromWalletBookIdentifier({ identifier: entry.chain });
7601
+ if (chain) chains.add(chain);
7602
+ }
7603
+ for (const identifier of wallet.chains ?? []) {
7604
+ const prefix = extractChainPrefix({ chainIdentifier: identifier });
7605
+ try {
7606
+ const chain = getChainFromVerifiedCredentialChain(prefix);
7607
+ chains.add(chain);
7608
+ } catch {}
7609
+ }
7610
+ if (chains.size === 0) {
7611
+ const chain = getChainFromWalletSchema({
7612
+ wallet,
7613
+ walletKey
7614
+ });
7615
+ chains.add(chain);
7616
+ }
7617
+ return Array.from(chains);
7618
+ };
7619
+
7343
7620
  //#endregion
7344
7621
  //#region src/modules/walletOptionsCatalogue/resolveWalletBookWalletOptionKey/resolveWalletBookWalletOptionKey.ts
7345
7622
  /**
@@ -7385,11 +7662,17 @@ const getInAppBrowserUrl = ({ wallet }) => wallet.mobile?.inAppBrowserV2 ?? wall
7385
7662
  * and injected-only wallets are dropped — so the catalogue's notion of
7386
7663
  * "external wallet" stays consistent across option types.
7387
7664
  *
7665
+ * A wallet's in-app browser opens a single session, so it emits one option
7666
+ * tagged with the first chain it advertises that the client has an
7667
+ * extension for — a multi-chain wallet is still reachable when only one of
7668
+ * its chains is enabled.
7669
+ *
7670
+ * @param params.enabledChains - Chains the client has an extension for.
7388
7671
  * @param params.walletBook - The fetched wallet book.
7389
7672
  * @returns Tagged `inAppBrowser` options paired with their wallet option keys.
7390
7673
  * @notInstrumented
7391
7674
  */
7392
- const buildInAppBrowserOptions = ({ walletBook }) => {
7675
+ const buildInAppBrowserOptions = ({ enabledChains, walletBook }) => {
7393
7676
  const result = [];
7394
7677
  for (const [walletKey, wallet] of Object.entries(walletBook.wallets)) {
7395
7678
  if (shouldFilterWallet({
@@ -7398,12 +7681,14 @@ const buildInAppBrowserOptions = ({ walletBook }) => {
7398
7681
  })) continue;
7399
7682
  const url = getInAppBrowserUrl({ wallet });
7400
7683
  if (!url) continue;
7684
+ const chain = getChainsFromWalletSchema({
7685
+ wallet,
7686
+ walletKey
7687
+ }).find((advertisedChain) => enabledChains.has(advertisedChain));
7688
+ if (!chain) continue;
7401
7689
  result.push({
7402
7690
  option: {
7403
- chain: getChainFromWalletSchema({
7404
- wallet,
7405
- walletKey
7406
- }),
7691
+ chain,
7407
7692
  type: "inAppBrowser",
7408
7693
  url
7409
7694
  },
@@ -7476,17 +7761,25 @@ const hasAnyInstallationUrl = ({ urls }) => Object.values(urls).some(Boolean);
7476
7761
  * Reuses the generic `shouldFilterWallet` rules so embedded wallets do
7477
7762
  * not appear here either — they're not user-installable products.
7478
7763
  *
7764
+ * Wallets that advertise no chain this client has an extension for are
7765
+ * skipped: installing them would not make them connectable.
7766
+ *
7767
+ * @param params.enabledChains - Chains the client has an extension for.
7479
7768
  * @param params.walletBook - The fetched wallet book.
7480
7769
  * @returns A map from wallet option key to its install URL bag.
7481
7770
  * @notInstrumented
7482
7771
  */
7483
- const buildInstallationUrlsByWalletOptionKey = ({ walletBook }) => {
7772
+ const buildInstallationUrlsByWalletOptionKey = ({ enabledChains, walletBook }) => {
7484
7773
  const map = /* @__PURE__ */ new Map();
7485
7774
  for (const [walletKey, wallet] of Object.entries(walletBook.wallets)) {
7486
7775
  if (shouldFilterWallet({
7487
7776
  wallet,
7488
7777
  walletKey
7489
7778
  })) continue;
7779
+ if (!getChainsFromWalletSchema({
7780
+ wallet,
7781
+ walletKey
7782
+ }).some((chain) => enabledChains.has(chain))) continue;
7490
7783
  const urls = buildInstallationUrls({ wallet });
7491
7784
  if (!hasAnyInstallationUrl({ urls })) continue;
7492
7785
  const walletOptionKey = resolveWalletBookWalletOptionKey({
@@ -7578,49 +7871,6 @@ const buildMetaMaskSdkUriOptions = ({ walletBook }) => {
7578
7871
  return [];
7579
7872
  };
7580
7873
 
7581
- //#endregion
7582
- //#region src/modules/legacyWalletBook/getWalletConnectCatalog/getChainsFromWalletSchema/getChainsFromWalletSchema.ts
7583
- /**
7584
- * Returns every chain a wallet book entry advertises support for —
7585
- * deduped, in `injectedConfig` order, then `chains` order. Used by the
7586
- * catalogue's WalletConnect builder so a multi-chain wallet (e.g. Trust
7587
- * supports EVM + SOL) gets one option per chain rather than one option
7588
- * for whichever chain `getChainFromWalletSchema` happened to pick first.
7589
- *
7590
- * Falls back to {@link getChainFromWalletSchema}'s single-result behavior
7591
- * (`['EVM']` default) when neither field is populated, so the helper
7592
- * never returns an empty array — every eligible wallet emits at least
7593
- * one option.
7594
- *
7595
- * @param params.wallet - The wallet schema from the wallet book.
7596
- * @param [params.walletKey] - The wallet key identifier (used as last-resort fallback).
7597
- * @returns Ordered, deduped array of Chains.
7598
- * @notInstrumented
7599
- */
7600
- const getChainsFromWalletSchema = ({ wallet, walletKey }) => {
7601
- const chains = /* @__PURE__ */ new Set();
7602
- for (const entry of wallet.injectedConfig ?? []) {
7603
- if (!entry.chain) continue;
7604
- const chain = getChainFromWalletBookIdentifier({ identifier: entry.chain });
7605
- if (chain) chains.add(chain);
7606
- }
7607
- for (const identifier of wallet.chains ?? []) {
7608
- const prefix = extractChainPrefix({ chainIdentifier: identifier });
7609
- try {
7610
- const chain = getChainFromVerifiedCredentialChain(prefix);
7611
- chains.add(chain);
7612
- } catch {}
7613
- }
7614
- if (chains.size === 0) {
7615
- const chain = getChainFromWalletSchema({
7616
- wallet,
7617
- walletKey
7618
- });
7619
- chains.add(chain);
7620
- }
7621
- return Array.from(chains);
7622
- };
7623
-
7624
7874
  //#endregion
7625
7875
  //#region src/modules/walletOptionsCatalogue/buildWalletConnectOptions/buildWalletConnectOptions.ts
7626
7876
  /**
@@ -8005,6 +8255,31 @@ const buildWithWalletProviderOptions = ({ entries, walletBook }, client) => {
8005
8255
  */
8006
8256
  const EXCLUDED_WALLET_OPTION_KEYS = new Set(["coinbase", "coinbasewallet"]);
8007
8257
 
8258
+ //#endregion
8259
+ //#region src/modules/walletOptionsCatalogue/filterConnectionOptionsByEnabledChains/filterConnectionOptionsByEnabledChains.ts
8260
+ /**
8261
+ * Drops options whose chain has no extension on this client. The wallet
8262
+ * book advertises every chain a wallet supports, so options derived from
8263
+ * it have to be narrowed to the chains the client can actually connect
8264
+ * on — otherwise the catalogue surfaces a connection the customer has no
8265
+ * primitive to drive.
8266
+ *
8267
+ * @param params.enabledChains - Chains the client has an extension for.
8268
+ * @param params.options - The tagged options to narrow.
8269
+ * @returns The options on enabled chains, in input order.
8270
+ * @example
8271
+ * ```typescript
8272
+ * filterConnectionOptionsByEnabledChains({
8273
+ * enabledChains: new Set(['EVM']),
8274
+ * options: [evmOption, solOption],
8275
+ * }); // [evmOption]
8276
+ * ```
8277
+ * @see {@link getEnabledChains} for how the enabled chains are derived.
8278
+ * @see {@link getWalletOptionsCatalogue} for the catalogue that applies this filter.
8279
+ * @notInstrumented
8280
+ */
8281
+ const filterConnectionOptionsByEnabledChains = ({ enabledChains, options }) => options.filter(({ option }) => enabledChains.has(option.chain));
8282
+
8008
8283
  //#endregion
8009
8284
  //#region src/modules/walletOptionsCatalogue/groupOptionsByWalletOption/groupOptionsByWalletOption.ts
8010
8285
  /**
@@ -8249,6 +8524,10 @@ const EMPTY_WALLET_BOOK = {
8249
8524
  * pass `includeMobileOptions: true` to additionally surface
8250
8525
  * WalletConnect, in-app-browser, and install links.
8251
8526
  *
8527
+ * Options sourced from the wallet book are scoped to the chains this
8528
+ * client has an extension for — a wallet is only surfaced on chains the
8529
+ * customer can actually connect on.
8530
+ *
8252
8531
  * Pass `excludedConnectionOptionTypes` to drop specific connection types
8253
8532
  * from the catalogue (e.g. `['inAppBrowser']` on desktop). Wallets whose
8254
8533
  * only connection was an excluded type fall through to the install-only
@@ -8264,6 +8543,7 @@ const getWalletOptionsCatalogue = async (params = {}, client = getDefaultClient(
8264
8543
  const walletOptionOrdering = params.walletOptionOrdering ?? "relevance";
8265
8544
  const excludedConnectionOptionTypes = new Set(params.excludedConnectionOptionTypes ?? []);
8266
8545
  const walletBook = includeMobileOptions ? await fetchLegacyWalletBook(client) : EMPTY_WALLET_BOOK;
8546
+ const enabledChains = getEnabledChains(client);
8267
8547
  const allConnectionOptions = [];
8268
8548
  if (!excludedConnectionOptionTypes.has("withWalletProvider")) {
8269
8549
  const entries = getWalletProviderRegistry(client).listProviderEntries();
@@ -8273,11 +8553,22 @@ const getWalletOptionsCatalogue = async (params = {}, client = getDefaultClient(
8273
8553
  }, client));
8274
8554
  }
8275
8555
  if (includeMobileOptions) {
8276
- if (!excludedConnectionOptionTypes.has("walletConnect")) allConnectionOptions.push(...buildWalletConnectOptions({ walletBook }));
8277
- if (!excludedConnectionOptionTypes.has("metamaskSdkUri")) allConnectionOptions.push(...buildMetaMaskSdkUriOptions({ walletBook }));
8278
- if (!excludedConnectionOptionTypes.has("inAppBrowser")) allConnectionOptions.push(...buildInAppBrowserOptions({ walletBook }));
8556
+ const walletBookOptions = [];
8557
+ if (!excludedConnectionOptionTypes.has("walletConnect")) walletBookOptions.push(...buildWalletConnectOptions({ walletBook }));
8558
+ if (!excludedConnectionOptionTypes.has("metamaskSdkUri")) walletBookOptions.push(...buildMetaMaskSdkUriOptions({ walletBook }));
8559
+ if (!excludedConnectionOptionTypes.has("inAppBrowser")) walletBookOptions.push(...buildInAppBrowserOptions({
8560
+ enabledChains,
8561
+ walletBook
8562
+ }));
8563
+ allConnectionOptions.push(...filterConnectionOptionsByEnabledChains({
8564
+ enabledChains,
8565
+ options: walletBookOptions
8566
+ }));
8279
8567
  }
8280
- const installationUrlsByKey = includeMobileOptions ? buildInstallationUrlsByWalletOptionKey({ walletBook }) : /* @__PURE__ */ new Map();
8568
+ const installationUrlsByKey = includeMobileOptions ? buildInstallationUrlsByWalletOptionKey({
8569
+ enabledChains,
8570
+ walletBook
8571
+ }) : /* @__PURE__ */ new Map();
8281
8572
  const grouped = groupOptionsByWalletOption({ options: allConnectionOptions });
8282
8573
  const allWalletOptionKeys = new Set([...grouped.keys(), ...installationUrlsByKey.keys()]);
8283
8574
  const walletOptions = [];
@@ -8361,6 +8652,29 @@ const __confirmTransaction_wrapped = instrumentFunction({
8361
8652
  }
8362
8653
  });
8363
8654
 
8655
+ //#endregion
8656
+ //#region src/utils/isMobile/isMobile.ts
8657
+ /**
8658
+ * Tells whether the SDK is running on a mobile device.
8659
+ *
8660
+ * This is the web implementation, which sniffs the browser's user agent. It
8661
+ * lives on its own so the React Native bundler can resolve
8662
+ * `isMobile.native.ts` instead, which always reports `true`.
8663
+ *
8664
+ * @example
8665
+ * ```ts
8666
+ * if (isMobile()) {
8667
+ * // hand the pairing to the wallet app instead of rendering a QR code
8668
+ * }
8669
+ * ```
8670
+ *
8671
+ * @returns `true` when the user agent belongs to a mobile device.
8672
+ * @see isMobileUserAgent
8673
+ * @see getPlatform
8674
+ * @notInstrumented
8675
+ */
8676
+ const isMobile = () => isMobileUserAgent();
8677
+
8364
8678
  //#endregion
8365
8679
  //#region src/modules/wallets/utils/getAddressesWithTypesFromConnectionResult/getAddressesWithTypesFromConnectionResult.ts
8366
8680
  /** @notInstrumented */
@@ -9357,6 +9671,109 @@ const __selectPrimaryWalletAccount_wrapped = instrumentFunction({
9357
9671
  }
9358
9672
  });
9359
9673
 
9674
+ //#endregion
9675
+ //#region src/utils/buildInAppBrowserUrl/buildInAppBrowserUrl.ts
9676
+ /**
9677
+ * Placeholder the wallet book leaves in in-app-browser URLs for the app URL
9678
+ * the wallet should open.
9679
+ */
9680
+ const DAPP_URL_PLACEHOLDER = "{{encodedDappURI}}";
9681
+ /**
9682
+ * Fills a wallet's in-app-browser URL template with the app URL to open.
9683
+ *
9684
+ * Wallet book entries carry the entry point as a template (e.g.
9685
+ * `https://go.base.app/dapp?cb_url={{encodedDappURI}}`), so the URL is only
9686
+ * usable once every occurrence of the placeholder is substituted in,
9687
+ * percent-encoded. Templates without the placeholder are returned untouched —
9688
+ * some wallets open a fixed landing page.
9689
+ *
9690
+ * @example
9691
+ * ```ts
9692
+ * buildInAppBrowserUrl({
9693
+ * appUrl: 'https://myapp.xyz/login',
9694
+ * inAppBrowserUrl: 'https://go.base.app/dapp?cb_url={{encodedDappURI}}',
9695
+ * });
9696
+ * // Returns: 'https://go.base.app/dapp?cb_url=https%3A%2F%2Fmyapp.xyz%2Flogin'
9697
+ * ```
9698
+ *
9699
+ * @param params.appUrl - The URL of your app for the wallet's browser to open.
9700
+ * @param params.inAppBrowserUrl - The wallet's in-app-browser URL template.
9701
+ * @returns The in-app-browser URL to open.
9702
+ * @see redirectToInAppBrowser
9703
+ * @see getWalletOptionsCatalogue
9704
+ * @notInstrumented
9705
+ */
9706
+ const buildInAppBrowserUrl = ({ appUrl, inAppBrowserUrl }) => inAppBrowserUrl.replaceAll(DAPP_URL_PLACEHOLDER, encodeURIComponent(appUrl));
9707
+
9708
+ //#endregion
9709
+ //#region src/modules/wallets/redirectToInAppBrowser/redirectToInAppBrowser.ts
9710
+ /**
9711
+ * Leaves your app for a wallet's in-app browser, which reloads `appUrl`
9712
+ * inside it.
9713
+ *
9714
+ * Call this from `handleWalletBrowserRedirect` with the URL of the page the
9715
+ * wallet should reload. The wallet's in-app-browser entry point is read from
9716
+ * the wallet options catalogue, so you only need the wallet's key. The wallet
9717
+ * is only injected on that reload, so the connection is made on the next page
9718
+ * load rather than in the current one.
9719
+ *
9720
+ * @example
9721
+ * ```ts
9722
+ * await connectWallet({
9723
+ * handleWalletBrowserRedirect: ({ chain, walletKey }) =>
9724
+ * redirectToInAppBrowser({ appUrl: window.location.href, chain, walletKey }),
9725
+ * walletKey: 'coinbase',
9726
+ * });
9727
+ * ```
9728
+ *
9729
+ * @param params.appUrl - The URL of your app for the wallet's browser to open.
9730
+ * @param params.walletKey - The wallet to open, keyed as in the wallet options catalogue.
9731
+ * @param [params.chain] - The chain to open the wallet's browser for. Required only when the wallet exposes an in-app browser on more than one enabled chain.
9732
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
9733
+ * @returns A promise that resolves once the redirect is triggered.
9734
+ * @throws WalletOptionNotFoundError If no wallet option matches the key.
9735
+ * @throws NoConnectionOptionAvailableError If the wallet exposes no in-app browser on the requested chain.
9736
+ * @throws AmbiguousWalletChainError If the wallet exposes an in-app browser on more than one chain and no chain was passed.
9737
+ * @throws UnsafeDeeplinkUrlError If the wallet's in-app-browser URL has a scheme that can execute script.
9738
+ * @see connectWallet
9739
+ * @see WalletBrowserRedirectHandlerParams
9740
+ * @instrumented
9741
+ */
9742
+ const redirectToInAppBrowser = async ({ appUrl, chain, walletKey }, client = getDefaultClient()) => {
9743
+ const walletOption = (await getWalletOptionsCatalogue({ includeMobileOptions: true }, client)).find(({ key }) => key === walletKey);
9744
+ if (!walletOption) throw new WalletOptionNotFoundError({ walletKey });
9745
+ const inAppBrowserOptions = walletOption.connectionOptions.filter((option) => option.type === "inAppBrowser" && (!chain || option.chain === chain));
9746
+ if (inAppBrowserOptions.length === 0) throw new NoConnectionOptionAvailableError({
9747
+ chain,
9748
+ installationUrls: walletOption.installationUrls,
9749
+ walletKey
9750
+ });
9751
+ const availableChains = [...new Set(inAppBrowserOptions.map((option) => option.chain))];
9752
+ if (!chain && availableChains.length > 1) throw new AmbiguousWalletChainError({
9753
+ chains: availableChains,
9754
+ walletKey
9755
+ });
9756
+ const [inAppBrowserOption] = inAppBrowserOptions;
9757
+ const urlToOpen = buildInAppBrowserUrl({
9758
+ appUrl,
9759
+ inAppBrowserUrl: inAppBrowserOption.url
9760
+ });
9761
+ assertSafeDeeplinkUrl(urlToOpen);
9762
+ await getCore(client).openDeeplink(urlToOpen);
9763
+ };
9764
+ const __redirectToInAppBrowser_impl = redirectToInAppBrowser;
9765
+ const __redirectToInAppBrowser_wrapped = instrumentFunction({
9766
+ fn: __redirectToInAppBrowser_impl,
9767
+ functionName: "redirectToInAppBrowser",
9768
+ getCore: () => {
9769
+ try {
9770
+ return getCore(getDefaultClient());
9771
+ } catch {
9772
+ return;
9773
+ }
9774
+ }
9775
+ });
9776
+
9360
9777
  //#endregion
9361
9778
  //#region src/modules/wallets/disconnectWalletAccount/disconnectWalletAccount.ts
9362
9779
  /**
@@ -9988,6 +10405,40 @@ const appendConnectionUriToDeeplink = ({ connectionUri, deeplinkUrl }) => {
9988
10405
  return url.href;
9989
10406
  };
9990
10407
 
10408
+ //#endregion
10409
+ //#region src/utils/getPreferredWalletDeepLink/getPreferredWalletDeepLink.ts
10410
+ /**
10411
+ * Picks the most appropriate deep link variant for the current platform.
10412
+ *
10413
+ * Mobile (Android, iOS, tablets) prefers `native` because the OS treats
10414
+ * custom URL schemes as first-class app links and gives the wallet a faster
10415
+ * round-trip back to the dApp. Desktop prefers `universal` because browsers
10416
+ * cannot resolve mobile-only custom schemes and need an `https://` link
10417
+ * that opens the wallet's web flow.
10418
+ *
10419
+ * In either case, the alternative is used as a fallback when the preferred
10420
+ * variant is missing. Returns `undefined` only when both variants are
10421
+ * absent.
10422
+ *
10423
+ * @example
10424
+ * ```ts
10425
+ * const deepLink = getPreferredWalletDeepLink({
10426
+ * deeplinks: wallet.deeplinks,
10427
+ * });
10428
+ * ```
10429
+ *
10430
+ * @param params.deeplinks - The deep link variants for a wallet (typically `WalletConnectCatalogWallet.deeplinks`).
10431
+ * @returns The preferred deep link URL, or `undefined` if neither variant is available.
10432
+ * @see appendConnectionUriToDeeplink
10433
+ * @see getConnectionUriDeeplink
10434
+ * @notInstrumented
10435
+ */
10436
+ const getPreferredWalletDeepLink = ({ deeplinks }) => {
10437
+ const { native, universal } = deeplinks;
10438
+ if (isMobile()) return native ?? universal;
10439
+ return universal ?? native;
10440
+ };
10441
+
9991
10442
  //#endregion
9992
10443
  //#region src/utils/parseUserAgent/parseUserAgent.ts
9993
10444
  const browserMatchers = [
@@ -10069,5 +10520,5 @@ const parseUserAgent = ({ userAgent }) => {
10069
10520
  assertPackageVersion(name, version);
10070
10521
 
10071
10522
  //#endregion
10072
- export { BaseError, COINBASE_TRAVEL_RULE_FIELD_DESCRIPTIONS, CaptchaProviderEnum, CheckoutSessionTokenMissingError, ClientAlreadyInitializedError, CoinbaseBeneficiaryWalletType, CoinbaseIsSelfTransfer, CoinbaseTransferMfaFailedError, CoinbaseTransferMfaRequiredError, CoinbaseTravelRuleFieldName, CoinbaseTravelRuleRequiredError, DeeplinkConnectAndVerifyUnsupportedError, DeviceRegistrationIdentityMismatchError, FeeEstimationFailedError, FlowSessionTokenMissingError, GOOGLE_DRIVE_BACKUP_REQUIRED_SCOPES, InvalidDeviceRegistrationRedirectError, InvalidExternalAuthError, InvalidParamError, InvalidRedirectStorageStateError, InvalidSocialCallbackOriginError, JwtVerifiedCredentialFormatEnum, LinkCredentialError, MFAAction, MergeAccountsConfirmationError, MfaInvalidOtpError, MfaRateLimitedError, MissingRedirectStorageStateError, MissingSocialUrlParamError, MissingUserVerificationError, NetworkAddingUnavailableError, NetworkNotAddedError, NetworkSwitchingUnavailableError, NoAddressFoundError, NoNetworkProvidersError, NoPasskeyCredentialsFoundError, NoSmartWalletAccountSignerFoundError, NoWebAuthNSupportError, NotWaasWalletAccountError, ProviderEnum, SandboxMaximumThresholdReachedError, ScreeningNotRequiredError, SimulationFailedError, TokenScope, TokenSwapError, TransactionBroadcastError, UnauthorizedError, UnavailableInServerSideError, UnrecognizedNetworkError, UserCancelledSocialPopUpError, UserNotAuthenticatedError, UserRejectedError, WaasChainEnum, WaasLoadFailedError, WaasOnboardingIncompleteError, WaasRbacStaleRetryUnsafeError, WalletAccountAlreadyVerifiedError, WalletAccountNotSelectedError, WalletAlreadyLinkedToAnotherUserError, WalletProviderMethodUnavailableError, WalletScreeningBlockedError, __acknowledgeRecoveryCodes_wrapped as acknowledgeRecoveryCodes, addCoinbaseOnrampOrderEventListener, __addNetwork_wrapped as addNetwork, appendConnectionUriToDeeplink, assertWalletAccountSigningAvailability, assertWalletProviderMethodDefined, __attachCheckoutTransactionSource_wrapped as attachCheckoutTransactionSource, __attachFlowSource_wrapped as attachFlowSource, authenticateMfaRecoveryCode, authenticatePasskeyMFA, authenticateTotpMfaDevice, __authenticateWithSocial_wrapped as authenticateWithSocial, __broadcastCheckoutTransaction_wrapped as broadcastCheckoutTransaction, __broadcastFlow_wrapped as broadcastFlow, canConnectWithHardwareWallet, __cancelCheckoutTransaction_wrapped as cancelCheckoutTransaction, __cancelFlow_wrapped as cancelFlow, __checkStepUpAuth_wrapped as checkStepUpAuth, checkUserScopes, __claimYieldRewards_wrapped as claimYieldRewards, clearDeviceRegistrationRedirectParams, clearSocialRedirectParams, __completeDeviceRegistration_wrapped as completeDeviceRegistration, __completeSocialAuthentication_wrapped as completeSocialAuthentication, __completeSocialRedirect_wrapped as completeSocialRedirect, __confirmTransaction_wrapped as confirmTransaction, __connectAndVerifyWithWalletProvider_wrapped as connectAndVerifyWithWalletProvider, __connectWithWalletProvider_wrapped as connectWithWalletProvider, __consumeMfaToken_wrapped as consumeMfaToken, __createCheckoutTransaction_wrapped as createCheckoutTransaction, createCoinbaseExchangeTransfer, __createCoinbaseOnrampOrder_wrapped as createCoinbaseOnrampOrder, __createCryptoDotComPayment_wrapped as createCryptoDotComPayment, __createDynamicClient_wrapped as createDynamicClient, createKrakenExchangeTransfer, __createNewMfaRecoveryCodes_wrapped as createNewMfaRecoveryCodes, __deleteMfaDevice_wrapped as deleteMfaDevice, __deletePasskey_wrapped as deletePasskey, __deleteUser_wrapped as deleteUser, __depositToYieldVault_wrapped as depositToYieldVault, detectDeviceRegistrationRedirect, detectOAuthRedirect, detectSocialRedirectUrl, excludeInstalledFromCatalog, __executeSwapTransaction_wrapped as executeSwapTransaction, fetchProjectSettings, findMissingGoogleDriveBackupScopes, getActiveNetworkData, getActiveNetworkId, getAvailableWalletProvidersData, getBalance, getBalanceForAddress, getBalances, getCaptchaSettings, getCheckoutTransaction, getCheckoutTransactionQuote, getCoinbaseAccounts, getCoinbaseBuyUrl, getConnectedAddresses, getDefaultClient, getDeviceRegistrationTokenFromUrl, getElevatedAccessToken, getFlow, getFlowQuote, __getGoogleDriveBackupReadiness_wrapped as getGoogleDriveBackupReadiness, getInstallationLinkForCurrentPlatform, getKrakenAccounts, getKrakenWhitelistedAddresses, getMfaDevices, getMfaMethods, getMfaRecoveryCodes, getMissingVerificationForCoinbaseOnrampOrder, __getMoonPayCurrencies_wrapped as getMoonPayCurrencies, __getMoonPayUrl_wrapped as getMoonPayUrl, getMultichainBalances, getMultichainTokenBalances, getNativeBalance, getNetworksData, getOwnerWalletAccountForSmartWalletAccount, getPasskeys, getPrimaryWalletAccount, getRegisteredDevices, getSelectedWalletAccount, getSwapQuote, getSwapStatus, getTokenBalances, getTransactionHistory, getUserSocialAccounts, getWalletAccountAddressByType, getWalletAccountFromAddress, getWalletAccounts, getWalletConnectCatalog, getWalletConnectCatalogWalletByWalletProviderKey, getWalletOptionsCatalogue, getWalletProviderDataByKey, getYieldDetails, getYieldPosition, getYieldRewards, hasAllGoogleDriveBackupScopes, hasExtension, __initializeClient_wrapped as initializeClient, isAnyWalletAccountConnected, isCaptchaRequired, isDeeplinkWalletProvider, isDeviceRegistrationRequired, isExternalWalletScreeningEnabled, isHardwareWalletAccount, isInsufficientGoogleDriveScopesError, isMfaRequiredForAction, isMobile, isPendingRecoveryCodesAcknowledgment, isProgrammaticNetworkSwitchAvailable, isSignedIn, isUserMissingMfaAuth, isUserOnboardingComplete, isWalletAccountVerified, listYieldVaults, logout, matchWalletProvidersToCatalogGroup, mergeUserAccounts, offEvent, offWalletProviderEvent, onEvent, onWalletProviderEvent, onceEvent, parseUserAgent, __prepareCheckoutTransaction_wrapped as prepareCheckoutTransaction, __prepareFlowSigning_wrapped as prepareFlowSigning, __proveWalletAccountOwnership_wrapped as proveWalletAccountOwnership, __refreshAuth_wrapped as refreshAuth, __refreshUser_wrapped as refreshUser, __registerPasskey_wrapped as registerPasskey, __registerTotpMfaDevice_wrapped as registerTotpMfaDevice, __removeWalletAccount_wrapped as removeWalletAccount, __requestExternalAuthElevatedToken_wrapped as requestExternalAuthElevatedToken, requiresConversion, __revokeAllRegisteredDevices_wrapped as revokeAllRegisteredDevices, __revokeRegisteredDevice_wrapped as revokeRegisteredDevice, screenTransaction, __selectPrimaryWalletAccount_wrapped as selectPrimaryWalletAccount, __sendEmailOTP_wrapped as sendEmailOTP, __sendSmsOTP_wrapped as sendSmsOTP, __setCaptchaToken_wrapped as setCaptchaToken, __setDefaultMfaDevice_wrapped as setDefaultMfaDevice, __setInstrumentationEnabled_wrapped as setInstrumentationEnabled, __setSelectedWalletAccount_wrapped as setSelectedWalletAccount, __signInWithExternalJwt_wrapped as signInWithExternalJwt, __signInWithPasskey_wrapped as signInWithPasskey, __signInWithSocialPopUp_wrapped as signInWithSocialPopUp, __signInWithSocialRedirect_wrapped as signInWithSocialRedirect, __signMessage_wrapped as signMessage, __submitCheckoutTransaction_wrapped as submitCheckoutTransaction, __submitFlowTransaction_wrapped as submitFlowTransaction, supportedCountries, __switchActiveNetwork_wrapped as switchActiveNetwork, trackCheckoutTransaction, __transferAmount_wrapped as transferAmount, __transferWalletAccount_wrapped as transferWalletAccount, __unlinkSocialAccount_wrapped as unlinkSocialAccount, __updateUser_wrapped as updateUser, __verifyOTP_wrapped as verifyOTP, __verifyWalletAccount_wrapped as verifyWalletAccount, waitForClientInitialized, __withdrawFromYieldVault_wrapped as withdrawFromYieldVault };
10523
+ export { AmbiguousWalletChainError, BaseError, COINBASE_TRAVEL_RULE_FIELD_DESCRIPTIONS, CaptchaProviderEnum, CheckoutSessionTokenMissingError, ClientAlreadyInitializedError, CoinbaseBeneficiaryWalletType, CoinbaseIsSelfTransfer, CoinbaseTransferMfaFailedError, CoinbaseTransferMfaRequiredError, CoinbaseTravelRuleFieldName, CoinbaseTravelRuleRequiredError, DeeplinkConnectAndVerifyUnsupportedError, DeviceRegistrationIdentityMismatchError, FeeEstimationFailedError, FlowSessionTokenMissingError, GOOGLE_DRIVE_BACKUP_REQUIRED_SCOPES, InvalidDeviceRegistrationRedirectError, InvalidExternalAuthError, InvalidParamError, InvalidRedirectStorageStateError, InvalidSocialCallbackOriginError, JwtVerifiedCredentialFormatEnum, LinkCredentialError, MFAAction, MergeAccountsConfirmationError, MfaInvalidOtpError, MfaRateLimitedError, MissingRedirectStorageStateError, MissingSocialUrlParamError, MissingUserVerificationError, NetworkAddingUnavailableError, NetworkNotAddedError, NetworkSwitchingUnavailableError, NoAddressFoundError, NoConnectionOptionAvailableError, NoNetworkProvidersError, NoPasskeyCredentialsFoundError, NoSmartWalletAccountSignerFoundError, NoWebAuthNSupportError, NotWaasWalletAccountError, ProviderEnum, SandboxMaximumThresholdReachedError, ScreeningNotRequiredError, SimulationFailedError, TokenScope, TokenSwapError, TransactionBroadcastError, UnauthorizedError, UnavailableInServerSideError, UnrecognizedNetworkError, UserCancelledSocialPopUpError, UserNotAuthenticatedError, UserRejectedError, WaasChainEnum, WaasLoadFailedError, WaasOnboardingIncompleteError, WaasRbacStaleRetryUnsafeError, WalletAccountAlreadyVerifiedError, WalletAccountNotSelectedError, WalletAlreadyLinkedToAnotherUserError, WalletOptionNotFoundError, WalletProviderMethodUnavailableError, WalletScreeningBlockedError, __acknowledgeRecoveryCodes_wrapped as acknowledgeRecoveryCodes, addCoinbaseOnrampOrderEventListener, __addNetwork_wrapped as addNetwork, appendConnectionUriToDeeplink, assertWalletAccountSigningAvailability, assertWalletProviderMethodDefined, __attachCheckoutTransactionSource_wrapped as attachCheckoutTransactionSource, __attachFlowSource_wrapped as attachFlowSource, authenticateMfaRecoveryCode, authenticatePasskeyMFA, authenticateTotpMfaDevice, __authenticateWithSocial_wrapped as authenticateWithSocial, __broadcastCheckoutTransaction_wrapped as broadcastCheckoutTransaction, __broadcastFlow_wrapped as broadcastFlow, canConnectWithHardwareWallet, __cancelCheckoutTransaction_wrapped as cancelCheckoutTransaction, __cancelFlow_wrapped as cancelFlow, __checkStepUpAuth_wrapped as checkStepUpAuth, checkUserScopes, __claimYieldRewards_wrapped as claimYieldRewards, clearDeviceRegistrationRedirectParams, clearSocialRedirectParams, __completeDeviceRegistration_wrapped as completeDeviceRegistration, __completeSocialAuthentication_wrapped as completeSocialAuthentication, __completeSocialRedirect_wrapped as completeSocialRedirect, __confirmTransaction_wrapped as confirmTransaction, __connectAndVerifyWithWalletProvider_wrapped as connectAndVerifyWithWalletProvider, __connectWithWalletProvider_wrapped as connectWithWalletProvider, __consumeMfaToken_wrapped as consumeMfaToken, __createCheckoutTransaction_wrapped as createCheckoutTransaction, createCoinbaseExchangeTransfer, __createCoinbaseOnrampOrder_wrapped as createCoinbaseOnrampOrder, __createCryptoDotComPayment_wrapped as createCryptoDotComPayment, __createDynamicClient_wrapped as createDynamicClient, createKrakenExchangeTransfer, __createNewMfaRecoveryCodes_wrapped as createNewMfaRecoveryCodes, __deleteMfaDevice_wrapped as deleteMfaDevice, __deletePasskey_wrapped as deletePasskey, __deleteUser_wrapped as deleteUser, __depositToYieldVault_wrapped as depositToYieldVault, detectDeviceRegistrationRedirect, detectOAuthRedirect, detectSocialRedirectUrl, excludeInstalledFromCatalog, __executeSwapTransaction_wrapped as executeSwapTransaction, fetchProjectSettings, findMissingGoogleDriveBackupScopes, getActiveNetworkData, getActiveNetworkId, getAvailableWalletProvidersData, getBalance, getBalanceForAddress, getBalances, getCaptchaSettings, getCheckoutTransaction, getCheckoutTransactionQuote, getCoinbaseAccounts, getCoinbaseBuyUrl, getConnectedAddresses, getDefaultClient, getDeviceRegistrationTokenFromUrl, getElevatedAccessToken, getFlow, getFlowQuote, __getGoogleDriveBackupReadiness_wrapped as getGoogleDriveBackupReadiness, getInstallationLinkForCurrentPlatform, getKrakenAccounts, getKrakenWhitelistedAddresses, getMfaDevices, getMfaMethods, getMfaRecoveryCodes, getMissingVerificationForCoinbaseOnrampOrder, __getMoonPayCurrencies_wrapped as getMoonPayCurrencies, __getMoonPayUrl_wrapped as getMoonPayUrl, getMultichainBalances, getMultichainTokenBalances, getNativeBalance, getNetworksData, getOwnerWalletAccountForSmartWalletAccount, getPasskeys, getPreferredWalletDeepLink, getPrimaryWalletAccount, getRegisteredDevices, getSelectedWalletAccount, getSwapQuote, getSwapStatus, getTokenBalances, getTransactionHistory, getUserSocialAccounts, getWalletAccountAddressByType, getWalletAccountFromAddress, getWalletAccounts, getWalletConnectCatalog, getWalletConnectCatalogWalletByWalletProviderKey, getWalletOptionsCatalogue, getWalletProviderDataByKey, getYieldDetails, getYieldPosition, getYieldRewards, hasAllGoogleDriveBackupScopes, hasExtension, __initializeClient_wrapped as initializeClient, isAnyWalletAccountConnected, isCaptchaRequired, isDeeplinkWalletProvider, isDeviceRegistrationRequired, isExternalWalletScreeningEnabled, isHardwareWalletAccount, isInsufficientGoogleDriveScopesError, isMfaRequiredForAction, isMobile, isPendingRecoveryCodesAcknowledgment, isProgrammaticNetworkSwitchAvailable, isSignedIn, isUserMissingMfaAuth, isUserOnboardingComplete, isWalletAccountVerified, listYieldVaults, logout, matchWalletProvidersToCatalogGroup, mergeUserAccounts, offEvent, offWalletProviderEvent, onEvent, onWalletProviderEvent, onceEvent, parseUserAgent, __prepareCheckoutTransaction_wrapped as prepareCheckoutTransaction, __prepareFlowSigning_wrapped as prepareFlowSigning, __proveWalletAccountOwnership_wrapped as proveWalletAccountOwnership, __redirectToInAppBrowser_wrapped as redirectToInAppBrowser, __refreshAuth_wrapped as refreshAuth, __refreshUser_wrapped as refreshUser, __registerPasskey_wrapped as registerPasskey, __registerTotpMfaDevice_wrapped as registerTotpMfaDevice, __removeWalletAccount_wrapped as removeWalletAccount, __requestExternalAuthElevatedToken_wrapped as requestExternalAuthElevatedToken, requiresConversion, __revokeAllRegisteredDevices_wrapped as revokeAllRegisteredDevices, __revokeRegisteredDevice_wrapped as revokeRegisteredDevice, screenTransaction, __selectPrimaryWalletAccount_wrapped as selectPrimaryWalletAccount, __sendEmailOTP_wrapped as sendEmailOTP, __sendSmsOTP_wrapped as sendSmsOTP, __setCaptchaToken_wrapped as setCaptchaToken, __setDefaultMfaDevice_wrapped as setDefaultMfaDevice, __setInstrumentationEnabled_wrapped as setInstrumentationEnabled, __setSelectedWalletAccount_wrapped as setSelectedWalletAccount, __signInWithExternalJwt_wrapped as signInWithExternalJwt, __signInWithPasskey_wrapped as signInWithPasskey, __signInWithSocialPopUp_wrapped as signInWithSocialPopUp, __signInWithSocialRedirect_wrapped as signInWithSocialRedirect, __signMessage_wrapped as signMessage, __submitCheckoutTransaction_wrapped as submitCheckoutTransaction, __submitFlowTransaction_wrapped as submitFlowTransaction, supportedCountries, __switchActiveNetwork_wrapped as switchActiveNetwork, trackCheckoutTransaction, __transferAmount_wrapped as transferAmount, __transferWalletAccount_wrapped as transferWalletAccount, __unlinkSocialAccount_wrapped as unlinkSocialAccount, __updateUser_wrapped as updateUser, __verifyOTP_wrapped as verifyOTP, __verifyWalletAccount_wrapped as verifyWalletAccount, waitForClientInitialized, __withdrawFromYieldVault_wrapped as withdrawFromYieldVault };
10073
10524
  //# sourceMappingURL=index.esm.js.map