@dynamic-labs-sdk/client 0.14.0 → 0.16.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 (147) hide show
  1. package/dist/{InvalidParamError-DQn49mNB.esm.js → InvalidParamError-Cty-xWsw.esm.js} +268 -10
  2. package/dist/InvalidParamError-Cty-xWsw.esm.js.map +1 -0
  3. package/dist/{InvalidParamError-DVzrk97b.cjs.js → InvalidParamError-DO9X0rAe.cjs.js} +360 -9
  4. package/dist/InvalidParamError-DO9X0rAe.cjs.js.map +1 -0
  5. package/dist/{NotWaasWalletAccountError-IxbdRVGy.cjs.js → NotWaasWalletAccountError-Bj3-tWL3.cjs.js} +3 -3
  6. package/dist/{NotWaasWalletAccountError-IxbdRVGy.cjs.js.map → NotWaasWalletAccountError-Bj3-tWL3.cjs.js.map} +1 -1
  7. package/dist/{NotWaasWalletAccountError-D0BXVuKy.esm.js → NotWaasWalletAccountError-x0HlFCot.esm.js} +3 -3
  8. package/dist/{NotWaasWalletAccountError-D0BXVuKy.esm.js.map → NotWaasWalletAccountError-x0HlFCot.esm.js.map} +1 -1
  9. package/dist/client/core/createCore/getInitialState.d.ts.map +1 -1
  10. package/dist/core.cjs.js +34 -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 +11 -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-B2NiAPL7.cjs.js} +66 -148
  23. package/dist/getNetworkProviderFromNetworkId-B2NiAPL7.cjs.js.map +1 -0
  24. package/dist/{getNetworkProviderFromNetworkId-DMMnYrfG.esm.js → getNetworkProviderFromNetworkId-DKM-ec3L.esm.js} +59 -96
  25. package/dist/getNetworkProviderFromNetworkId-DKM-ec3L.esm.js.map +1 -0
  26. package/dist/{getSignedSessionId-BdGOv_TA.cjs.js → getSignedSessionId-BQb75faX.cjs.js} +5 -24
  27. package/dist/getSignedSessionId-BQb75faX.cjs.js.map +1 -0
  28. package/dist/{getSignedSessionId-BKKO2mqj.esm.js → getSignedSessionId-DczIbYxd.esm.js} +4 -17
  29. package/dist/getSignedSessionId-DczIbYxd.esm.js.map +1 -0
  30. package/dist/{getVerifiedCredentialForWalletAccount-Ck7DNGPJ.cjs.js → getVerifiedCredentialForWalletAccount-CTL5-19B.cjs.js} +2 -3
  31. package/dist/{getVerifiedCredentialForWalletAccount-Ck7DNGPJ.cjs.js.map → getVerifiedCredentialForWalletAccount-CTL5-19B.cjs.js.map} +1 -1
  32. package/dist/{getVerifiedCredentialForWalletAccount-DQ7g6O7y.esm.js → getVerifiedCredentialForWalletAccount-CpUomVzT.esm.js} +2 -2
  33. package/dist/{getVerifiedCredentialForWalletAccount-DQ7g6O7y.esm.js.map → getVerifiedCredentialForWalletAccount-CpUomVzT.esm.js.map} +1 -1
  34. package/dist/index.cjs.js +333 -87
  35. package/dist/index.cjs.js.map +1 -1
  36. package/dist/index.esm.js +315 -78
  37. package/dist/index.esm.js.map +1 -1
  38. package/dist/{isMfaRequiredForAction-BINs954q.cjs.js → isMfaRequiredForAction-DyrKyoVd.cjs.js} +2 -15
  39. package/dist/isMfaRequiredForAction-DyrKyoVd.cjs.js.map +1 -0
  40. package/dist/{isMfaRequiredForAction-MvVGc7k3.esm.js → isMfaRequiredForAction-Hi4dCidj.esm.js} +3 -10
  41. package/dist/isMfaRequiredForAction-Hi4dCidj.esm.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/attachCheckoutTransactionSource/attachCheckoutTransactionSource.d.ts +3 -1
  50. package/dist/modules/checkout/attachCheckoutTransactionSource/attachCheckoutTransactionSource.d.ts.map +1 -1
  51. package/dist/modules/checkout/createCheckoutTransaction/createCheckoutTransaction.d.ts +1 -1
  52. package/dist/modules/checkout/createCheckoutTransaction/createCheckoutTransaction.d.ts.map +1 -1
  53. package/dist/modules/checkout/getCheckoutTransactionQuote/getCheckoutTransactionQuote.d.ts +1 -2
  54. package/dist/modules/checkout/getCheckoutTransactionQuote/getCheckoutTransactionQuote.d.ts.map +1 -1
  55. package/dist/modules/checkout/getCheckouts/getCheckouts.d.ts +4 -0
  56. package/dist/modules/checkout/getCheckouts/getCheckouts.d.ts.map +1 -0
  57. package/dist/modules/checkout/getCheckouts/index.d.ts +2 -0
  58. package/dist/modules/checkout/getCheckouts/index.d.ts.map +1 -0
  59. package/dist/modules/checkout/submitCheckoutTransaction/index.d.ts +3 -0
  60. package/dist/modules/checkout/submitCheckoutTransaction/index.d.ts.map +1 -0
  61. package/dist/modules/checkout/submitCheckoutTransaction/submitCheckoutTransaction.d.ts +22 -0
  62. package/dist/modules/checkout/submitCheckoutTransaction/submitCheckoutTransaction.d.ts.map +1 -0
  63. package/dist/modules/deviceRegistration/getDeviceSigner/getDeviceSigner.d.ts.map +1 -1
  64. package/dist/modules/deviceRegistration/getDeviceSigner/{getOrCreateUserDeviceSigningKeys/getOrCreateUserDeviceSigningKeys.d.ts → getOrCreateEnvironmentDeviceSigningKeys/getOrCreateEnvironmentDeviceSigningKeys.d.ts} +2 -2
  65. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/getOrCreateEnvironmentDeviceSigningKeys.d.ts.map +1 -0
  66. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/index.d.ts +2 -0
  67. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/index.d.ts.map +1 -0
  68. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/getHeadersForNonceSignedByDeviceSigners.d.ts +3 -0
  69. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/getHeadersForNonceSignedByDeviceSigners.d.ts.map +1 -0
  70. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/index.d.ts +2 -0
  71. package/dist/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/index.d.ts.map +1 -0
  72. package/dist/modules/deviceRegistration/getRegisteredDevices/getRegisteredDevices.d.ts +3 -0
  73. package/dist/modules/deviceRegistration/getRegisteredDevices/getRegisteredDevices.d.ts.map +1 -0
  74. package/dist/modules/deviceRegistration/getRegisteredDevices/index.d.ts +2 -0
  75. package/dist/modules/deviceRegistration/getRegisteredDevices/index.d.ts.map +1 -0
  76. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/index.d.ts +2 -0
  77. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/index.d.ts.map +1 -0
  78. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/revokeAllRegisteredDevices.d.ts +2 -0
  79. package/dist/modules/deviceRegistration/revokeAllRegisteredDevices/revokeAllRegisteredDevices.d.ts.map +1 -0
  80. package/dist/modules/deviceRegistration/revokeRegisteredDevice/index.d.ts +2 -0
  81. package/dist/modules/deviceRegistration/revokeRegisteredDevice/index.d.ts.map +1 -0
  82. package/dist/modules/deviceRegistration/revokeRegisteredDevice/revokeRegisteredDevice.d.ts +6 -0
  83. package/dist/modules/deviceRegistration/revokeRegisteredDevice/revokeRegisteredDevice.d.ts.map +1 -0
  84. package/dist/modules/initializeClient/initializeClient.d.ts.map +1 -1
  85. package/dist/modules/storageSync/hydrateStateWithStorage/hydrateStateWithStorage.d.ts.map +1 -1
  86. package/dist/modules/storageSync/schema.d.ts +2 -0
  87. package/dist/modules/storageSync/schema.d.ts.map +1 -1
  88. package/dist/modules/storageSync/syncStateWithStorage/syncStateWithStorage.d.ts.map +1 -1
  89. package/dist/modules/waas/createWaasProvider/createWaasProvider.d.ts.map +1 -1
  90. package/dist/modules/waas/waas.types.d.ts +1 -0
  91. package/dist/modules/waas/waas.types.d.ts.map +1 -1
  92. package/dist/modules/wallets/connectAndVerifyWithWalletProvider/connectAndVerifyWithWalletProvider.d.ts +10 -0
  93. package/dist/modules/wallets/connectAndVerifyWithWalletProvider/connectAndVerifyWithWalletProvider.d.ts.map +1 -1
  94. package/dist/modules/wallets/transferAmount/index.d.ts +2 -0
  95. package/dist/modules/wallets/transferAmount/index.d.ts.map +1 -0
  96. package/dist/modules/wallets/transferAmount/transferAmount.d.ts +19 -0
  97. package/dist/modules/wallets/transferAmount/transferAmount.d.ts.map +1 -0
  98. package/dist/modules/wallets/walletProvider/index.d.ts +1 -1
  99. package/dist/modules/wallets/walletProvider/index.d.ts.map +1 -1
  100. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/index.d.ts +2 -0
  101. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/index.d.ts.map +1 -0
  102. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/isDeeplinkWalletProvider.d.ts +10 -0
  103. package/dist/modules/wallets/walletProvider/isDeeplinkWalletProvider/isDeeplinkWalletProvider.d.ts.map +1 -0
  104. package/dist/modules/wallets/walletProvider/walletProvider.types.d.ts +17 -0
  105. package/dist/modules/wallets/walletProvider/walletProvider.types.d.ts.map +1 -1
  106. package/dist/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.d.ts +11 -1
  107. package/dist/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.d.ts.map +1 -1
  108. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  109. package/dist/utils/getNonce/constants.d.ts +3 -0
  110. package/dist/utils/getNonce/constants.d.ts.map +1 -0
  111. package/dist/utils/getNonce/fetchAndStoreNonces/fetchAndStoreNonces.d.ts +13 -0
  112. package/dist/utils/getNonce/fetchAndStoreNonces/fetchAndStoreNonces.d.ts.map +1 -0
  113. package/dist/utils/getNonce/fetchAndStoreNonces/index.d.ts +2 -0
  114. package/dist/utils/getNonce/fetchAndStoreNonces/index.d.ts.map +1 -0
  115. package/dist/utils/getNonce/getNonce.d.ts +7 -0
  116. package/dist/utils/getNonce/getNonce.d.ts.map +1 -1
  117. package/dist/utils/getNonce/prefetchNoncesIfNeeded/prefetchNoncesIfNeeded.d.ts +3 -0
  118. package/dist/utils/getNonce/prefetchNoncesIfNeeded/prefetchNoncesIfNeeded.d.ts.map +1 -0
  119. package/dist/utils/getNonce/state.d.ts +15 -0
  120. package/dist/utils/getNonce/state.d.ts.map +1 -0
  121. package/dist/utils/parseAmountToSmallestUnit/index.d.ts +2 -0
  122. package/dist/utils/parseAmountToSmallestUnit/index.d.ts.map +1 -0
  123. package/dist/utils/parseAmountToSmallestUnit/parseAmountToSmallestUnit.d.ts +22 -0
  124. package/dist/utils/parseAmountToSmallestUnit/parseAmountToSmallestUnit.d.ts.map +1 -0
  125. package/dist/utils/parseUserAgent/index.d.ts +2 -0
  126. package/dist/utils/parseUserAgent/index.d.ts.map +1 -0
  127. package/dist/utils/parseUserAgent/parseUserAgent.d.ts +10 -0
  128. package/dist/utils/parseUserAgent/parseUserAgent.d.ts.map +1 -0
  129. package/dist/utils/randomString/randomString.d.ts +6 -1
  130. package/dist/utils/randomString/randomString.d.ts.map +1 -1
  131. package/dist/waas.cjs.js +3 -4
  132. package/dist/waas.cjs.js.map +1 -1
  133. package/dist/waas.esm.js +3 -3
  134. package/dist/waasCore.cjs.js +5 -5
  135. package/dist/waasCore.cjs.js.map +1 -1
  136. package/dist/waasCore.esm.js +5 -4
  137. package/dist/waasCore.esm.js.map +1 -1
  138. package/package.json +4 -3
  139. package/dist/InvalidParamError-DQn49mNB.esm.js.map +0 -1
  140. package/dist/InvalidParamError-DVzrk97b.cjs.js.map +0 -1
  141. package/dist/getNetworkProviderFromNetworkId-DMMnYrfG.esm.js.map +0 -1
  142. package/dist/getNetworkProviderFromNetworkId-z8WEapnj.cjs.js.map +0 -1
  143. package/dist/getSignedSessionId-BKKO2mqj.esm.js.map +0 -1
  144. package/dist/getSignedSessionId-BdGOv_TA.cjs.js.map +0 -1
  145. package/dist/isMfaRequiredForAction-BINs954q.cjs.js.map +0 -1
  146. package/dist/isMfaRequiredForAction-MvVGc7k3.esm.js.map +0 -1
  147. package/dist/modules/deviceRegistration/getDeviceSigner/getOrCreateUserDeviceSigningKeys/getOrCreateUserDeviceSigningKeys.d.ts.map +0 -1
@@ -1,14 +1,16 @@
1
- import { AuthStorageEnum, Configuration, SDKApi } from "@dynamic-labs/sdk-api-core";
1
+ import { AuthStorageEnum, Configuration, SDKApi, isDeviceNonceSignatureRequiredForUrl } from "@dynamic-labs/sdk-api-core";
2
2
  import { Buffer as Buffer$1 } from "buffer";
3
+ import * as z from "zod/mini";
3
4
 
4
5
  //#region package.json
5
6
  var name = "@dynamic-labs-sdk/client";
6
- var version = "0.14.0";
7
+ var version = "0.16.0";
7
8
  var dependencies = {
8
9
  "@dynamic-labs-sdk/assert-package-version": "workspace:*",
9
10
  "@dynamic-labs-wallet/browser-wallet-client": "0.0.286",
10
- "@dynamic-labs/sdk-api-core": "0.0.881",
11
+ "@dynamic-labs/sdk-api-core": "0.0.895",
11
12
  "@simplewebauthn/browser": "13.1.0",
13
+ "ably": "2.17.1",
12
14
  "buffer": "6.0.3",
13
15
  "eventemitter3": "5.0.1",
14
16
  "zod": "4.0.5"
@@ -112,6 +114,11 @@ const setDefaultClient = (client) => {
112
114
  numOfInitializedClients++;
113
115
  };
114
116
 
117
+ //#endregion
118
+ //#region src/utils/getNonce/constants.ts
119
+ const NONCE_POOL_EXPIRATION_TIME = 6e4 * 60 * 24;
120
+ const NONCE_POOL_SIZE = 5;
121
+
115
122
  //#endregion
116
123
  //#region src/modules/apiClient/constants.ts
117
124
  const DYNAMIC_API_VERSION_HEADER = "x-dyn-api-version";
@@ -124,10 +131,12 @@ const CLIENT_SDK_NAME = "ClientSDK";
124
131
 
125
132
  //#endregion
126
133
  //#region src/utils/randomString/randomString.ts
127
- const randomString = (length) => {
128
- const CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
134
+ const DEFAULT_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
135
+ const randomString = ({ chars = DEFAULT_CHARS, length }) => {
136
+ const bytes = new Uint8Array(length);
137
+ crypto.getRandomValues(bytes);
129
138
  let result = "";
130
- for (let i = length; i > 0; --i) result += CHARS[Math.floor(Math.random() * 64)];
139
+ for (let i = 0; i < length; i++) result += chars[bytes[i] % chars.length];
131
140
  return result;
132
141
  };
133
142
 
@@ -355,6 +364,226 @@ const createConvertToApiErrorMiddleware = ({ errorMappers = [] }) => ({ post: as
355
364
  return context.response;
356
365
  } });
357
366
 
367
+ //#endregion
368
+ //#region src/utils/getNonce/getNonce.ts
369
+ /**
370
+ * Returns a nonce for wallet ownership verification.
371
+ *
372
+ * Pops the first nonce from the prefetched pool. When the pool is running low
373
+ * (≤1 remaining after pop) a background refetch is triggered. If the pool is
374
+ * empty, nonces are fetched on-demand before returning.
375
+ */
376
+ const getNonce = async (client) => {
377
+ const core = getCore(client);
378
+ const pool = core.state.get().prefetchedNonces;
379
+ if (pool.length > 0) {
380
+ const [nonce, ...remaining] = pool;
381
+ core.state.set({ prefetchedNonces: remaining });
382
+ if (remaining.length <= 1) fetchAndStoreNonces(client);
383
+ return nonce;
384
+ }
385
+ await fetchAndStoreNonces(client);
386
+ return getNonce(client);
387
+ };
388
+
389
+ //#endregion
390
+ //#region src/utils/bufferToHex/bufferToHex.ts
391
+ /**
392
+ * Converts an ArrayBuffer or Uint8Array to a hex-encoded string
393
+ */
394
+ const bufferToHex = (buffer) => [...buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
395
+
396
+ //#endregion
397
+ //#region src/utils/p256Sign/p256Sign.ts
398
+ const p256Sign = async ({ privateKeyJwk, message }) => {
399
+ const privateKey = await crypto.subtle.importKey("jwk", privateKeyJwk, {
400
+ name: "ECDSA",
401
+ namedCurve: "P-256"
402
+ }, false, ["sign"]);
403
+ return bufferToHex(await crypto.subtle.sign({
404
+ hash: "SHA-256",
405
+ name: "ECDSA"
406
+ }, privateKey, new TextEncoder().encode(message)));
407
+ };
408
+
409
+ //#endregion
410
+ //#region src/services/storage/createStorageKeySchema/createStorageKeySchema.ts
411
+ const createStorageKeySchema = (params) => {
412
+ return params;
413
+ };
414
+
415
+ //#endregion
416
+ //#region src/utils/base64UrlDecode/base64UrlDecode.ts
417
+ /**
418
+ * Takes a base64url-encoded string (e.g. "nMueRPiAm51YXEjRtka8S_8Ura3HaqbmqDqMJCZmvkM")
419
+ * and return the corresponding bytes, as an array buffer.
420
+ */
421
+ const base64UrlDecode = (s) => {
422
+ s = s?.replace(/-/g, "+").replace(/_/g, "/") || "";
423
+ return Uint8Array.from(atob(s), (c) => c.charCodeAt(0));
424
+ };
425
+
426
+ //#endregion
427
+ //#region src/utils/compressRawPublicKey/compressRawPublicKey.ts
428
+ /**
429
+ * Accepts a public key array buffer, and returns a buffer with the compressed version of the public key
430
+ */
431
+ const compressRawPublicKey = (rawPublicKey) => {
432
+ const rawPublicKeyBytes = new Uint8Array(rawPublicKey);
433
+ const len = rawPublicKeyBytes.byteLength;
434
+ const compressedBytes = rawPublicKeyBytes.slice(0, 1 + len >>> 1);
435
+ compressedBytes[0] = 2 | rawPublicKeyBytes[len - 1] & 1;
436
+ return compressedBytes.buffer;
437
+ };
438
+
439
+ //#endregion
440
+ //#region src/utils/p256Keygen/p256Keygen.ts
441
+ const p256Keygen = async () => {
442
+ const p256Keypair = await crypto.subtle.generateKey({
443
+ name: "ECDSA",
444
+ namedCurve: "P-256"
445
+ }, true, ["sign", "verify"]);
446
+ const rawPublicKey = await crypto.subtle.exportKey("raw", p256Keypair.publicKey);
447
+ const privateKeyJwk = await crypto.subtle.exportKey("jwk", p256Keypair.privateKey);
448
+ const compressedPublicKeyBuffer = compressRawPublicKey(rawPublicKey);
449
+ return {
450
+ private: bufferToHex(base64UrlDecode(privateKeyJwk.d)),
451
+ privateJwk: privateKeyJwk,
452
+ public: bufferToHex(compressedPublicKeyBuffer)
453
+ };
454
+ };
455
+
456
+ //#endregion
457
+ //#region src/modules/deviceRegistration/getDeviceSigner/deviceSigningKeys.schema.ts
458
+ const deviceSigningKeysSchema = z.object({
459
+ privateJwk: z.custom(),
460
+ privateKey: z.string(),
461
+ publicKey: z.string()
462
+ });
463
+
464
+ //#endregion
465
+ //#region src/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/getOrCreateEnvironmentDeviceSigningKeys.ts
466
+ /**
467
+ * On web we want to auto create the device signing keys for each user.
468
+ * And the user device signing keys should never be deleted.
469
+ */
470
+ const getOrCreateEnvironmentDeviceSigningKeys = async (client) => {
471
+ const { storage, environmentId } = getCore(client);
472
+ assertDefined(environmentId, "Environment ID is required");
473
+ const environmentDeviceSigningKeysStorageKeySchema = createStorageKeySchema({
474
+ key: `user_device_signing_keys_${environmentId}`,
475
+ schema: deviceSigningKeysSchema
476
+ });
477
+ const deviceSigningKeys = await storage.getItem(environmentDeviceSigningKeysStorageKeySchema);
478
+ if (deviceSigningKeys) return deviceSigningKeys;
479
+ const { public: publicKey, private: privateKey, privateJwk } = await p256Keygen();
480
+ await storage.setItem(environmentDeviceSigningKeysStorageKeySchema, {
481
+ privateJwk,
482
+ privateKey,
483
+ publicKey
484
+ });
485
+ return {
486
+ privateJwk,
487
+ privateKey,
488
+ publicKey
489
+ };
490
+ };
491
+
492
+ //#endregion
493
+ //#region src/modules/deviceRegistration/getDeviceSigner/getDeviceSigner.ts
494
+ const getDeviceSigner = async (client) => {
495
+ const { deviceSigner } = getCore(client);
496
+ /**
497
+ * If the device signer is available, it should handle the device signing
498
+ * This is used for mobile devices with secure enclave.
499
+ */
500
+ if (deviceSigner) return deviceSigner;
501
+ /**
502
+ * For web devices we want to auto create one PK per user id.
503
+ */
504
+ const environmentDeviceSigningKeys = await getOrCreateEnvironmentDeviceSigningKeys(client);
505
+ return {
506
+ getPublicKey: async () => environmentDeviceSigningKeys.publicKey,
507
+ sign: (payload) => p256Sign({
508
+ message: payload,
509
+ privateKeyJwk: environmentDeviceSigningKeys.privateJwk
510
+ })
511
+ };
512
+ };
513
+
514
+ //#endregion
515
+ //#region src/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/getHeadersForNonceSignedByDeviceSigners.ts
516
+ const getHeadersForNonceSignedByDeviceSigners = async (client) => {
517
+ const { projectSettings } = client;
518
+ assertDefined(projectSettings, "Project settings not found");
519
+ /**
520
+ * For cookie based environments, the device registration is handled
521
+ * by settings the cookie in the browser.
522
+ * Then we dont need to provide the headers
523
+ */
524
+ if (isCookieEnabled(client)) return {};
525
+ const deviceSigner = await getDeviceSigner(client);
526
+ const nonce = await getNonce(client);
527
+ const signedNonce = await deviceSigner.sign(nonce);
528
+ const publicKey = await deviceSigner.getPublicKey();
529
+ return {
530
+ "x-dynamic-device-nonce": nonce,
531
+ "x-dynamic-device-publickey": publicKey,
532
+ "x-dynamic-device-signed-nonce": signedNonce
533
+ };
534
+ };
535
+
536
+ //#endregion
537
+ //#region src/modules/apiClient/utils/deviceSignatureHeadersMiddleware/createDeviceSignatureHeadersMiddleware.ts
538
+ const createDeviceSignatureHeadersMiddleware = (client) => {
539
+ return { pre: async (context) => {
540
+ /**
541
+ * The signed nonce is not required for cookie based environments.
542
+ */
543
+ if (isDeviceNonceSignatureRequiredForUrl(context.url) && !isCookieEnabled(client)) {
544
+ const deviceSignerHeaders = await getHeadersForNonceSignedByDeviceSigners(client);
545
+ return {
546
+ init: {
547
+ ...context.init,
548
+ headers: {
549
+ ...context.init.headers,
550
+ ...deviceSignerHeaders
551
+ }
552
+ },
553
+ url: context.url
554
+ };
555
+ }
556
+ } };
557
+ };
558
+
559
+ //#endregion
560
+ //#region src/errors/UnauthorizedError.ts
561
+ var UnauthorizedError = class extends BaseError {
562
+ constructor({ cause }) {
563
+ super({
564
+ cause,
565
+ code: "unauthorized_error",
566
+ docsUrl: null,
567
+ name: "UnauthorizedError",
568
+ shortMessage: "Unauthorized"
569
+ });
570
+ }
571
+ };
572
+
573
+ //#endregion
574
+ //#region src/modules/apiClient/utils/unauthorizedMiddleware/createUnauthorizedMiddleware.ts
575
+ const createUnauthorizedMiddleware = () => ({ post: async (context) => {
576
+ if (context.response.status === 401) {
577
+ let cause = null;
578
+ try {
579
+ const errorBody = await context.response.clone().json();
580
+ if (errorBody && "error" in errorBody && typeof errorBody.error === "string") cause = new Error(errorBody.error);
581
+ } catch {}
582
+ throw new UnauthorizedError({ cause });
583
+ }
584
+ return context.response;
585
+ } });
586
+
358
587
  //#endregion
359
588
  //#region src/modules/apiClient/createApiClient.ts
360
589
  /**
@@ -370,7 +599,7 @@ const createApiClient = (options = {}, client) => {
370
599
  headers: {
371
600
  "Content-Type": "application/json",
372
601
  [DYNAMIC_API_VERSION_HEADER]: `API/${DYNAMIC_SDK_API_VERSION}`,
373
- [DYNAMIC_REQUEST_ID_HEADER]: randomString(50),
602
+ [DYNAMIC_REQUEST_ID_HEADER]: randomString({ length: 50 }),
374
603
  [DYNAMIC_SDK_VERSION_HEADER]: `${CLIENT_SDK_NAME}/${version}`,
375
604
  ...core.getApiHeaders(),
376
605
  ...options.headers
@@ -385,10 +614,39 @@ const createApiClient = (options = {}, client) => {
385
614
  return new SDKApi(new Configuration({
386
615
  ...settings,
387
616
  fetchApi: core.fetch,
388
- middleware: [createConvertToApiErrorMiddleware({ errorMappers: [...options.errorMappers || [], clientErrorMapper] })]
617
+ middleware: [
618
+ createDeviceSignatureHeadersMiddleware(client),
619
+ createConvertToApiErrorMiddleware({ errorMappers: [...options.errorMappers || [], clientErrorMapper] }),
620
+ createUnauthorizedMiddleware()
621
+ ]
389
622
  }));
390
623
  };
391
624
 
625
+ //#endregion
626
+ //#region src/utils/getNonce/fetchAndStoreNonces/fetchAndStoreNonces.ts
627
+ /**
628
+ * Fetches a batch of nonces from the API.
629
+ *
630
+ * Prefetching is critical for iOS deep link wallet providers (e.g. Phantom
631
+ * redirect). On iOS, a network request (like fetching a nonce) between a user
632
+ * action and a deeplink call will break the gesture chain, causing iOS to
633
+ * silently ignore the deeplink. By prefetching nonces ahead of time,
634
+ * `getNonce` can return synchronously from cache and the deeplink fires
635
+ * without an interrupting network round-trip.
636
+ */
637
+ const fetchAndStoreNonces = async (client) => {
638
+ const core = getCore(client);
639
+ const { environmentId } = core;
640
+ const { nonces } = await createApiClient({}, client).getNonces({
641
+ count: NONCE_POOL_SIZE,
642
+ environmentId
643
+ });
644
+ core.state.set({
645
+ prefetchedNonces: nonces,
646
+ prefetchedNoncesExpiration: Date.now() + NONCE_POOL_EXPIRATION_TIME
647
+ });
648
+ };
649
+
392
650
  //#endregion
393
651
  //#region src/modules/wallets/constants.ts
394
652
  const CHAINS_INFO_MAP = {
@@ -508,5 +766,5 @@ var InvalidParamError = class extends BaseError {
508
766
  };
509
767
 
510
768
  //#endregion
511
- export { version as A, DYNAMIC_SDK_API_VERSION as C, BaseError as D, ClientNotFoundError as E, getCore as O, CLIENT_SDK_NAME as S, setDefaultClient as T, getBuffer as _, DYNAMIC_ICONIC_SPRITE_URL as a, ValueMustBeDefinedError as b, CHAINS_INFO_MAP as c, MfaRateLimitedError as d, MfaInvalidOtpError as f, getSessionKeys as g, APIError as h, DYNAMIC_WAAS_METADATA as i, name as k, createApiClient as l, InvalidExternalAuthError as m, DEFAULT_WAAS_BASE_API_URL as n, SDK_API_CORE_VERSION as o, LinkCredentialError as p, DEFAULT_WAAS_BASE_MPC_RELAY_API_URL as r, getChainFromVerifiedCredentialChain as s, InvalidParamError as t, SandboxMaximumThresholdReachedError as u, isCookieEnabled as v, getDefaultClient as w, randomString as x, assertDefined as y };
512
- //# sourceMappingURL=InvalidParamError-DQn49mNB.esm.js.map
769
+ export { randomString as A, version as B, InvalidExternalAuthError as C, isCookieEnabled as D, getBuffer as E, setDefaultClient as F, ClientNotFoundError as I, BaseError as L, DYNAMIC_SDK_API_VERSION as M, NONCE_POOL_SIZE as N, assertDefined as O, getDefaultClient as P, getCore as R, LinkCredentialError as S, getSessionKeys as T, p256Sign as _, DYNAMIC_ICONIC_SPRITE_URL as a, MfaRateLimitedError as b, CHAINS_INFO_MAP as c, UnauthorizedError as d, createDeviceSignatureHeadersMiddleware as f, createStorageKeySchema as g, p256Keygen as h, DYNAMIC_WAAS_METADATA as i, CLIENT_SDK_NAME as j, ValueMustBeDefinedError as k, fetchAndStoreNonces as l, getDeviceSigner as m, DEFAULT_WAAS_BASE_API_URL as n, SDK_API_CORE_VERSION as o, getHeadersForNonceSignedByDeviceSigners as p, DEFAULT_WAAS_BASE_MPC_RELAY_API_URL as r, getChainFromVerifiedCredentialChain as s, InvalidParamError as t, createApiClient as u, getNonce as v, APIError as w, MfaInvalidOtpError as x, SandboxMaximumThresholdReachedError as y, name as z };
770
+ //# sourceMappingURL=InvalidParamError-Cty-xWsw.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvalidParamError-Cty-xWsw.esm.js","names":["defaultClient: DynamicClient | null","BufferPolyfill","clientErrorMapper: ErrorMapper","errorToThrow: Error","cause: Error | null","settings: ISettings","CHAINS_INFO_MAP: Record<Chain, ChainInfo>","chain"],"sources":["../package.json","../src/client/core/getCore/getCore.ts","../src/errors/base/BaseError.ts","../src/errors/ClientNotFoundError.ts","../src/client/defaultClient/defaultClient.ts","../src/utils/getNonce/constants.ts","../src/modules/apiClient/constants.ts","../src/utils/randomString/randomString.ts","../src/errors/ValueMustBeDefinedError.ts","../src/utils/assertDefined/assertDefined.ts","../src/modules/projectSettings/isCookieEnabled/isCookieEnabled.ts","../src/utils/getBuffer/getBuffer.ts","../src/modules/sessionKeys/getSessionKeys/getSessionKeys.ts","../src/errors/APIError/APIError.ts","../src/errors/InvalidExternalAuthError.ts","../src/errors/LinkCredentialError.ts","../src/errors/MfaInvalidOtpError.ts","../src/errors/MfaRateLimitedError.ts","../src/errors/SandboxMaximumThresholdReachedError.ts","../src/modules/apiClient/utils/clientErrorMapper/clientErrorMapper.ts","../src/modules/apiClient/utils/convertToApiErrorMiddleware/convertToApiErrorMiddleware.ts","../src/utils/getNonce/getNonce.ts","../src/utils/bufferToHex/bufferToHex.ts","../src/utils/p256Sign/p256Sign.ts","../src/services/storage/createStorageKeySchema/createStorageKeySchema.ts","../src/utils/base64UrlDecode/base64UrlDecode.ts","../src/utils/compressRawPublicKey/compressRawPublicKey.ts","../src/utils/p256Keygen/p256Keygen.ts","../src/modules/deviceRegistration/getDeviceSigner/deviceSigningKeys.schema.ts","../src/modules/deviceRegistration/getDeviceSigner/getOrCreateEnvironmentDeviceSigningKeys/getOrCreateEnvironmentDeviceSigningKeys.ts","../src/modules/deviceRegistration/getDeviceSigner/getDeviceSigner.ts","../src/modules/deviceRegistration/getHeadersForNonceSignedByDeviceSigners/getHeadersForNonceSignedByDeviceSigners.ts","../src/modules/apiClient/utils/deviceSignatureHeadersMiddleware/createDeviceSignatureHeadersMiddleware.ts","../src/errors/UnauthorizedError.ts","../src/modules/apiClient/utils/unauthorizedMiddleware/createUnauthorizedMiddleware.ts","../src/modules/apiClient/createApiClient.ts","../src/utils/getNonce/fetchAndStoreNonces/fetchAndStoreNonces.ts","../src/modules/wallets/constants.ts","../src/utils/getChainFromVerifiedCredentialChain/getChainFromVerifiedCredentialChain.ts","../src/constants.ts","../src/modules/waas/constants.ts","../src/errors/InvalidParamError.ts"],"sourcesContent":["","import type { DynamicClient } from '../../types';\nimport type { DynamicCore } from '../types';\n\nexport const getCore = (client: DynamicClient): DynamicCore => {\n // @ts-expect-error - this was hidden from the public API\n return client.__core;\n};\n","import { version } from '../../../package.json';\n\nexport type BaseErrorParameters = {\n /** The underlying error that caused this error, if any */\n cause: Error | null;\n /** The error unique code */\n code: string;\n /** Additional detailed information about the error */\n details?: string;\n /** URL to relevant documentation for this error */\n docsUrl: string | null;\n /** Array of additional contextual messages to be displayed */\n metaMessages?: string[];\n /** Custom name for the error. Defaults to 'BaseError' if not provided */\n name: string;\n /** A brief, human-readable description of the error */\n shortMessage: string;\n};\n\nconst getDetails = ({ details, cause }: BaseErrorParameters) => {\n if (cause instanceof BaseError) {\n return cause.details;\n }\n\n if (cause?.message) {\n return cause.message;\n }\n\n return details;\n};\n\n/**\n * Formats the error message with all available information\n */\nconst formatMessage = ({\n shortMessage,\n details,\n docsUrl,\n metaMessages,\n}: BaseErrorParameters) => {\n return [\n '[Dynamic JS SDK]',\n shortMessage,\n '',\n ...(metaMessages ? [...metaMessages, ''] : []),\n ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n `Version: ${version}`,\n `Timestamp: ${new Date().toISOString()}`,\n ].join('\\n');\n};\n\n/**\n * Base error class that provides structured error handling with detailed information\n */\nexport abstract class BaseError extends Error {\n /** The error unique code */\n code: string;\n details: string | undefined;\n private readonly formattedMessage: string | undefined;\n override name = 'BaseError';\n override cause: BaseError | Error | undefined;\n\n constructor(args: BaseErrorParameters) {\n const details = getDetails(args);\n const formattedMessage = formatMessage({ ...args, details });\n super(\n args.shortMessage ?? formattedMessage,\n args.cause ? { cause: args.cause } : undefined\n );\n\n this.formattedMessage = formattedMessage;\n this.details = details;\n this.name = args.name ?? this.name;\n this.cause = args.cause ?? this.cause;\n this.code = args.code;\n }\n\n /**\n * Walks the cause chain of the error and returns the root error\n */\n walk(): Error | undefined {\n const cause = this.cause;\n\n if (cause instanceof BaseError) {\n return cause.walk();\n }\n\n return cause;\n }\n\n override toString() {\n return this.formattedMessage;\n }\n}\n","import { BaseError } from './base';\n\nexport class ClientNotFoundError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'client_not_found_error',\n docsUrl: null,\n name: 'ClientNotFoundError',\n shortMessage:\n 'No Dynamic client has been created yet. Make sure you have called createDynamicClient() first.',\n });\n }\n}\n","import { ClientNotFoundError } from '../../errors/ClientNotFoundError';\nimport { getCore } from '../core/getCore';\nimport type { DynamicClient } from '../types';\n\nlet defaultClient: DynamicClient | null = null;\nlet numOfInitializedClients = 0;\n\n/**\n * Returns the DynamicClient instance that was initialized with createDynamicClient.\n *\n * If more than one instance of DynamicClient was initialized, you should not use this function.\n * Instead, you should pass the client instance you stored to the function that needs it.\n */\nexport const getDefaultClient = (): DynamicClient => {\n if (!defaultClient) {\n throw new ClientNotFoundError();\n }\n\n if (numOfInitializedClients > 1) {\n const core = getCore(defaultClient);\n core.logger.debug(\n 'Multiple instances of DynamicClient found. If you are only using one client (recommended), make sure you are not calling ' +\n '\"createDynamicClient\" multiple times. If you are using multiple clients, make sure you are passing which client to use as ' +\n 'the last param of all Dynamic functions.'\n );\n }\n\n return defaultClient;\n};\n\nexport const setDefaultClient = (client: DynamicClient) => {\n defaultClient = client;\n numOfInitializedClients++;\n};\n","export const NONCE_POOL_EXPIRATION_TIME = 60000 * 60 * 24;\n\nexport const NONCE_POOL_SIZE = 5;\n","import { dependencies } from '../../../package.json';\n\nexport const DYNAMIC_API_VERSION_HEADER = 'x-dyn-api-version';\n\nexport const DYNAMIC_REQUEST_ID_HEADER = 'x-dyn-request-id';\n\nexport const DYNAMIC_SDK_VERSION_HEADER = 'x-dyn-version';\n\nexport const MFA_TOKEN_HEADER = 'x-mfa-auth-token';\n\nexport const SESSION_PUBLIC_KEY_HEADER = 'x-dyn-session-public-key';\n\nexport const DYNAMIC_SDK_API_VERSION =\n dependencies['@dynamic-labs/sdk-api-core'];\n\nexport const CLIENT_SDK_NAME = 'ClientSDK';\n","const DEFAULT_CHARS =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\ntype RandomStringParams = {\n chars?: string;\n length: number;\n};\n\nexport const randomString = ({ chars = DEFAULT_CHARS, length }: RandomStringParams) => {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars[bytes[i] % chars.length];\n }\n return result;\n};\n","import { BaseError } from './base';\n\nexport class ValueMustBeDefinedError extends BaseError {\n constructor(message: string) {\n super({\n cause: null,\n code: 'value_must_be_defined_error',\n docsUrl: null,\n name: 'ValueMustBeDefined',\n shortMessage: message,\n });\n }\n}\n","/* eslint-disable func-style -- javascript requires this to be a function */\n\nimport { ValueMustBeDefinedError } from './../../errors/ValueMustBeDefinedError';\n\n/**\n * Asserts that a value is not null or undefined, throwing an error if it is.\n * This function acts as a type guard, narrowing the type to exclude null and undefined.\n *\n * @template T - The type of the value being checked\n * @param value - The value to check for null or undefined\n * @param message - The error message to throw if the value is null or undefined\n * @throws Throws an error with the provided message if value is null or undefined\n * @example\n * ```typescript\n * const maybeString: string | null = getValue();\n * assertDefined(maybeString, 'String value is required');\n * // maybeString is now typed as string (null is excluded)\n * ```\n */\nexport function assertDefined<T>(\n value: T,\n message: string\n): asserts value is Exclude<NonNullable<T>, void> {\n if (value === null || value === undefined) {\n throw new ValueMustBeDefinedError(message);\n }\n}\n","import { AuthStorageEnum } from '@dynamic-labs/sdk-api-core';\n\nimport type { DynamicClient } from '../../../client/types';\nimport { assertDefined } from '../../../utils/assertDefined';\n\n/**\n * Returns true if the client is using Dynamic cookies or a BYO JWT cookie.\n */\nexport const isCookieEnabled = (client: DynamicClient): boolean => {\n assertDefined(client.projectSettings, 'Project settings are not defined');\n\n const securitySettings = client.projectSettings.security;\n\n if (!securitySettings) return false;\n\n // client uses Dynamic cookies\n const dynamicCookiesEnabled = (securitySettings.auth?.storage || []).includes(\n AuthStorageEnum.Cookie\n );\n\n // BYO JWT client puts their non-Dynamic JWT in a cookie\n const byoJwtCookieEnabled = Boolean(\n securitySettings.externalAuth?.cookieName\n );\n\n // should return true for both of these scenarios\n // because we also need to do `credentials: true` in api.ts when\n // a byo jwt client sets their named cookie for their jwt and\n // needs to send it to our backend\n return dynamicCookiesEnabled || byoJwtCookieEnabled;\n};\n","/* eslint-disable no-restricted-globals */\nimport { Buffer as BufferPolyfill } from 'buffer';\n\nexport const getBuffer = () =>\n typeof Buffer !== 'undefined' ? Buffer : BufferPolyfill;\n","import { getCore } from '../../../client/core/getCore';\nimport type { DynamicClient } from '../../../client/types';\nimport { getBuffer } from '../../../utils/getBuffer';\nimport type { SessionKeys } from '../sessionKeys.types';\n\nexport const getSessionKeys = (client: DynamicClient) => {\n const core = getCore(client);\n\n const encodedKeys = core.state.get().sessionKeys;\n\n if (!encodedKeys) {\n return undefined;\n }\n\n try {\n const decodedKeys: SessionKeys = JSON.parse(\n getBuffer().from(encodedKeys, 'base64').toString()\n );\n\n return decodedKeys;\n } catch (error) {\n core.logger.error('Error decoding session keys', error);\n return undefined;\n }\n};\n","import { BaseError } from '../base';\n\nexport class APIError extends BaseError {\n status: number;\n\n constructor(message: string, code: string, status: number) {\n super({\n cause: null,\n code,\n docsUrl: null,\n name: 'APIError',\n shortMessage: message,\n });\n\n this.status = status;\n }\n\n static async fromResponse(response: Response) {\n try {\n const errorBody = await response.clone().json();\n\n if (\n errorBody &&\n 'error' in errorBody &&\n typeof errorBody.error === 'string'\n ) {\n const errorCode =\n 'code' in errorBody && typeof errorBody.code === 'string'\n ? errorBody.code\n : 'unknown_error';\n\n return new APIError(errorBody.error, errorCode, response.status);\n }\n\n return null;\n } catch {\n return null;\n }\n }\n}\n","import { BaseError, type BaseErrorParameters } from './base';\n\nexport class InvalidExternalAuthError extends BaseError {\n constructor({ cause }: Pick<BaseErrorParameters, 'cause'>) {\n super({\n cause,\n code: 'invalid_external_auth_error',\n docsUrl:\n 'https://www.dynamic.xyz/docs/external-auth/third-party-auth-overview',\n name: 'InvalidExternalAuthError',\n shortMessage: 'Error authenticating with external JWT',\n });\n }\n}\n","import { BaseError, type BaseErrorParameters } from './base';\n\nexport class LinkCredentialError extends BaseError {\n constructor({ cause }: Pick<BaseErrorParameters, 'cause'>) {\n super({\n cause,\n code: 'link_credential_error',\n docsUrl: null,\n name: 'LinkCredentialError',\n shortMessage:\n 'The credential you are trying to link is associated with another account and cannot be reassigned.',\n });\n }\n}\n","import { BaseError, type BaseErrorParameters } from './base';\n\nexport class MfaInvalidOtpError extends BaseError {\n constructor({ cause }: Pick<BaseErrorParameters, 'cause'>) {\n super({\n cause,\n code: 'mfa_invalid_otp_error',\n docsUrl: null,\n name: 'MfaInvalidOtpError',\n shortMessage: 'Invalid OTP',\n });\n }\n}\n","import { BaseError, type BaseErrorParameters } from './base';\n\nexport class MfaRateLimitedError extends BaseError {\n constructor({ cause }: Pick<BaseErrorParameters, 'cause'>) {\n super({\n cause,\n code: 'mfa_rate_limited_error',\n docsUrl: null,\n name: 'MfaRateLimitedError',\n shortMessage: 'Rate limited',\n });\n }\n}\n","import { BaseError, type BaseErrorParameters } from './base';\n\nexport class SandboxMaximumThresholdReachedError extends BaseError {\n constructor({ cause }: Pick<BaseErrorParameters, 'cause'>) {\n super({\n cause,\n code: 'sandbox_maximum_threshold_reached_error',\n docsUrl:\n 'https://www.dynamic.xyz/docs/developer-dashboard/sandbox-vs-live#sandbox-vs-live',\n name: 'SandboxMaximumThresholdReachedError',\n shortMessage:\n 'Your sandbox environment has reached the maximum MAU. Please use a live environment for production traffic.',\n });\n }\n}\n","import { APIError } from '../../../../errors/APIError';\nimport { InvalidExternalAuthError } from '../../../../errors/InvalidExternalAuthError';\nimport { LinkCredentialError } from '../../../../errors/LinkCredentialError';\nimport { MfaInvalidOtpError } from '../../../../errors/MfaInvalidOtpError';\nimport { MfaRateLimitedError } from '../../../../errors/MfaRateLimitedError';\nimport { SandboxMaximumThresholdReachedError } from '../../../../errors/SandboxMaximumThresholdReachedError';\nimport type { ErrorMapper } from '../../apiClient.types';\n\n/**\n * Default error mapper for the client that handles common API error codes.\n *\n * This mapper transforms specific API error codes into more specific error types:\n * - `mfa_invalid_code` → `MfaInvalidOtpError`\n * - `mfa_rate_limited` → `MfaRateLimitedError`\n *\n * @param error - The error to be mapped\n * @returns A transformed error if the error code matches a known pattern, or null if no transformation is needed\n *\n * @example\n * ```typescript\n * // This will be automatically applied to all API errors\n * const apiClient = createApiClient({}, client);\n *\n * // The clientErrorMapper will automatically convert mfa_invalid_code errors\n * // to MfaInvalidOtpError instances\n * ```\n */\nexport const clientErrorMapper: ErrorMapper = (error) => {\n if (error instanceof APIError) {\n if (error.code === 'mfa_invalid_code') {\n return new MfaInvalidOtpError({ cause: error });\n }\n\n if (error.code === 'mfa_rate_limited') {\n return new MfaRateLimitedError({ cause: error });\n }\n\n if (error.code === 'invalid_external_auth') {\n return new InvalidExternalAuthError({ cause: error });\n }\n\n if (error.code === 'sandbox_maximum_threshold_reached') {\n return new SandboxMaximumThresholdReachedError({ cause: error });\n }\n\n if (\n error.code === 'merge_accounts_invalid' ||\n error.code === 'reassign_wallet_error'\n ) {\n return new LinkCredentialError({ cause: error });\n }\n }\n\n return null;\n};\n","import type { Middleware, ResponseContext } from '@dynamic-labs/sdk-api-core';\n\nimport { APIError } from '../../../../errors/APIError';\nimport type { ErrorMapper } from '../../apiClient.types';\n\ntype CreateConvertToApiErrorMiddlewareOptions = {\n errorMappers?: ErrorMapper[];\n};\n\n/**\n * Creates middleware that converts HTTP error responses to APIError instances\n * and optionally applies custom error mappers to transform them into specific error types.\n *\n * @param options.errorMappers - Array of error mappers to apply to API errors\n * @returns A middleware function that handles error conversion and mapping\n */\nexport const createConvertToApiErrorMiddleware = ({\n errorMappers = [],\n}: CreateConvertToApiErrorMiddlewareOptions): Middleware => ({\n post: async (context: ResponseContext) => {\n if (context.response.status >= 400) {\n const apiError = await APIError.fromResponse(context.response);\n\n if (apiError) {\n let errorToThrow: Error = apiError;\n\n for (const mapper of errorMappers) {\n const newError = mapper(apiError);\n\n if (newError) {\n errorToThrow = newError;\n break;\n }\n }\n\n throw errorToThrow;\n }\n }\n\n return context.response;\n },\n});\n","import { getCore } from '../../client/core/getCore';\nimport type { DynamicClient } from '../../client/types';\nimport { fetchAndStoreNonces } from './fetchAndStoreNonces/fetchAndStoreNonces';\n\n/**\n * Returns a nonce for wallet ownership verification.\n *\n * Pops the first nonce from the prefetched pool. When the pool is running low\n * (≤1 remaining after pop) a background refetch is triggered. If the pool is\n * empty, nonces are fetched on-demand before returning.\n */\nexport const getNonce = async (\n client: DynamicClient\n): Promise<string> => {\n const core = getCore(client);\n const pool = core.state.get().prefetchedNonces;\n\n if (pool.length > 0) {\n const [nonce, ...remaining] = pool;\n\n core.state.set({ prefetchedNonces: remaining });\n\n if (remaining.length <= 1) {\n void fetchAndStoreNonces(client);\n }\n\n return nonce;\n }\n\n await fetchAndStoreNonces(client);\n\n return getNonce(client);\n};\n","/**\n * Converts an ArrayBuffer or Uint8Array to a hex-encoded string\n */\nexport const bufferToHex = (buffer: ArrayBufferLike | Uint8Array) =>\n [...(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer))]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n","import { bufferToHex } from '../bufferToHex';\n\ntype P256SignParams = {\n message: string;\n privateKeyJwk: JsonWebKey;\n};\n\nexport const p256Sign = async ({ privateKeyJwk, message }: P256SignParams) => {\n const privateKey = await crypto.subtle.importKey(\n 'jwk',\n privateKeyJwk,\n {\n name: 'ECDSA',\n namedCurve: 'P-256',\n },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign(\n {\n hash: 'SHA-256',\n name: 'ECDSA',\n },\n privateKey,\n new TextEncoder().encode(message)\n );\n\n return bufferToHex(signature);\n};\n","import type * as z from 'zod/mini';\n\nimport type { StorageKeySchema } from '../storage.types';\n\nexport const createStorageKeySchema = <T>(params: {\n key: string;\n schema: z.ZodMiniType<T>;\n}): StorageKeySchema<T> => {\n return params;\n};\n","/**\n * Takes a base64url-encoded string (e.g. \"nMueRPiAm51YXEjRtka8S_8Ura3HaqbmqDqMJCZmvkM\")\n * and return the corresponding bytes, as an array buffer.\n */\nexport const base64UrlDecode = (s?: string) => {\n // Go from base64url encoding to base64 encoding\n s = s?.replace(/-/g, '+').replace(/_/g, '/') || '';\n // use `atob` to decode base64\n return Uint8Array.from(atob(s), (c) => c.charCodeAt(0));\n};\n","/**\n * Accepts a public key array buffer, and returns a buffer with the compressed version of the public key\n */\nexport const compressRawPublicKey = (rawPublicKey: ArrayBuffer) => {\n const rawPublicKeyBytes = new Uint8Array(rawPublicKey);\n const len = rawPublicKeyBytes.byteLength;\n\n // Drop the y coordinate\n const compressedBytes = rawPublicKeyBytes.slice(0, (1 + len) >>> 1);\n\n // Encode the parity of `y` in first bit\n compressedBytes[0] = 0x2 | (rawPublicKeyBytes[len - 1] & 0x01);\n return compressedBytes.buffer;\n};\n","import { base64UrlDecode } from '../base64UrlDecode';\nimport { bufferToHex } from '../bufferToHex';\nimport { compressRawPublicKey } from '../compressRawPublicKey';\n\nexport const p256Keygen = async () => {\n // Create a new P-256 keypair\n const p256Keypair = await crypto.subtle.generateKey(\n {\n name: 'ECDSA',\n namedCurve: 'P-256',\n },\n true,\n ['sign', 'verify']\n );\n\n // Export the raw public key. By default this will export in uncompressed format\n const rawPublicKey = await crypto.subtle.exportKey(\n 'raw',\n p256Keypair.publicKey\n );\n\n // We need to export with JWK format because exporting EC private keys with \"raw\" isn't supported\n const privateKeyJwk = await crypto.subtle.exportKey(\n 'jwk',\n p256Keypair.privateKey\n );\n\n const compressedPublicKeyBuffer = compressRawPublicKey(rawPublicKey);\n\n const privateKeyBuffer = base64UrlDecode(privateKeyJwk.d);\n\n return {\n private: bufferToHex(privateKeyBuffer),\n privateJwk: privateKeyJwk,\n public: bufferToHex(compressedPublicKeyBuffer),\n };\n};\n","import * as z from 'zod/mini';\n\nexport const deviceSigningKeysSchema = z.object({\n privateJwk: z.custom<JsonWebKey>(),\n privateKey: z.string(),\n publicKey: z.string(),\n});\n","import type * as z from 'zod/mini';\n\nimport { getCore } from '../../../../client/core/getCore';\nimport type { DynamicClient } from '../../../../client/types';\nimport { createStorageKeySchema } from '../../../../services/storage';\nimport { assertDefined } from '../../../../utils/assertDefined';\nimport { p256Keygen } from '../../../../utils/p256Keygen';\nimport { deviceSigningKeysSchema } from '../deviceSigningKeys.schema';\n\n/**\n * On web we want to auto create the device signing keys for each user.\n * And the user device signing keys should never be deleted.\n */\nexport const getOrCreateEnvironmentDeviceSigningKeys = async (\n client: DynamicClient\n): Promise<z.infer<typeof deviceSigningKeysSchema>> => {\n const { storage, environmentId } = getCore(client);\n\n assertDefined(environmentId, 'Environment ID is required');\n\n const environmentDeviceSigningKeysStorageKeySchema = createStorageKeySchema({\n key: `user_device_signing_keys_${environmentId}`,\n schema: deviceSigningKeysSchema,\n });\n\n const deviceSigningKeys = await storage.getItem(\n environmentDeviceSigningKeysStorageKeySchema\n );\n\n if (deviceSigningKeys) {\n return deviceSigningKeys;\n }\n\n const {\n public: publicKey,\n private: privateKey,\n privateJwk,\n } = await p256Keygen();\n\n await storage.setItem(environmentDeviceSigningKeysStorageKeySchema, {\n privateJwk,\n privateKey,\n publicKey,\n });\n\n return {\n privateJwk,\n privateKey,\n publicKey,\n };\n};\n","import { getCore } from '../../../client/core/getCore';\nimport type { DynamicClient } from '../../../client/types';\nimport type { DeviceSigner } from '../../../services/deviceSigner';\nimport { p256Sign } from '../../../utils/p256Sign';\nimport { getOrCreateEnvironmentDeviceSigningKeys } from './getOrCreateEnvironmentDeviceSigningKeys';\n\nexport const getDeviceSigner = async (\n client: DynamicClient\n): Promise<DeviceSigner> => {\n const { deviceSigner } = getCore(client);\n\n /**\n * If the device signer is available, it should handle the device signing\n * This is used for mobile devices with secure enclave.\n */\n if (deviceSigner) {\n return deviceSigner;\n }\n\n /**\n * For web devices we want to auto create one PK per user id.\n */\n const environmentDeviceSigningKeys =\n await getOrCreateEnvironmentDeviceSigningKeys(client);\n\n return {\n getPublicKey: async () => environmentDeviceSigningKeys.publicKey,\n sign: (payload: string) =>\n p256Sign({\n message: payload,\n privateKeyJwk: environmentDeviceSigningKeys.privateJwk,\n }),\n };\n};\n","import type { DynamicClient } from '../../../client/types';\nimport { assertDefined } from '../../../utils/assertDefined';\nimport { getNonce } from '../../../utils/getNonce';\nimport { isCookieEnabled } from '../../projectSettings/isCookieEnabled';\nimport { getDeviceSigner } from '../getDeviceSigner';\n\nexport const getHeadersForNonceSignedByDeviceSigners = async (\n client: DynamicClient\n): Promise<Record<string, string>> => {\n const { projectSettings } = client;\n\n assertDefined(projectSettings, 'Project settings not found');\n\n /**\n * For cookie based environments, the device registration is handled\n * by settings the cookie in the browser.\n * Then we dont need to provide the headers\n */\n if (isCookieEnabled(client)) {\n return {};\n }\n\n const deviceSigner = await getDeviceSigner(client);\n\n const nonce = await getNonce(client);\n\n const signedNonce = await deviceSigner.sign(nonce);\n const publicKey = await deviceSigner.getPublicKey();\n\n return {\n 'x-dynamic-device-nonce': nonce,\n 'x-dynamic-device-publickey': publicKey,\n 'x-dynamic-device-signed-nonce': signedNonce,\n };\n};\n","import type { Middleware } from '@dynamic-labs/sdk-api-core';\nimport { isDeviceNonceSignatureRequiredForUrl } from '@dynamic-labs/sdk-api-core';\n\nimport type { DynamicClient } from '../../../../client/types';\nimport { getHeadersForNonceSignedByDeviceSigners } from '../../../deviceRegistration/getHeadersForNonceSignedByDeviceSigners';\nimport { isCookieEnabled } from '../../../projectSettings/isCookieEnabled';\n\nexport const createDeviceSignatureHeadersMiddleware = (\n client: DynamicClient\n): Middleware => {\n return {\n pre: async (context) => {\n /**\n * The signed nonce is not required for cookie based environments.\n */\n if (\n isDeviceNonceSignatureRequiredForUrl(context.url) &&\n !isCookieEnabled(client)\n ) {\n const deviceSignerHeaders = await getHeadersForNonceSignedByDeviceSigners(\n client\n );\n\n return {\n init: {\n ...context.init,\n headers: {\n ...context.init.headers,\n ...deviceSignerHeaders,\n },\n },\n url: context.url,\n };\n }\n\n return;\n },\n };\n};\n","import { BaseError, type BaseErrorParameters } from './base';\n\nexport class UnauthorizedError extends BaseError {\n constructor({ cause }: Pick<BaseErrorParameters, 'cause'>) {\n super({\n cause,\n code: 'unauthorized_error',\n docsUrl: null,\n name: 'UnauthorizedError',\n shortMessage: 'Unauthorized',\n });\n }\n}\n","import type { Middleware, ResponseContext } from '@dynamic-labs/sdk-api-core';\n\nimport { UnauthorizedError } from '../../../../errors/UnauthorizedError';\n\nexport const createUnauthorizedMiddleware = (): Middleware => ({\n post: async (context: ResponseContext) => {\n if (context.response.status === 401) {\n let cause: Error | null = null;\n\n try {\n const errorBody = await context.response.clone().json();\n\n if (\n errorBody &&\n 'error' in errorBody &&\n typeof errorBody.error === 'string'\n ) {\n // eslint-disable-next-line no-restricted-syntax\n cause = new Error(errorBody.error);\n }\n } catch {\n // Response body isn't valid JSON — proceed without a cause\n }\n\n throw new UnauthorizedError({ cause });\n }\n\n return context.response;\n },\n});\n","import { Configuration, SDKApi } from '@dynamic-labs/sdk-api-core';\n\nimport { version } from '../../../package.json';\nimport { getCore } from '../../client/core/getCore';\nimport type { DynamicClient } from '../../client/types';\nimport { randomString } from '../../utils/randomString';\nimport { isCookieEnabled } from '../projectSettings/isCookieEnabled';\nimport { getSessionKeys } from '../sessionKeys/getSessionKeys';\nimport type { CreateApiClientOptions } from './apiClient.types';\nimport {\n CLIENT_SDK_NAME,\n DYNAMIC_API_VERSION_HEADER,\n DYNAMIC_REQUEST_ID_HEADER,\n DYNAMIC_SDK_API_VERSION,\n DYNAMIC_SDK_VERSION_HEADER,\n MFA_TOKEN_HEADER,\n SESSION_PUBLIC_KEY_HEADER,\n} from './constants';\nimport { clientErrorMapper } from './utils/clientErrorMapper';\nimport { createConvertToApiErrorMiddleware } from './utils/convertToApiErrorMiddleware/convertToApiErrorMiddleware';\nimport { createDeviceSignatureHeadersMiddleware } from './utils/deviceSignatureHeadersMiddleware';\nimport { createUnauthorizedMiddleware } from './utils/unauthorizedMiddleware/createUnauthorizedMiddleware';\n\ntype ISettings = {\n basePath: string;\n credentials?: 'include';\n headers: {\n Authorization?: string;\n 'Content-Type': string;\n [DYNAMIC_API_VERSION_HEADER]: string;\n [DYNAMIC_REQUEST_ID_HEADER]: string;\n [DYNAMIC_SDK_VERSION_HEADER]: string;\n [MFA_TOKEN_HEADER]?: string;\n [SESSION_PUBLIC_KEY_HEADER]?: string;\n };\n};\n\n/**\n * Returns a new instance of the SDK API client.\n *\n * This is not meant for storing, as it is very light we can create it whenever needed.\n */\nexport const createApiClient = (\n options: CreateApiClientOptions = {},\n client: DynamicClient\n) => {\n const core = getCore(client);\n const coreState = core.state.get();\n\n const settings: ISettings = {\n basePath: core.apiBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n [DYNAMIC_API_VERSION_HEADER]: `API/${DYNAMIC_SDK_API_VERSION}`,\n [DYNAMIC_REQUEST_ID_HEADER]: randomString({ length: 50 }),\n [DYNAMIC_SDK_VERSION_HEADER]: `${CLIENT_SDK_NAME}/${version}`,\n ...core.getApiHeaders(),\n ...options.headers,\n },\n };\n\n if (client.token) {\n settings.headers.Authorization = `Bearer ${client.token}`;\n }\n\n if (client.projectSettings && isCookieEnabled(client)) {\n settings.credentials = 'include';\n }\n\n if (options.includeMfaToken && coreState.mfaToken) {\n settings.headers[MFA_TOKEN_HEADER] = coreState.mfaToken;\n }\n\n const sessionPublicKey = getSessionKeys(client)?.publicKey;\n\n // This check is required to avoid overriding the session public key header\n // that is set by any of our other SDKs using the Dynamic Client SDK.\n const isSessionPublicKeyHeaderPresent =\n settings.headers[SESSION_PUBLIC_KEY_HEADER] !== undefined;\n\n if (sessionPublicKey && !isSessionPublicKeyHeaderPresent) {\n settings.headers[SESSION_PUBLIC_KEY_HEADER] = sessionPublicKey;\n }\n\n return new SDKApi(\n new Configuration({\n ...settings,\n fetchApi: core.fetch,\n middleware: [\n createDeviceSignatureHeadersMiddleware(client),\n createConvertToApiErrorMiddleware({\n errorMappers: [...(options.errorMappers || []), clientErrorMapper],\n }),\n createUnauthorizedMiddleware(),\n ],\n })\n );\n};\n","import { getCore } from '../../../client/core/getCore';\nimport type { DynamicClient } from '../../../client/types';\nimport { createApiClient } from '../../../modules/apiClient';\nimport { NONCE_POOL_EXPIRATION_TIME, NONCE_POOL_SIZE } from '../constants';\n\n/**\n * Fetches a batch of nonces from the API.\n *\n * Prefetching is critical for iOS deep link wallet providers (e.g. Phantom\n * redirect). On iOS, a network request (like fetching a nonce) between a user\n * action and a deeplink call will break the gesture chain, causing iOS to\n * silently ignore the deeplink. By prefetching nonces ahead of time,\n * `getNonce` can return synchronously from cache and the deeplink fires\n * without an interrupting network round-trip.\n */\nexport const fetchAndStoreNonces = async (\n client: DynamicClient\n): Promise<void> => {\n const core = getCore(client);\n\n const { environmentId } = core;\n\n const apiClient = createApiClient({}, client);\n\n const { nonces } = await apiClient.getNonces({\n count: NONCE_POOL_SIZE,\n environmentId,\n });\n\n core.state.set({\n prefetchedNonces: nonces,\n prefetchedNoncesExpiration: Date.now() + NONCE_POOL_EXPIRATION_TIME,\n });\n};\n","import type { Chain } from '../chain';\n\ntype ChainInfo = {\n apiChainName: string;\n blockchainName: string;\n verifiedCredentialChainName: string;\n waasChainNameOverride?: string;\n};\n\nexport const CHAINS_INFO_MAP: Record<Chain, ChainInfo> = {\n ALEO: {\n apiChainName: 'aleo',\n blockchainName: 'Aleo',\n verifiedCredentialChainName: 'aleo',\n },\n ALGO: {\n apiChainName: 'algo',\n blockchainName: 'Algorand',\n verifiedCredentialChainName: 'algorand',\n },\n APTOS: {\n apiChainName: 'aptos',\n blockchainName: 'Aptos',\n verifiedCredentialChainName: 'aptos',\n },\n BTC: {\n apiChainName: 'bitcoin',\n blockchainName: 'Bitcoin',\n verifiedCredentialChainName: 'bip122',\n },\n COSMOS: {\n apiChainName: 'cosmos',\n blockchainName: 'Cosmos',\n verifiedCredentialChainName: 'cosmos',\n },\n ECLIPSE: {\n apiChainName: 'eclipse',\n blockchainName: 'Eclipse',\n verifiedCredentialChainName: 'eclipse',\n },\n EVM: {\n apiChainName: 'evm',\n // eslint-disable-next-line custom-rules/ban-ethereum-eth-terms\n blockchainName: 'Ethereum',\n verifiedCredentialChainName: 'eip155',\n },\n FLOW: {\n apiChainName: 'flow',\n blockchainName: 'Flow',\n verifiedCredentialChainName: 'flow',\n },\n SOL: {\n apiChainName: 'solana',\n blockchainName: 'Solana',\n verifiedCredentialChainName: 'solana',\n waasChainNameOverride: 'SVM',\n },\n SPARK: {\n apiChainName: 'spark',\n blockchainName: 'Spark',\n verifiedCredentialChainName: 'spark',\n },\n STARK: {\n apiChainName: 'starknet',\n blockchainName: 'Starknet',\n verifiedCredentialChainName: 'starknet',\n },\n STELLAR: {\n apiChainName: 'stellar',\n blockchainName: 'Stellar',\n verifiedCredentialChainName: 'stellar',\n },\n SUI: {\n apiChainName: 'sui',\n blockchainName: 'Sui',\n verifiedCredentialChainName: 'sui',\n },\n TON: {\n apiChainName: 'ton',\n blockchainName: 'TON',\n verifiedCredentialChainName: 'ton',\n },\n TRON: {\n apiChainName: 'tron',\n blockchainName: 'Tron',\n verifiedCredentialChainName: 'tron',\n },\n};\n","import type { Chain } from '../../modules/chain';\nimport { CHAINS_INFO_MAP } from '../../modules/wallets/constants';\nimport { assertDefined } from '../assertDefined';\n\nexport const getChainFromVerifiedCredentialChain = (\n verifiedCredentialChain: string\n): Chain => {\n const chains = Object.keys(CHAINS_INFO_MAP) as Chain[];\n\n const chain = chains.find(\n (chain) =>\n CHAINS_INFO_MAP[chain].verifiedCredentialChainName ===\n verifiedCredentialChain\n );\n\n assertDefined(chain, `Unknown chain: ${verifiedCredentialChain}`);\n\n return chain;\n};\n","import { dependencies } from '../package.json';\n\nexport const SDK_API_CORE_VERSION = dependencies['@dynamic-labs/sdk-api-core'];\n\nexport const DYNAMIC_ICONIC_SPRITE_URL =\n 'https://iconic.dynamic-static-assets.com/icons/sprite.svg';\n","import { DYNAMIC_ICONIC_SPRITE_URL } from '../../constants';\n\nexport const DEFAULT_WAAS_BASE_API_URL = 'https://app.dynamicauth.com';\nexport const DEFAULT_WAAS_BASE_MPC_RELAY_API_URL =\n 'https://relay.dynamicauth.com';\n\nexport const DYNAMIC_WAAS_METADATA = {\n displayName: 'Dynamic WaaS',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#dynamicwaas`,\n normalizedWalletName: 'dynamicwaas',\n};\n","import { BaseError } from './base';\n\nexport class InvalidParamError extends BaseError {\n constructor(message: string) {\n super({\n cause: null,\n code: 'invalid_param_error',\n docsUrl: null,\n name: 'InvalidParamError',\n shortMessage: message,\n });\n }\n}\n"],"mappings":"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"}