@dynamic-labs-sdk/client 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/{InvalidParamError-DQn49mNB.esm.js → InvalidParamError-Dyk0GfyN.esm.js} +257 -6
  2. package/dist/InvalidParamError-Dyk0GfyN.esm.js.map +1 -0
  3. package/dist/{InvalidParamError-DVzrk97b.cjs.js → InvalidParamError-DzSZbHE5.cjs.js} +343 -5
  4. package/dist/InvalidParamError-DzSZbHE5.cjs.js.map +1 -0
  5. package/dist/{NotWaasWalletAccountError-IxbdRVGy.cjs.js → NotWaasWalletAccountError-DFTloI8C.cjs.js} +3 -3
  6. package/dist/{NotWaasWalletAccountError-IxbdRVGy.cjs.js.map → NotWaasWalletAccountError-DFTloI8C.cjs.js.map} +1 -1
  7. package/dist/{NotWaasWalletAccountError-D0BXVuKy.esm.js → NotWaasWalletAccountError-kNpOqccC.esm.js} +3 -3
  8. package/dist/{NotWaasWalletAccountError-D0BXVuKy.esm.js.map → NotWaasWalletAccountError-kNpOqccC.esm.js.map} +1 -1
  9. package/dist/client/core/createCore/getInitialState.d.ts.map +1 -1
  10. package/dist/core.cjs.js +33 -65
  11. package/dist/core.cjs.js.map +1 -1
  12. package/dist/core.esm.js +24 -60
  13. package/dist/core.esm.js.map +1 -1
  14. package/dist/errors/DeeplinkConnectAndVerifyUnsupportedError.d.ts +9 -0
  15. package/dist/errors/DeeplinkConnectAndVerifyUnsupportedError.d.ts.map +1 -0
  16. package/dist/errors/UnauthorizedError.d.ts +5 -0
  17. package/dist/errors/UnauthorizedError.d.ts.map +1 -0
  18. package/dist/exports/core.d.ts +9 -1
  19. package/dist/exports/core.d.ts.map +1 -1
  20. package/dist/exports/index.d.ts +13 -2
  21. package/dist/exports/index.d.ts.map +1 -1
  22. package/dist/{getNetworkProviderFromNetworkId-z8WEapnj.cjs.js → getNetworkProviderFromNetworkId-BD1iGcEg.cjs.js} +66 -148
  23. package/dist/getNetworkProviderFromNetworkId-BD1iGcEg.cjs.js.map +1 -0
  24. package/dist/{getNetworkProviderFromNetworkId-DMMnYrfG.esm.js → getNetworkProviderFromNetworkId-ySZUpmOr.esm.js} +59 -96
  25. package/dist/getNetworkProviderFromNetworkId-ySZUpmOr.esm.js.map +1 -0
  26. package/dist/{getSignedSessionId-BKKO2mqj.esm.js → getSignedSessionId-BxhxGkA4.esm.js} +4 -17
  27. package/dist/getSignedSessionId-BxhxGkA4.esm.js.map +1 -0
  28. package/dist/{getSignedSessionId-BdGOv_TA.cjs.js → getSignedSessionId-s45HpP3W.cjs.js} +5 -24
  29. package/dist/getSignedSessionId-s45HpP3W.cjs.js.map +1 -0
  30. package/dist/{getVerifiedCredentialForWalletAccount-Ck7DNGPJ.cjs.js → getVerifiedCredentialForWalletAccount-BxrgouFz.cjs.js} +2 -3
  31. package/dist/{getVerifiedCredentialForWalletAccount-Ck7DNGPJ.cjs.js.map → getVerifiedCredentialForWalletAccount-BxrgouFz.cjs.js.map} +1 -1
  32. package/dist/{getVerifiedCredentialForWalletAccount-DQ7g6O7y.esm.js → getVerifiedCredentialForWalletAccount-Ch8h_J_W.esm.js} +2 -2
  33. package/dist/{getVerifiedCredentialForWalletAccount-DQ7g6O7y.esm.js.map → getVerifiedCredentialForWalletAccount-Ch8h_J_W.esm.js.map} +1 -1
  34. package/dist/index.cjs.js +291 -79
  35. package/dist/index.cjs.js.map +1 -1
  36. package/dist/index.esm.js +273 -70
  37. package/dist/index.esm.js.map +1 -1
  38. package/dist/{isMfaRequiredForAction-MvVGc7k3.esm.js → isMfaRequiredForAction-D1sFhYH1.esm.js} +3 -10
  39. package/dist/isMfaRequiredForAction-D1sFhYH1.esm.js.map +1 -0
  40. package/dist/{isMfaRequiredForAction-BINs954q.cjs.js → isMfaRequiredForAction-DaJSsq8Z.cjs.js} +2 -15
  41. package/dist/isMfaRequiredForAction-DaJSsq8Z.cjs.js.map +1 -0
  42. package/dist/modules/apiClient/createApiClient.d.ts.map +1 -1
  43. package/dist/modules/apiClient/utils/deviceSignatureHeadersMiddleware/createDeviceSignatureHeadersMiddleware.d.ts +4 -0
  44. package/dist/modules/apiClient/utils/deviceSignatureHeadersMiddleware/createDeviceSignatureHeadersMiddleware.d.ts.map +1 -0
  45. package/dist/modules/apiClient/utils/deviceSignatureHeadersMiddleware/index.d.ts +2 -0
  46. package/dist/modules/apiClient/utils/deviceSignatureHeadersMiddleware/index.d.ts.map +1 -0
  47. package/dist/modules/apiClient/utils/unauthorizedMiddleware/createUnauthorizedMiddleware.d.ts +3 -0
  48. package/dist/modules/apiClient/utils/unauthorizedMiddleware/createUnauthorizedMiddleware.d.ts.map +1 -0
  49. package/dist/modules/checkout/submitCheckoutTransaction/index.d.ts +3 -0
  50. package/dist/modules/checkout/submitCheckoutTransaction/index.d.ts.map +1 -0
  51. package/dist/modules/checkout/submitCheckoutTransaction/submitCheckoutTransaction.d.ts +22 -0
  52. package/dist/modules/checkout/submitCheckoutTransaction/submitCheckoutTransaction.d.ts.map +1 -0
  53. package/dist/modules/deviceRegistration/getDeviceSigner/getDeviceSigner.d.ts.map +1 -1
  54. package/dist/modules/deviceRegistration/getDeviceSigner/{getOrCreateUserDeviceSigningKeys/getOrCreateUserDeviceSigningKeys.d.ts → getOrCreateEnvironmentDeviceSigningKeys/getOrCreateEnvironmentDeviceSigningKeys.d.ts} +2 -2
  55. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/getOrCreateEnvironmentDeviceSigningKeys.d.ts.map +1 -0
  56. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/index.d.ts +2 -0
  57. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/index.d.ts.map +1 -0
  58. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/getHeadersForNonceSignedByDeviceSigners.d.ts +3 -0
  59. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/getHeadersForNonceSignedByDeviceSigners.d.ts.map +1 -0
  60. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/index.d.ts +2 -0
  61. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/index.d.ts.map +1 -0
  62. package/dist/modules/deviceRegistration/getRegisteredDevices/getRegisteredDevices.d.ts +3 -0
  63. package/dist/modules/deviceRegistration/getRegisteredDevices/getRegisteredDevices.d.ts.map +1 -0
  64. package/dist/modules/deviceRegistration/getRegisteredDevices/index.d.ts +2 -0
  65. package/dist/modules/deviceRegistration/getRegisteredDevices/index.d.ts.map +1 -0
  66. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/index.d.ts +2 -0
  67. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/index.d.ts.map +1 -0
  68. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/revokeAllRegisteredDevices.d.ts +2 -0
  69. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/revokeAllRegisteredDevices.d.ts.map +1 -0
  70. package/dist/modules/deviceRegistration/revokeRegisteredDevice/index.d.ts +2 -0
  71. package/dist/modules/deviceRegistration/revokeRegisteredDevice/index.d.ts.map +1 -0
  72. package/dist/modules/deviceRegistration/revokeRegisteredDevice/revokeRegisteredDevice.d.ts +6 -0
  73. package/dist/modules/deviceRegistration/revokeRegisteredDevice/revokeRegisteredDevice.d.ts.map +1 -0
  74. package/dist/modules/initializeClient/initializeClient.d.ts.map +1 -1
  75. package/dist/modules/wallets/connectAndVerifyWithWalletProvider/connectAndVerifyWithWalletProvider.d.ts +10 -0
  76. package/dist/modules/wallets/connectAndVerifyWithWalletProvider/connectAndVerifyWithWalletProvider.d.ts.map +1 -1
  77. package/dist/modules/wallets/transferAmount/index.d.ts +2 -0
  78. package/dist/modules/wallets/transferAmount/index.d.ts.map +1 -0
  79. package/dist/modules/wallets/transferAmount/transferAmount.d.ts +19 -0
  80. package/dist/modules/wallets/transferAmount/transferAmount.d.ts.map +1 -0
  81. package/dist/modules/wallets/walletProvider/index.d.ts +1 -1
  82. package/dist/modules/wallets/walletProvider/index.d.ts.map +1 -1
  83. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/index.d.ts +2 -0
  84. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/index.d.ts.map +1 -0
  85. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/isDeeplinkWalletProvider.d.ts +10 -0
  86. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/isDeeplinkWalletProvider.d.ts.map +1 -0
  87. package/dist/modules/wallets/walletProvider/walletProvider.types.d.ts +17 -0
  88. package/dist/modules/wallets/walletProvider/walletProvider.types.d.ts.map +1 -1
  89. package/dist/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.d.ts +11 -1
  90. package/dist/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.d.ts.map +1 -1
  91. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  92. package/dist/utils/getDeviceNameFromUserAgent/getDeviceNameFromUserAgent.d.ts +6 -0
  93. package/dist/utils/getDeviceNameFromUserAgent/getDeviceNameFromUserAgent.d.ts.map +1 -0
  94. package/dist/utils/getDeviceNameFromUserAgent/index.d.ts +2 -0
  95. package/dist/utils/getDeviceNameFromUserAgent/index.d.ts.map +1 -0
  96. package/dist/utils/getNonce/constants.d.ts +2 -0
  97. package/dist/utils/getNonce/constants.d.ts.map +1 -0
  98. package/dist/utils/getNonce/fetchAndStoreNonces/fetchAndStoreNonces.d.ts +13 -0
  99. package/dist/utils/getNonce/fetchAndStoreNonces/fetchAndStoreNonces.d.ts.map +1 -0
  100. package/dist/utils/getNonce/fetchAndStoreNonces/index.d.ts +2 -0
  101. package/dist/utils/getNonce/fetchAndStoreNonces/index.d.ts.map +1 -0
  102. package/dist/utils/getNonce/getNonce.d.ts +7 -0
  103. package/dist/utils/getNonce/getNonce.d.ts.map +1 -1
  104. package/dist/utils/getNonce/state.d.ts +11 -0
  105. package/dist/utils/getNonce/state.d.ts.map +1 -0
  106. package/dist/utils/parseAmountToSmallestUnit/index.d.ts +2 -0
  107. package/dist/utils/parseAmountToSmallestUnit/index.d.ts.map +1 -0
  108. package/dist/utils/parseAmountToSmallestUnit/parseAmountToSmallestUnit.d.ts +22 -0
  109. package/dist/utils/parseAmountToSmallestUnit/parseAmountToSmallestUnit.d.ts.map +1 -0
  110. package/dist/waas.cjs.js +3 -4
  111. package/dist/waas.cjs.js.map +1 -1
  112. package/dist/waas.esm.js +3 -3
  113. package/dist/waasCore.cjs.js +3 -4
  114. package/dist/waasCore.cjs.js.map +1 -1
  115. package/dist/waasCore.esm.js +3 -3
  116. package/package.json +3 -3
  117. package/dist/InvalidParamError-DQn49mNB.esm.js.map +0 -1
  118. package/dist/InvalidParamError-DVzrk97b.cjs.js.map +0 -1
  119. package/dist/getNetworkProviderFromNetworkId-DMMnYrfG.esm.js.map +0 -1
  120. package/dist/getNetworkProviderFromNetworkId-z8WEapnj.cjs.js.map +0 -1
  121. package/dist/getSignedSessionId-BKKO2mqj.esm.js.map +0 -1
  122. package/dist/getSignedSessionId-BdGOv_TA.cjs.js.map +0 -1
  123. package/dist/isMfaRequiredForAction-BINs954q.cjs.js.map +0 -1
  124. package/dist/isMfaRequiredForAction-MvVGc7k3.esm.js.map +0 -1
  125. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateUserDeviceSigningKeys/getOrCreateUserDeviceSigningKeys.d.ts.map +0 -1
package/dist/index.esm.js CHANGED
@@ -1,10 +1,10 @@
1
- import { A as version, D as BaseError, O as getCore, S as CLIENT_SDK_NAME, T as setDefaultClient, _ as getBuffer, a as DYNAMIC_ICONIC_SPRITE_URL, b as ValueMustBeDefinedError, c as CHAINS_INFO_MAP, d as MfaRateLimitedError, f as MfaInvalidOtpError, h as APIError, k as name, l as createApiClient, m as InvalidExternalAuthError, o as SDK_API_CORE_VERSION, p as LinkCredentialError, s as getChainFromVerifiedCredentialChain, t as InvalidParamError, u as SandboxMaximumThresholdReachedError, v as isCookieEnabled, w as getDefaultClient, x as randomString, y as assertDefined } from "./InvalidParamError-DQn49mNB.esm.js";
2
- import { A as createStorageKeySchema, C as createDeferredPromise, D as INITIALIZE_STORAGE_SYNC_TRACKER_KEY, E as GENERATE_SESSION_KEYS_TRACKER_KEY, F as isEqualShallow, N as createLocalStorageAdapter, O as REFRESH_USER_STATE_FROM_COOKIE_TRACKER_KEY, P as subscribeWithSelector, S as CannotTrackError, T as FETCH_PROJECT_SETTINGS_TRACKER_KEY, _ as WalletAlreadyLinkedToAnotherUserError, a as updateWalletProviderKeysForVerifiedCredentials, b as createCrossTabBroadcast, c as createSignInMessageStatement, d as setUnverifiedWalletAccounts, f as createVisit, g as isCaptchaRequired, h as consumeCaptchaToken, i as getNetworksData, j as createStorage, k as p256Keygen, l as formatSignInMessage, m as setCaptchaToken, o as verifyMessageSignatureOwnership, p as hasExtension, s as removeUnverifiedWalletAccount, t as getNetworkProviderFromNetworkId, u as getNonce, v as NoNetworkProvidersError, w as isServerSideRendering, y as createLogger } from "./getNetworkProviderFromNetworkId-DMMnYrfG.esm.js";
3
- import { D as onceEvent, E as onEvent, O as setCookie, S as splitWalletProviderKey, T as offEvent, _ as getWalletAccounts, b as formatWalletAccountId, c as getWalletProviders, d as DYNAMIC_AUTH_COOKIE_NAME, f as getWalletProviderFromWalletAccount, g as NoWalletProviderFoundError, i as restoreUserSharesForAllWalletAccounts, l as checkAndRaiseWalletAccountsChangedEvent, n as getWalletProviderByKey, r as updateAuthFromVerifyResponse, t as getVerifiedCredentialForWalletAccount, u as emitWalletAccountsChangedEvent, w as emitEvent, x as normalizeAddress } from "./getVerifiedCredentialForWalletAccount-DQ7g6O7y.esm.js";
4
- import { n as getMfaMethods, r as consumeMfaToken, t as isMfaRequiredForAction } from "./isMfaRequiredForAction-MvVGc7k3.esm.js";
5
- import { n as refreshAuth, t as NotWaasWalletAccountError } from "./NotWaasWalletAccountError-D0BXVuKy.esm.js";
1
+ import { A as randomString, C as InvalidExternalAuthError, D as isCookieEnabled, I as BaseError, L as getCore, N as getDefaultClient, O as assertDefined, P as setDefaultClient, R as name, S as LinkCredentialError, a as DYNAMIC_ICONIC_SPRITE_URL, b as MfaRateLimitedError, c as CHAINS_INFO_MAP, d as UnauthorizedError, g as createStorageKeySchema, j as CLIENT_SDK_NAME, k as ValueMustBeDefinedError, l as fetchAndStoreNonces, o as SDK_API_CORE_VERSION, s as getChainFromVerifiedCredentialChain, t as InvalidParamError, u as createApiClient, v as getNonce, w as APIError, x as MfaInvalidOtpError, y as SandboxMaximumThresholdReachedError, z as version } from "./InvalidParamError-Dyk0GfyN.esm.js";
2
+ import { A as isEqualShallow, C as isServerSideRendering, D as REFRESH_USER_STATE_FROM_COOKIE_TRACKER_KEY, E as INITIALIZE_STORAGE_SYNC_TRACKER_KEY, N as createLocalStorageAdapter, O as generateSessionKeys, S as createDeferredPromise, T as GENERATE_SESSION_KEYS_TRACKER_KEY, _ as NoNetworkProvidersError, a as updateWalletProviderKeysForVerifiedCredentials, c as createSignInMessageStatement, d as createVisit, f as hasExtension, g as WalletAlreadyLinkedToAnotherUserError, h as isCaptchaRequired, i as getNetworksData, j as createStorage, k as subscribeWithSelector, l as formatSignInMessage, m as consumeCaptchaToken, o as verifyMessageSignatureOwnership, p as setCaptchaToken, s as removeUnverifiedWalletAccount, t as getNetworkProviderFromNetworkId, u as setUnverifiedWalletAccounts, v as createLogger, w as FETCH_PROJECT_SETTINGS_TRACKER_KEY, x as CannotTrackError, y as createCrossTabBroadcast } from "./getNetworkProviderFromNetworkId-ySZUpmOr.esm.js";
3
+ import { D as onceEvent, E as onEvent, O as setCookie, S as splitWalletProviderKey, T as offEvent, _ as getWalletAccounts, b as formatWalletAccountId, c as getWalletProviders, d as DYNAMIC_AUTH_COOKIE_NAME, f as getWalletProviderFromWalletAccount, g as NoWalletProviderFoundError, i as restoreUserSharesForAllWalletAccounts, l as checkAndRaiseWalletAccountsChangedEvent, n as getWalletProviderByKey, r as updateAuthFromVerifyResponse, t as getVerifiedCredentialForWalletAccount, u as emitWalletAccountsChangedEvent, w as emitEvent, x as normalizeAddress } from "./getVerifiedCredentialForWalletAccount-Ch8h_J_W.esm.js";
4
+ import { n as refreshAuth, t as NotWaasWalletAccountError } from "./NotWaasWalletAccountError-kNpOqccC.esm.js";
5
+ import { n as getMfaMethods, r as consumeMfaToken, t as isMfaRequiredForAction } from "./isMfaRequiredForAction-D1sFhYH1.esm.js";
6
6
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
7
- import { AuthModeEnum, ExchangeKeyEnum, JwtVerifiedCredentialFormatEnum, MFAAction, MfaBackupCodeAcknowledgement, ProviderEnum, WaasBackupOptionsEnum } from "@dynamic-labs/sdk-api-core";
7
+ import { AuthModeEnum, ExchangeKeyEnum, JwtVerifiedCredentialFormatEnum, MFAAction, MfaBackupCodeAcknowledgement, ProviderEnum, WaasBackupOptionsEnum, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
8
8
  import * as z from "zod/mini";
9
9
  import EventEmitter, { EventEmitter as EventEmitter$1 } from "eventemitter3";
10
10
  import { browserSupportsWebAuthn, startAuthentication, startRegistration } from "@simplewebauthn/browser";
@@ -117,26 +117,6 @@ const fetchProjectSettings = async (client = getDefaultClient()) => {
117
117
  return projectSettings;
118
118
  };
119
119
 
120
- //#endregion
121
- //#region src/modules/sessionKeys/generateSessionKeys/generateSessionKeys.ts
122
- const generateSessionKeys = async (client) => {
123
- const { private: privateKey, public: publicKey, privateJwk: privateKeyJwk } = await p256Keygen();
124
- const core = getCore(client);
125
- const stringifiedSessionKeys = JSON.stringify({
126
- privateKey,
127
- privateKeyJwk,
128
- publicKey,
129
- registered: false
130
- });
131
- const encodedSessionKeys = getBuffer().from(stringifiedSessionKeys).toString("base64");
132
- core.state.set({ sessionKeys: encodedSessionKeys });
133
- return {
134
- privateKey,
135
- privateKeyJwk,
136
- publicKey
137
- };
138
- };
139
-
140
120
  //#endregion
141
121
  //#region src/services/runtimeServices/createRuntimeServices/createRuntimeServices.ts
142
122
  /**
@@ -484,6 +464,9 @@ const initializeClient = async (client = getDefaultClient()) => {
484
464
  const fetchProjectSettingsPromise = initializeStorageSyncPromise.then(async () => {
485
465
  if (!core.state.get().projectSettings) await fetchProjectSettings(client);
486
466
  });
467
+ fetchProjectSettingsPromise.then(() => fetchAndStoreNonces(client)).catch((error) => {
468
+ core.logger.error("Failed to prefetch nonces:", error);
469
+ });
487
470
  /**
488
471
  * Generate session keys if they don't exist
489
472
  */
@@ -642,12 +625,22 @@ const createNavigationHandler = () => {
642
625
  //#endregion
643
626
  //#region src/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.ts
644
627
  /**
645
- * Creates a deeplink opener that uses the native window.open API.
628
+ * Creates a deeplink opener that navigates the current tab to the deeplink URL.
629
+ *
630
+ * Uses `window.location.assign` instead of `window.open` deliberately.
631
+ * This matters for Phantom redirect specifically, which is the only deep link
632
+ * provider that redirects back to the app in a new tab. With `window.open`,
633
+ * the browser first opens an `about:blank` tab before the native wallet app
634
+ * handles the deep link. When Phantom redirects back, it opens yet another
635
+ * tab. The user ends up with three tabs (original, about:blank, redirect) and
636
+ * the browser focuses the lingering about:blank after the redirect tab closes.
637
+ * `window.location.assign` reuses the current tab, avoiding the extra tab
638
+ * entirely.
646
639
  */
647
640
  const createWebDeeplinkOpener = () => {
648
641
  if (isServerSideRendering()) return () => Promise.reject(new UnavailableInServerSideError("createWebDeeplinkOpener"));
649
642
  return async (url) => {
650
- window.open(url, "_blank");
643
+ window.location.assign(url);
651
644
  };
652
645
  };
653
646
 
@@ -802,6 +795,7 @@ const getInitialState = () => ({
802
795
  initStatus: "uninitialized",
803
796
  legacyToken: null,
804
797
  mfaToken: null,
798
+ prefetchedNonces: [],
805
799
  projectSettings: null,
806
800
  sessionExpiresAt: null,
807
801
  sessionKeys: null,
@@ -923,6 +917,27 @@ var CheckoutSessionTokenMissingError = class extends BaseError {
923
917
  }
924
918
  };
925
919
 
920
+ //#endregion
921
+ //#region src/errors/DeeplinkConnectAndVerifyUnsupportedError.ts
922
+ var DeeplinkConnectAndVerifyUnsupportedError = class extends BaseError {
923
+ constructor({ walletProviderKey }) {
924
+ super({
925
+ cause: null,
926
+ code: "deeplink_connect_and_verify_unsupported",
927
+ docsUrl: null,
928
+ metaMessages: [
929
+ `Wallet provider key: ${walletProviderKey}`,
930
+ "On mobile, deep link wallet providers (e.g. Phantom redirect) cannot connect and verify in a single step.",
931
+ "iOS does not allow two sequential deep links — the second one is silently ignored because it is no longer tied to a user gesture.",
932
+ "Android may handle sequential deep links differently, but this guard applies to all mobile platforms to ensure a stable experience and prevent production-only errors.",
933
+ "Use connectWithWalletProvider() first, then call verifyWalletAccount() from a separate user action (e.g. a \"Verify Ownership\" button)."
934
+ ],
935
+ name: "DeeplinkConnectAndVerifyUnsupportedError",
936
+ shortMessage: "connectAndVerifyWithWalletProvider is not supported for deep link wallet providers on mobile. Use connectWithWalletProvider and verifyWalletAccount separately."
937
+ });
938
+ }
939
+ };
940
+
926
941
  //#endregion
927
942
  //#region src/errors/FeeEstimationFailedError.ts
928
943
  var FeeEstimationFailedError = class extends BaseError {
@@ -1905,6 +1920,67 @@ const prepareCheckoutTransaction = async ({ transactionId }, client = getDefault
1905
1920
  });
1906
1921
  };
1907
1922
 
1923
+ //#endregion
1924
+ //#region src/modules/wallets/utils/assertWalletProviderMethodDefined/assertWalletProviderMethodDefined.ts
1925
+ /**
1926
+ * Asserts that a specific wallet provider method is defined, throwing an error if it's not.
1927
+ * This function acts as a type guard, narrowing the type to ensure the method exists.
1928
+ *
1929
+ * @template T - The specific wallet provider method key being checked
1930
+ * @param walletProvider - The wallet provider object to check
1931
+ * @param methodName - The name of the method to check for availability
1932
+ * @throws Throws WalletProviderMethodUnavailableError if the method is not defined
1933
+ * @example
1934
+ * ```typescript
1935
+ * const walletProvider: WalletProvider = getWalletProvider();
1936
+ * assertWalletProviderMethodDefined(walletProvider, 'connect');
1937
+ * // walletProvider.connect is now guaranteed to be defined
1938
+ * await walletProvider.connect();
1939
+ * ```
1940
+ */
1941
+ function assertWalletProviderMethodDefined(walletProvider, methodName) {
1942
+ if (walletProvider[methodName] === void 0) throw new WalletProviderMethodUnavailableError({
1943
+ methodName,
1944
+ walletProviderKey: walletProvider.key
1945
+ });
1946
+ }
1947
+
1948
+ //#endregion
1949
+ //#region src/modules/checkout/submitCheckoutTransaction/submitCheckoutTransaction.ts
1950
+ /**
1951
+ * Prepares, signs, and broadcasts a checkout transaction in one call.
1952
+ *
1953
+ * Orchestrates the full submission flow:
1954
+ * 1. Calls prepareCheckoutTransaction to advance to signing state and lock the quote
1955
+ * 2. Ensures the wallet is on the correct network for the transaction
1956
+ * 3. Delegates on-chain signing to the wallet provider's executeCheckoutTransaction method
1957
+ * 4. Calls broadcastCheckoutTransaction with the resulting txHash
1958
+ *
1959
+ * @param params SubmitCheckoutTransactionParams - The transaction ID, wallet account, and optional step callback.
1960
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
1961
+ * @returns The broadcasted checkout transaction
1962
+ */
1963
+ const submitCheckoutTransaction = async ({ onStepChange, transactionId, walletAccount }, client = getDefaultClient()) => {
1964
+ const prepared = await prepareCheckoutTransaction({ transactionId }, client);
1965
+ assertDefined(prepared.signingPayload, "No signing payload returned from prepare — quote may be missing transaction data");
1966
+ const walletProvider = getWalletProviderFromWalletAccount({ walletAccount }, client);
1967
+ assertWalletProviderMethodDefined(walletProvider, "executeCheckoutTransaction");
1968
+ const requiredNetworkId = prepared.signingPayload.chainId;
1969
+ if (requiredNetworkId && walletProvider.switchActiveNetwork) {
1970
+ const { networkId: activeNetworkId } = await walletProvider.getActiveNetworkId();
1971
+ if (activeNetworkId !== requiredNetworkId) await walletProvider.switchActiveNetwork({ networkId: requiredNetworkId });
1972
+ }
1973
+ const { transactionHash } = await walletProvider.executeCheckoutTransaction({
1974
+ onStepChange,
1975
+ signingPayload: prepared.signingPayload,
1976
+ walletAccount
1977
+ });
1978
+ return broadcastCheckoutTransaction({
1979
+ transactionId,
1980
+ txHash: transactionHash
1981
+ }, client);
1982
+ };
1983
+
1908
1984
  //#endregion
1909
1985
  //#region src/modules/deviceRegistration/completeDeviceRegistration/completeDeviceRegistration.ts
1910
1986
  const DEVICE_REGISTRATION_TOKEN_HEADER = "x-dynamic-device-registration-token";
@@ -1959,6 +2035,23 @@ const detectDeviceRegistrationRedirect = ({ url }) => {
1959
2035
  }
1960
2036
  };
1961
2037
 
2038
+ //#endregion
2039
+ //#region src/modules/deviceRegistration/getRegisteredDevices/getRegisteredDevices.ts
2040
+ const getRegisteredDevices = async (client = getDefaultClient()) => {
2041
+ const core = getCore(client);
2042
+ const apiClient = createApiClient({}, client);
2043
+ try {
2044
+ return (await apiClient.listDeviceRegistrations({ environmentId: core.environmentId })).deviceRegistrations;
2045
+ } catch (error) {
2046
+ /**
2047
+ * The API will return 401 when no devices are registered when there are no
2048
+ * devices registered. We need to handle this case gracefully.
2049
+ */
2050
+ if (error instanceof UnauthorizedError) return [];
2051
+ throw error;
2052
+ }
2053
+ };
2054
+
1962
2055
  //#endregion
1963
2056
  //#region src/modules/deviceRegistration/isDeviceRegistrationRequired/isDeviceRegistrationRequired.ts
1964
2057
  /**
@@ -1975,6 +2068,26 @@ const isDeviceRegistrationRequired = (client = getDefaultClient()) => {
1975
2068
  return Boolean(user.scope?.includes("device:register"));
1976
2069
  };
1977
2070
 
2071
+ //#endregion
2072
+ //#region src/modules/deviceRegistration/revokeAllRegisteredDevices/revokeAllRegisteredDevices.ts
2073
+ const revokeAllRegisteredDevices = async (client = getDefaultClient()) => {
2074
+ const core = getCore(client);
2075
+ await createApiClient({}, client).deleteAllDeviceRegistrations({ environmentId: core.environmentId });
2076
+ await refreshAuth(client);
2077
+ };
2078
+
2079
+ //#endregion
2080
+ //#region src/modules/deviceRegistration/revokeRegisteredDevice/revokeRegisteredDevice.ts
2081
+ const revokeRegisteredDevice = async ({ deviceRegistrationId }, client = getDefaultClient()) => {
2082
+ assertDefined(deviceRegistrationId, "deviceRegistrationId is required");
2083
+ const core = getCore(client);
2084
+ await createApiClient({}, client).deleteDeviceRegistration({
2085
+ deviceRegistrationId,
2086
+ environmentId: core.environmentId
2087
+ });
2088
+ await refreshAuth(client);
2089
+ };
2090
+
1978
2091
  //#endregion
1979
2092
  //#region src/modules/funding/coinbase/addCoinbaseOnrampOrderEventListener/addCoinbaseOnrampOrderEventListener.ts
1980
2093
  /**
@@ -4125,29 +4238,27 @@ const assertWalletAccountSigningAvailability = async ({ walletAccount }, client
4125
4238
  };
4126
4239
 
4127
4240
  //#endregion
4128
- //#region src/modules/wallets/utils/assertWalletProviderMethodDefined/assertWalletProviderMethodDefined.ts
4241
+ //#region src/utils/isMobile/isMobile.ts
4129
4242
  /**
4130
- * Asserts that a specific wallet provider method is defined, throwing an error if it's not.
4131
- * This function acts as a type guard, narrowing the type to ensure the method exists.
4132
- *
4133
- * @template T - The specific wallet provider method key being checked
4134
- * @param walletProvider - The wallet provider object to check
4135
- * @param methodName - The name of the method to check for availability
4136
- * @throws Throws WalletProviderMethodUnavailableError if the method is not defined
4137
- * @example
4138
- * ```typescript
4139
- * const walletProvider: WalletProvider = getWalletProvider();
4140
- * assertWalletProviderMethodDefined(walletProvider, 'connect');
4141
- * // walletProvider.connect is now guaranteed to be defined
4142
- * await walletProvider.connect();
4143
- * ```
4243
+ * Sourced from http://detectmobilebrowsers.com/
4144
4244
  */
4145
- function assertWalletProviderMethodDefined(walletProvider, methodName) {
4146
- if (walletProvider[methodName] === void 0) throw new WalletProviderMethodUnavailableError({
4147
- methodName,
4148
- walletProviderKey: walletProvider.key
4149
- });
4150
- }
4245
+ 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;
4246
+ 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;
4247
+ const isMobile = (maxTouchPointsOverride) => {
4248
+ if (typeof window === "undefined" || typeof navigator === "undefined") return false;
4249
+ return userAgentRegex1.test(navigator.userAgent) || userAgentRegex2.test(navigator.userAgent.substring(0, 4)) || isIPad(maxTouchPointsOverride) || isIPhone();
4250
+ };
4251
+ const isIPhone = () => typeof window === "undefined" || typeof navigator === "undefined" ? false : /iPhone|ios/.test(navigator.userAgent);
4252
+ /**
4253
+ * @param [optional] maxTouchPointsOverride - this is used for testing since
4254
+ * it seems that JSDOM doesn't support maxTouchPoints, so it was impossible
4255
+ * to mock it
4256
+ */
4257
+ const isIPad = (maxTouchPointsOverride) => {
4258
+ if (typeof window === "undefined" || typeof navigator === "undefined") return false;
4259
+ const maxTouchPoints = maxTouchPointsOverride || navigator.maxTouchPoints;
4260
+ return /iPad/.test(navigator.userAgent) || /Mac/.test(navigator.userAgent) && maxTouchPoints === 5;
4261
+ };
4151
4262
 
4152
4263
  //#endregion
4153
4264
  //#region src/modules/wallets/utils/getAddressesWithTypesFromConnectionResult/getAddressesWithTypesFromConnectionResult.ts
@@ -4357,6 +4468,13 @@ const verifyWalletAccount = async ({ walletAccount, requestedScopes }, client =
4357
4468
  }, client);
4358
4469
  };
4359
4470
 
4471
+ //#endregion
4472
+ //#region src/modules/wallets/walletProvider/isDeeplinkWalletProvider/isDeeplinkWalletProvider.ts
4473
+ /**
4474
+ * Returns true if the wallet provider uses the deep link protocol (e.g. Phantom redirect on mobile).
4475
+ */
4476
+ const isDeeplinkWalletProvider = ({ walletProvider }) => walletProvider.walletProviderType === WalletProviderEnum.DeepLink;
4477
+
4360
4478
  //#endregion
4361
4479
  //#region src/modules/wallets/connectAndVerifyWithWalletProvider/connectAndVerifyWithWalletProvider.ts
4362
4480
  /**
@@ -4366,12 +4484,24 @@ const verifyWalletAccount = async ({ walletAccount, requestedScopes }, client =
4366
4484
  * requiring the user to sign a message to prove wallet ownership before
4367
4485
  * the wallet account is added to their profile.
4368
4486
  *
4487
+ * @throws {DeeplinkConnectAndVerifyUnsupportedError} On mobile with deep link
4488
+ * wallet providers (e.g. Phantom redirect). This function triggers two sequential
4489
+ * deeplinks — one to connect and another to sign for verification. iOS will not
4490
+ * honor the second deeplink because it is no longer tied to a user gesture.
4491
+ * Android may handle sequential deeplinks differently, but this guard applies to
4492
+ * all mobile platforms to ensure a stable experience and prevent production-only
4493
+ * errors. Use `connectWithWalletProvider` first and then invoke
4494
+ * `verifyWalletAccount` separately from a new user gesture (e.g. a "Verify
4495
+ * Ownership" button).
4496
+ *
4369
4497
  * @param params.walletProviderKey - The unique key identifying the wallet provider to connect to.
4370
4498
  * @param [params.hardwareWalletVendor] - The hardware wallet vendor, if connecting via a hardware wallet (e.g. 'ledger').
4371
4499
  * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
4372
4500
  * @returns A promise that resolves to the connected and verified wallet account.
4373
4501
  */
4374
4502
  const connectAndVerifyWithWalletProvider = async ({ walletProviderKey, hardwareWalletVendor }, client = getDefaultClient()) => {
4503
+ const walletProvider = getWalletProviderByKey({ walletProviderKey }, client);
4504
+ if (isMobile() && isDeeplinkWalletProvider({ walletProvider })) throw new DeeplinkConnectAndVerifyUnsupportedError({ walletProviderKey });
4375
4505
  const walletAccount = await connectWithWalletProvider({
4376
4506
  addToDynamicWalletAccounts: false,
4377
4507
  hardwareWalletVendor,
@@ -4743,6 +4873,34 @@ const signMessage = async ({ walletAccount, message }, client = getDefaultClient
4743
4873
  return { signature };
4744
4874
  };
4745
4875
 
4876
+ //#endregion
4877
+ //#region src/modules/wallets/transferAmount/transferAmount.ts
4878
+ /**
4879
+ * Transfers an amount of currency from the wallet account to a recipient.
4880
+ *
4881
+ * Supports native token transfers and, where supported by the chain,
4882
+ * fungible/token transfers via the optional `token` parameter.
4883
+ *
4884
+ * @param params.walletAccount - The wallet account to transfer from.
4885
+ * @param params.amount - The amount to transfer as a decimal string (e.g. "1.5").
4886
+ * @param params.recipient - The recipient address.
4887
+ * @param params.token - Optional token info for non-native transfers.
4888
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
4889
+ * @returns A promise that resolves to an object containing the transaction hash.
4890
+ * @throws If the wallet provider does not support the transfer amount method.
4891
+ */
4892
+ const transferAmount = async ({ walletAccount, amount, recipient, token }, client = getDefaultClient()) => {
4893
+ const walletProvider = getWalletProviderFromWalletAccount({ walletAccount }, client);
4894
+ assertWalletProviderMethodDefined(walletProvider, "transferAmount");
4895
+ const { transactionHash } = await walletProvider.transferAmount({
4896
+ amount,
4897
+ recipient,
4898
+ token,
4899
+ walletAccount
4900
+ });
4901
+ return { transactionHash };
4902
+ };
4903
+
4746
4904
  //#endregion
4747
4905
  //#region src/modules/wallets/transferWalletAccount/transferWalletAccount.ts
4748
4906
  /**
@@ -4821,26 +4979,71 @@ const onWalletProviderEvent = ({ callback, event, walletProviderKey }, client =
4821
4979
  };
4822
4980
 
4823
4981
  //#endregion
4824
- //#region src/utils/isMobile/isMobile.ts
4825
- /**
4826
- * Sourced from http://detectmobilebrowsers.com/
4827
- */
4828
- 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;
4829
- 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;
4830
- const isMobile = (maxTouchPointsOverride) => {
4831
- if (typeof window === "undefined" || typeof navigator === "undefined") return false;
4832
- return userAgentRegex1.test(navigator.userAgent) || userAgentRegex2.test(navigator.userAgent.substring(0, 4)) || isIPad(maxTouchPointsOverride) || isIPhone();
4833
- };
4834
- const isIPhone = () => typeof window === "undefined" || typeof navigator === "undefined" ? false : /iPhone|ios/.test(navigator.userAgent);
4835
- /**
4836
- * @param [optional] maxTouchPointsOverride - this is used for testing since
4837
- * it seems that JSDOM doesn't support maxTouchPoints, so it was impossible
4838
- * to mock it
4839
- */
4840
- const isIPad = (maxTouchPointsOverride) => {
4841
- if (typeof window === "undefined" || typeof navigator === "undefined") return false;
4842
- const maxTouchPoints = maxTouchPointsOverride || navigator.maxTouchPoints;
4843
- return /iPad/.test(navigator.userAgent) || /Mac/.test(navigator.userAgent) && maxTouchPoints === 5;
4982
+ //#region src/utils/getDeviceNameFromUserAgent/getDeviceNameFromUserAgent.ts
4983
+ const browserMatchers = [
4984
+ {
4985
+ name: "Edge",
4986
+ pattern: /Edg(e|A|iOS)?\//
4987
+ },
4988
+ {
4989
+ name: "Opera",
4990
+ pattern: /OPR\/|Opera/
4991
+ },
4992
+ {
4993
+ name: "Samsung Browser",
4994
+ pattern: /SamsungBrowser/
4995
+ },
4996
+ {
4997
+ name: "Firefox",
4998
+ pattern: /Firefox/
4999
+ },
5000
+ {
5001
+ name: "Safari",
5002
+ pattern: /^(?!.*(?:Chrome|Chromium|CriOS)).*Safari/
5003
+ },
5004
+ {
5005
+ name: "Chrome",
5006
+ pattern: /Chrome|CriOS/
5007
+ }
5008
+ ];
5009
+ const osMatchers = [
5010
+ {
5011
+ name: "iPhone",
5012
+ pattern: /iPhone/
5013
+ },
5014
+ {
5015
+ name: "iPad",
5016
+ pattern: /iPad/
5017
+ },
5018
+ {
5019
+ name: "Android",
5020
+ pattern: /Android/
5021
+ },
5022
+ {
5023
+ name: "Windows",
5024
+ pattern: /Windows/
5025
+ },
5026
+ {
5027
+ name: "macOS",
5028
+ pattern: /Macintosh|Mac OS X/
5029
+ },
5030
+ {
5031
+ name: "Linux",
5032
+ pattern: /Linux/
5033
+ },
5034
+ {
5035
+ name: "ChromeOS",
5036
+ pattern: /CrOS/
5037
+ }
5038
+ ];
5039
+ const getDeviceNameFromUserAgent = ({ userAgent }) => {
5040
+ if (!userAgent) return null;
5041
+ const browser = browserMatchers.find(({ pattern }) => pattern.test(userAgent))?.name;
5042
+ const os = osMatchers.find(({ pattern }) => pattern.test(userAgent))?.name;
5043
+ if (browser && os) return `${browser} on ${os}`;
5044
+ if (browser) return browser;
5045
+ if (os) return os;
5046
+ return null;
4844
5047
  };
4845
5048
 
4846
5049
  //#endregion
@@ -4848,5 +5051,5 @@ const isIPad = (maxTouchPointsOverride) => {
4848
5051
  assertPackageVersion(name, version);
4849
5052
 
4850
5053
  //#endregion
4851
- export { BaseError, CheckoutSessionTokenMissingError, ClientAlreadyInitializedError, FeeEstimationFailedError, InvalidDeviceRegistrationRedirectError, InvalidExternalAuthError, InvalidParamError, InvalidRedirectStorageStateError, LinkCredentialError, MFAAction, MfaInvalidOtpError, MfaRateLimitedError, MissingRedirectStorageStateError, MissingSocialUrlParamError, MissingUserVerificationError, NetworkAddingUnavailableError, NetworkNotAddedError, NetworkSwitchingUnavailableError, NoAddressFoundError, NoNetworkProvidersError, NoPasskeyCredentialsFoundError, NoSmartWalletAccountSignerFoundError, NoWebAuthNSupportError, NotWaasWalletAccountError, SandboxMaximumThresholdReachedError, SimulationFailedError, UnavailableInServerSideError, UnrecognizedNetworkError, UserNotAuthenticatedError, UserRejectedError, WalletAccountAlreadyVerifiedError, WalletAccountNotSelectedError, WalletAlreadyLinkedToAnotherUserError, WalletProviderMethodUnavailableError, acknowledgeRecoveryCodes, addCoinbaseOnrampOrderEventListener, addNetwork, assertWalletAccountSigningAvailability, assertWalletProviderMethodDefined, attachCheckoutTransactionSource, authenticateMfaRecoveryCode, authenticatePasskeyMFA, authenticateTotpMfaDevice, authenticateWithSocial, broadcastCheckoutTransaction, canConnectWithHardwareWallet, cancelCheckoutTransaction, completeDeviceRegistration, completeSocialAuthentication, connectAndVerifyWithWalletProvider, connectWithWalletProvider, consumeMfaToken, createCheckoutTransaction, createCoinbaseOnrampOrder, createCryptoDotComPayment, createDynamicClient, createKrakenExchangeTransfer, createNewMfaRecoveryCodes, deleteMfaDevice, deletePasskey, deleteUser, detectDeviceRegistrationRedirect, detectOAuthRedirect, fetchProjectSettings, getActiveNetworkData, getActiveNetworkId, getAvailableWalletProvidersData, getBalance, getBalanceForAddress, getCheckoutTransaction, getCheckoutTransactionQuote, getCoinbaseBuyUrl, getConnectedAddresses, getDefaultClient, getDeviceRegistrationTokenFromUrl, getElevatedAccessToken, getKrakenAccounts, getKrakenWhitelistedAddresses, getMfaDevices, getMfaMethods, getMfaRecoveryCodes, getMissingVerificationForCoinbaseOnrampOrder, getMultichainBalances, getNetworksData, getOwnerWalletAccountForSmartWalletAccount, getPasskeys, getPrimaryWalletAccount, getTransactionHistory, getUserSocialAccounts, getWalletAccountAddressByType, getWalletAccountFromAddress, getWalletAccounts, getWalletConnectCatalog, getWalletConnectCatalogWalletByWalletProviderKey, getWalletProviderDataByKey, hasExtension, initializeClient, isCaptchaRequired, isDeviceRegistrationRequired, isHardwareWalletAccount, isMfaRequiredForAction, isMobile, isPendingRecoveryCodesAcknowledgment, isProgrammaticNetworkSwitchAvailable, isSignedIn, isUserMissingMfaAuth, isUserOnboardingComplete, isWalletAccountVerified, logout, offEvent, offWalletProviderEvent, onEvent, onWalletProviderEvent, onceEvent, prepareCheckoutTransaction, proveWalletAccountOwnership, refreshAuth, refreshUser, registerPasskey, registerTotpMfaDevice, removeWalletAccount, selectPrimaryWalletAccount, sendEmailOTP, sendSmsOTP, setCaptchaToken, setDefaultMfaDevice, signInWithExternalJwt, signInWithPasskey, signMessage, supportedCountries, switchActiveNetwork, transferWalletAccount, unlinkSocialAccount, updateUser, verifyOTP, verifyWalletAccount, waitForClientInitialized };
5054
+ export { BaseError, CheckoutSessionTokenMissingError, ClientAlreadyInitializedError, DeeplinkConnectAndVerifyUnsupportedError, FeeEstimationFailedError, InvalidDeviceRegistrationRedirectError, InvalidExternalAuthError, InvalidParamError, InvalidRedirectStorageStateError, LinkCredentialError, MFAAction, MfaInvalidOtpError, MfaRateLimitedError, MissingRedirectStorageStateError, MissingSocialUrlParamError, MissingUserVerificationError, NetworkAddingUnavailableError, NetworkNotAddedError, NetworkSwitchingUnavailableError, NoAddressFoundError, NoNetworkProvidersError, NoPasskeyCredentialsFoundError, NoSmartWalletAccountSignerFoundError, NoWebAuthNSupportError, NotWaasWalletAccountError, SandboxMaximumThresholdReachedError, SimulationFailedError, UnauthorizedError, UnavailableInServerSideError, UnrecognizedNetworkError, UserNotAuthenticatedError, UserRejectedError, WalletAccountAlreadyVerifiedError, WalletAccountNotSelectedError, WalletAlreadyLinkedToAnotherUserError, WalletProviderMethodUnavailableError, acknowledgeRecoveryCodes, addCoinbaseOnrampOrderEventListener, addNetwork, assertWalletAccountSigningAvailability, assertWalletProviderMethodDefined, attachCheckoutTransactionSource, authenticateMfaRecoveryCode, authenticatePasskeyMFA, authenticateTotpMfaDevice, authenticateWithSocial, broadcastCheckoutTransaction, canConnectWithHardwareWallet, cancelCheckoutTransaction, completeDeviceRegistration, completeSocialAuthentication, connectAndVerifyWithWalletProvider, connectWithWalletProvider, consumeMfaToken, createCheckoutTransaction, createCoinbaseOnrampOrder, createCryptoDotComPayment, createDynamicClient, createKrakenExchangeTransfer, createNewMfaRecoveryCodes, deleteMfaDevice, deletePasskey, deleteUser, detectDeviceRegistrationRedirect, detectOAuthRedirect, fetchProjectSettings, getActiveNetworkData, getActiveNetworkId, getAvailableWalletProvidersData, getBalance, getBalanceForAddress, getCheckoutTransaction, getCheckoutTransactionQuote, getCoinbaseBuyUrl, getConnectedAddresses, getDefaultClient, getDeviceNameFromUserAgent, getDeviceRegistrationTokenFromUrl, getElevatedAccessToken, getKrakenAccounts, getKrakenWhitelistedAddresses, getMfaDevices, getMfaMethods, getMfaRecoveryCodes, getMissingVerificationForCoinbaseOnrampOrder, getMultichainBalances, getNetworksData, getOwnerWalletAccountForSmartWalletAccount, getPasskeys, getPrimaryWalletAccount, getRegisteredDevices, getTransactionHistory, getUserSocialAccounts, getWalletAccountAddressByType, getWalletAccountFromAddress, getWalletAccounts, getWalletConnectCatalog, getWalletConnectCatalogWalletByWalletProviderKey, getWalletProviderDataByKey, hasExtension, initializeClient, isCaptchaRequired, isDeeplinkWalletProvider, isDeviceRegistrationRequired, isHardwareWalletAccount, isMfaRequiredForAction, isMobile, isPendingRecoveryCodesAcknowledgment, isProgrammaticNetworkSwitchAvailable, isSignedIn, isUserMissingMfaAuth, isUserOnboardingComplete, isWalletAccountVerified, logout, offEvent, offWalletProviderEvent, onEvent, onWalletProviderEvent, onceEvent, prepareCheckoutTransaction, proveWalletAccountOwnership, refreshAuth, refreshUser, registerPasskey, registerTotpMfaDevice, removeWalletAccount, revokeAllRegisteredDevices, revokeRegisteredDevice, selectPrimaryWalletAccount, sendEmailOTP, sendSmsOTP, setCaptchaToken, setDefaultMfaDevice, signInWithExternalJwt, signInWithPasskey, signMessage, submitCheckoutTransaction, supportedCountries, switchActiveNetwork, transferAmount, transferWalletAccount, unlinkSocialAccount, updateUser, verifyOTP, verifyWalletAccount, waitForClientInitialized };
4852
5055
  //# sourceMappingURL=index.esm.js.map