@dynamic-labs-sdk/client 0.17.1 → 0.17.3

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 (120) hide show
  1. package/dist/{InvalidParamError-3-1rSNtf.esm.js → InvalidParamError-C8bqZx25.esm.js} +59 -130
  2. package/dist/InvalidParamError-C8bqZx25.esm.js.map +1 -0
  3. package/dist/{InvalidParamError-zIxsXkiH.cjs.js → InvalidParamError-DvFYOkxL.cjs.js} +65 -187
  4. package/dist/InvalidParamError-DvFYOkxL.cjs.js.map +1 -0
  5. package/dist/{NotWaasWalletAccountError-DVIcEgHJ.esm.js → NotWaasWalletAccountError-C-_6uyUM.esm.js} +3 -3
  6. package/dist/{NotWaasWalletAccountError-DVIcEgHJ.esm.js.map → NotWaasWalletAccountError-C-_6uyUM.esm.js.map} +1 -1
  7. package/dist/{NotWaasWalletAccountError-B_Wl6sTh.cjs.js → NotWaasWalletAccountError-CHSFUjd9.cjs.js} +3 -3
  8. package/dist/{NotWaasWalletAccountError-B_Wl6sTh.cjs.js.map → NotWaasWalletAccountError-CHSFUjd9.cjs.js.map} +1 -1
  9. package/dist/client/core/createCore/createCore.d.ts.map +1 -1
  10. package/dist/client/core/types/DynamicCore.d.ts +20 -0
  11. package/dist/client/core/types/DynamicCore.d.ts.map +1 -1
  12. package/dist/client/core/types/DynamicCoreConfig.d.ts +1 -1
  13. package/dist/client/core/types/DynamicCoreConfig.d.ts.map +1 -1
  14. package/dist/client/types/DynamicClientConfig.d.ts +5 -0
  15. package/dist/client/types/DynamicClientConfig.d.ts.map +1 -1
  16. package/dist/core.cjs.js +24 -11
  17. package/dist/core.cjs.js.map +1 -1
  18. package/dist/core.esm.js +16 -6
  19. package/dist/core.esm.js.map +1 -1
  20. package/dist/exports/core.d.ts +10 -0
  21. package/dist/exports/core.d.ts.map +1 -1
  22. package/dist/{getNetworkProviderFromNetworkId-BJR1GciB.cjs.js → getNetworkProviderFromNetworkId-DK9fnM_Y.cjs.js} +432 -69
  23. package/dist/getNetworkProviderFromNetworkId-DK9fnM_Y.cjs.js.map +1 -0
  24. package/dist/{getNetworkProviderFromNetworkId-C7jp--76.esm.js → getNetworkProviderFromNetworkId-n7VUDpn0.esm.js} +374 -68
  25. package/dist/getNetworkProviderFromNetworkId-n7VUDpn0.esm.js.map +1 -0
  26. package/dist/{getSignedSessionId-DVpOgsL9.cjs.js → getSignedSessionId-B2-EYPik.cjs.js} +7 -17
  27. package/dist/getSignedSessionId-B2-EYPik.cjs.js.map +1 -0
  28. package/dist/{getSignedSessionId-Alfz9eul.esm.js → getSignedSessionId-CM3X3R5t.esm.js} +7 -17
  29. package/dist/getSignedSessionId-CM3X3R5t.esm.js.map +1 -0
  30. package/dist/{getVerifiedCredentialForWalletAccount-DLtDL1Gl.esm.js → getVerifiedCredentialForWalletAccount-Cs7AcMKQ.esm.js} +2 -2
  31. package/dist/{getVerifiedCredentialForWalletAccount-DLtDL1Gl.esm.js.map → getVerifiedCredentialForWalletAccount-Cs7AcMKQ.esm.js.map} +1 -1
  32. package/dist/{getVerifiedCredentialForWalletAccount-D25Vyxub.cjs.js → getVerifiedCredentialForWalletAccount-CyLnpS2G.cjs.js} +3 -2
  33. package/dist/{getVerifiedCredentialForWalletAccount-D25Vyxub.cjs.js.map → getVerifiedCredentialForWalletAccount-CyLnpS2G.cjs.js.map} +1 -1
  34. package/dist/index.cjs.js +182 -79
  35. package/dist/index.cjs.js.map +1 -1
  36. package/dist/index.esm.js +174 -71
  37. package/dist/index.esm.js.map +1 -1
  38. package/dist/{isMfaRequiredForAction-CYYU8V1B.cjs.js → isMfaRequiredForAction-BrRKwK_i.cjs.js} +2 -2
  39. package/dist/{isMfaRequiredForAction-CYYU8V1B.cjs.js.map → isMfaRequiredForAction-BrRKwK_i.cjs.js.map} +1 -1
  40. package/dist/{isMfaRequiredForAction-CPTFDCJp.esm.js → isMfaRequiredForAction-CM26tbT2.esm.js} +2 -2
  41. package/dist/{isMfaRequiredForAction-CPTFDCJp.esm.js.map → isMfaRequiredForAction-CM26tbT2.esm.js.map} +1 -1
  42. package/dist/modules/apiClient/apiClient.types.d.ts +7 -0
  43. package/dist/modules/apiClient/apiClient.types.d.ts.map +1 -1
  44. package/dist/modules/apiClient/constants.d.ts +2 -0
  45. package/dist/modules/apiClient/constants.d.ts.map +1 -1
  46. package/dist/modules/apiClient/createApiClient.d.ts.map +1 -1
  47. package/dist/modules/auth/getElevatedAccessToken/getElevatedAccessToken.d.ts +15 -8
  48. package/dist/modules/auth/getElevatedAccessToken/getElevatedAccessToken.d.ts.map +1 -1
  49. package/dist/modules/auth/logout/logout.d.ts.map +1 -1
  50. package/dist/modules/auth/passkeys/deletePasskey/deletePasskey.d.ts.map +1 -1
  51. package/dist/modules/auth/passkeys/serverRegisterPasskey/serverRegisterPasskey.d.ts.map +1 -1
  52. package/dist/modules/deviceRegistration/getDeviceSigner/getDeviceSigner.d.ts.map +1 -1
  53. package/dist/modules/initializeClient/initializeClient.d.ts.map +1 -1
  54. package/dist/modules/keychainMigration/migrateSessionKeyToKeychain/KeyMigrationError.d.ts +5 -0
  55. package/dist/modules/keychainMigration/migrateSessionKeyToKeychain/KeyMigrationError.d.ts.map +1 -0
  56. package/dist/modules/keychainMigration/migrateSessionKeyToKeychain/migrateSessionKeyToKeychain.d.ts +24 -0
  57. package/dist/modules/keychainMigration/migrateSessionKeyToKeychain/migrateSessionKeyToKeychain.d.ts.map +1 -0
  58. package/dist/modules/mfa/deleteMfaDevice/deleteMfaDevice.d.ts +6 -4
  59. package/dist/modules/mfa/deleteMfaDevice/deleteMfaDevice.d.ts.map +1 -1
  60. package/dist/modules/mfa/registerTotpMfaDevice/registerTotpMfaDevice.d.ts.map +1 -1
  61. package/dist/modules/sessionKeys/generateNonceSignature/generateNonceSignature.d.ts.map +1 -1
  62. package/dist/modules/sessionKeys/generateSessionKeys/generateSessionKeys.d.ts.map +1 -1
  63. package/dist/modules/sessionKeys/generateSessionSignature/generateSessionSignature.d.ts.map +1 -1
  64. package/dist/modules/sessionKeys/getSessionKeys/getSessionKeys.d.ts.map +1 -1
  65. package/dist/modules/sessionKeys/sessionKeys.types.d.ts +0 -2
  66. package/dist/modules/sessionKeys/sessionKeys.types.d.ts.map +1 -1
  67. package/dist/services/instrumentation/constants.d.ts +17 -0
  68. package/dist/services/instrumentation/constants.d.ts.map +1 -0
  69. package/dist/services/instrumentation/createInstrumentation/createInstrumentation.d.ts +18 -0
  70. package/dist/services/instrumentation/createInstrumentation/createInstrumentation.d.ts.map +1 -0
  71. package/dist/services/instrumentation/createInstrumentation/index.d.ts +2 -0
  72. package/dist/services/instrumentation/createInstrumentation/index.d.ts.map +1 -0
  73. package/dist/services/instrumentation/instrumentation.types.d.ts +44 -0
  74. package/dist/services/instrumentation/instrumentation.types.d.ts.map +1 -0
  75. package/dist/services/instrumentation/scrubParameters/index.d.ts +2 -0
  76. package/dist/services/instrumentation/scrubParameters/index.d.ts.map +1 -0
  77. package/dist/services/instrumentation/scrubParameters/scrubParameters.d.ts +8 -0
  78. package/dist/services/instrumentation/scrubParameters/scrubParameters.d.ts.map +1 -0
  79. package/dist/services/keychain/createIndexedDBKeychainService/KeyNotFoundError.d.ts +5 -0
  80. package/dist/services/keychain/createIndexedDBKeychainService/KeyNotFoundError.d.ts.map +1 -0
  81. package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.d.ts +7 -0
  82. package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.d.ts.map +1 -0
  83. package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.types.d.ts +6 -0
  84. package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.types.d.ts.map +1 -0
  85. package/dist/services/keychain/createIndexedDBKeychainService/index.d.ts +2 -0
  86. package/dist/services/keychain/createIndexedDBKeychainService/index.d.ts.map +1 -0
  87. package/dist/services/keychain/createIndexedDBKeychainService/utils/constants.d.ts +2 -0
  88. package/dist/services/keychain/createIndexedDBKeychainService/utils/constants.d.ts.map +1 -0
  89. package/dist/services/keychain/createIndexedDBKeychainService/utils/deleteIndexedDBItem.d.ts +2 -0
  90. package/dist/services/keychain/createIndexedDBKeychainService/utils/deleteIndexedDBItem.d.ts.map +1 -0
  91. package/dist/services/keychain/createIndexedDBKeychainService/utils/getIndexedDBItem.d.ts +3 -0
  92. package/dist/services/keychain/createIndexedDBKeychainService/utils/getIndexedDBItem.d.ts.map +1 -0
  93. package/dist/services/keychain/createIndexedDBKeychainService/utils/openDatabase.d.ts +2 -0
  94. package/dist/services/keychain/createIndexedDBKeychainService/utils/openDatabase.d.ts.map +1 -0
  95. package/dist/services/keychain/createIndexedDBKeychainService/utils/setIndexedDBItem.d.ts +3 -0
  96. package/dist/services/keychain/createIndexedDBKeychainService/utils/setIndexedDBItem.d.ts.map +1 -0
  97. package/dist/services/keychain/errors/KeychainNotConfiguredError.d.ts +5 -0
  98. package/dist/services/keychain/errors/KeychainNotConfiguredError.d.ts.map +1 -0
  99. package/dist/services/keychain/index.d.ts +3 -0
  100. package/dist/services/keychain/index.d.ts.map +1 -0
  101. package/dist/services/keychain/keychain.types.d.ts +9 -0
  102. package/dist/services/keychain/keychain.types.d.ts.map +1 -0
  103. package/dist/services/realtime/createRealtimeService/createRealtimeService.d.ts +11 -0
  104. package/dist/services/realtime/createRealtimeService/createRealtimeService.d.ts.map +1 -0
  105. package/dist/services/realtime/createRealtimeService/index.d.ts +2 -0
  106. package/dist/services/realtime/createRealtimeService/index.d.ts.map +1 -0
  107. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  108. package/dist/waas.cjs.js +4 -3
  109. package/dist/waas.cjs.js.map +1 -1
  110. package/dist/waas.esm.js +3 -3
  111. package/dist/waasCore.cjs.js +4 -3
  112. package/dist/waasCore.cjs.js.map +1 -1
  113. package/dist/waasCore.esm.js +3 -3
  114. package/package.json +2 -2
  115. package/dist/InvalidParamError-3-1rSNtf.esm.js.map +0 -1
  116. package/dist/InvalidParamError-zIxsXkiH.cjs.js.map +0 -1
  117. package/dist/getNetworkProviderFromNetworkId-BJR1GciB.cjs.js.map +0 -1
  118. package/dist/getNetworkProviderFromNetworkId-C7jp--76.esm.js.map +0 -1
  119. package/dist/getSignedSessionId-Alfz9eul.esm.js.map +0 -1
  120. package/dist/getSignedSessionId-DVpOgsL9.cjs.js.map +0 -1
@@ -1,10 +1,8 @@
1
1
  import { AuthStorageEnum, Configuration, SDKApi, isDeviceNonceSignatureRequiredForUrl } from "@dynamic-labs/sdk-api-core";
2
- import { Buffer as Buffer$1 } from "buffer";
3
- import * as z from "zod/mini";
4
2
 
5
3
  //#region package.json
6
4
  var name = "@dynamic-labs-sdk/client";
7
- var version = "0.17.1";
5
+ var version = "0.17.3";
8
6
  var dependencies = {
9
7
  "@dynamic-labs-sdk/assert-package-version": "workspace:*",
10
8
  "@dynamic-labs-wallet/browser-wallet-client": "0.0.286",
@@ -124,9 +122,11 @@ const NONCE_POOL_SIZE = 5;
124
122
  const DYNAMIC_API_VERSION_HEADER = "x-dyn-api-version";
125
123
  const DYNAMIC_REQUEST_ID_HEADER = "x-dyn-request-id";
126
124
  const DYNAMIC_SDK_VERSION_HEADER = "x-dyn-version";
125
+ const ELEVATED_ACCESS_TOKEN_HEADER = "x-dyn-elevated-access-token";
127
126
  const MFA_TOKEN_HEADER = "x-mfa-auth-token";
128
127
  const SESSION_PUBLIC_KEY_HEADER = "x-dyn-session-public-key";
129
128
  const DYNAMIC_SDK_API_VERSION = dependencies["@dynamic-labs/sdk-api-core"];
129
+ const DYNAMIC_SDK_SESSION_ID_HEADER = "x-dyn-session-id";
130
130
  const CLIENT_SDK_NAME = "ClientSDK";
131
131
 
132
132
  //#endregion
@@ -189,22 +189,54 @@ const isCookieEnabled = (client) => {
189
189
  return dynamicCookiesEnabled || byoJwtCookieEnabled;
190
190
  };
191
191
 
192
- //#endregion
193
- //#region src/utils/getBuffer/getBuffer.ts
194
- const getBuffer = () => typeof Buffer !== "undefined" ? Buffer : Buffer$1;
195
-
196
192
  //#endregion
197
193
  //#region src/modules/sessionKeys/getSessionKeys/getSessionKeys.ts
198
194
  const getSessionKeys = (client) => {
195
+ const publicKey = getCore(client).state.get().sessionKeys;
196
+ if (!publicKey) return;
197
+ return { publicKey };
198
+ };
199
+
200
+ //#endregion
201
+ //#region src/modules/auth/getElevatedAccessToken/getElevatedAccessToken.ts
202
+ /**
203
+ * Gets an elevated access token by scope.
204
+ *
205
+ * This function retrieves an elevated access token that contains the specified scope.
206
+ * Expired tokens are automatically filtered out.
207
+ *
208
+ * By default, if the token has `singleUse: true`, it will be automatically
209
+ * consumed (removed from state) after retrieval. Pass `consume: false` to
210
+ * check for token existence without consuming it.
211
+ *
212
+ * @param params - The parameters object.
213
+ * @param params.scope - The scope to match (e.g., 'wallet:export').
214
+ * @param params.consume - Whether to consume single-use tokens (default: true).
215
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
216
+ * @returns The elevated access token if found and not expired, or undefined if not found or expired.
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * // Retrieve and consume (default)
221
+ * const token = getElevatedAccessToken({ scope: 'wallet:export' });
222
+ *
223
+ * // Check existence without consuming
224
+ * const token = getElevatedAccessToken({ scope: 'credential:unlink', consume: false });
225
+ * ```
226
+ */
227
+ const getElevatedAccessToken = ({ consume = true, scope }, client = getDefaultClient()) => {
199
228
  const core = getCore(client);
200
- const encodedKeys = core.state.get().sessionKeys;
201
- if (!encodedKeys) return;
202
- try {
203
- return JSON.parse(getBuffer().from(encodedKeys, "base64").toString());
204
- } catch (error) {
205
- core.logger.error("Error decoding session keys", error);
206
- return;
229
+ const now = /* @__PURE__ */ new Date();
230
+ const elevatedAccessTokens = core.state.get().elevatedAccessTokens || [];
231
+ const validTokens = elevatedAccessTokens.filter((token$1) => !token$1.expiresAt || token$1.expiresAt > now);
232
+ if (validTokens.length !== elevatedAccessTokens.length) core.state.set({ elevatedAccessTokens: validTokens });
233
+ const token = validTokens.find((token$1) => token$1.scopes.includes(scope));
234
+ if (!token) return;
235
+ if (consume && token.singleUse) {
236
+ const updatedTokens = validTokens.filter((t) => t !== token);
237
+ core.state.set({ elevatedAccessTokens: updatedTokens });
207
238
  }
239
+ return token.token;
208
240
  };
209
241
 
210
242
  //#endregion
@@ -386,128 +418,20 @@ const getNonce = async (client) => {
386
418
  return getNonce(client);
387
419
  };
388
420
 
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
421
  //#endregion
493
422
  //#region src/modules/deviceRegistration/getDeviceSigner/getDeviceSigner.ts
494
423
  const getDeviceSigner = async (client) => {
495
- const { deviceSigner } = getCore(client);
424
+ const { deviceSigner, keychain } = getCore(client);
496
425
  /**
497
- * If the device signer is available, it should handle the device signing
426
+ * If the device signer is available, it should handle the device signing.
498
427
  * This is used for mobile devices with secure enclave.
499
428
  */
500
429
  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);
430
+ const keyName = "device";
431
+ if (!await keychain.getPublicKey(keyName)) await keychain.generateKey(keyName);
505
432
  return {
506
- getPublicKey: async () => environmentDeviceSigningKeys.publicKey,
507
- sign: (payload) => p256Sign({
508
- message: payload,
509
- privateKeyJwk: environmentDeviceSigningKeys.privateJwk
510
- })
433
+ getPublicKey: () => keychain.getPublicKey(keyName),
434
+ sign: (payload) => keychain.sign(keyName, payload)
511
435
  };
512
436
  };
513
437
 
@@ -600,6 +524,7 @@ const createApiClient = (options = {}, client) => {
600
524
  "Content-Type": "application/json",
601
525
  [DYNAMIC_API_VERSION_HEADER]: `API/${DYNAMIC_SDK_API_VERSION}`,
602
526
  [DYNAMIC_REQUEST_ID_HEADER]: randomString({ length: 50 }),
527
+ [DYNAMIC_SDK_SESSION_ID_HEADER]: core.sdkSessionId,
603
528
  [DYNAMIC_SDK_VERSION_HEADER]: `${CLIENT_SDK_NAME}/${version}`,
604
529
  ...core.getApiHeaders(),
605
530
  ...options.headers
@@ -608,6 +533,10 @@ const createApiClient = (options = {}, client) => {
608
533
  if (client.token) settings.headers.Authorization = `Bearer ${client.token}`;
609
534
  if (client.projectSettings && isCookieEnabled(client)) settings.credentials = "include";
610
535
  if (options.includeMfaToken && coreState.mfaToken) settings.headers[MFA_TOKEN_HEADER] = coreState.mfaToken;
536
+ if (options.elevatedAccessTokenScope) {
537
+ const elevatedToken = getElevatedAccessToken({ scope: options.elevatedAccessTokenScope }, client);
538
+ if (elevatedToken) settings.headers[ELEVATED_ACCESS_TOKEN_HEADER] = elevatedToken;
539
+ }
611
540
  const sessionPublicKey = getSessionKeys(client)?.publicKey;
612
541
  const isSessionPublicKeyHeaderPresent = settings.headers[SESSION_PUBLIC_KEY_HEADER] !== void 0;
613
542
  if (sessionPublicKey && !isSessionPublicKeyHeaderPresent) settings.headers[SESSION_PUBLIC_KEY_HEADER] = sessionPublicKey;
@@ -771,5 +700,5 @@ var InvalidParamError = class extends BaseError {
771
700
  };
772
701
 
773
702
  //#endregion
774
- 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 };
775
- //# sourceMappingURL=InvalidParamError-3-1rSNtf.esm.js.map
703
+ export { NONCE_POOL_SIZE as A, getSessionKeys as C, randomString as D, ValueMustBeDefinedError as E, getCore as F, name as I, version as L, setDefaultClient as M, ClientNotFoundError as N, CLIENT_SDK_NAME as O, BaseError as P, getElevatedAccessToken as S, assertDefined as T, MfaRateLimitedError as _, DYNAMIC_ICONIC_SPRITE_URL as a, InvalidExternalAuthError as b, CHAINS_INFO_MAP as c, UnauthorizedError as d, createDeviceSignatureHeadersMiddleware as f, SandboxMaximumThresholdReachedError as g, getNonce as h, DYNAMIC_WAAS_METADATA as i, getDefaultClient as j, DYNAMIC_SDK_API_VERSION 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, MfaInvalidOtpError as v, isCookieEnabled as w, APIError as x, LinkCredentialError as y };
704
+ //# sourceMappingURL=InvalidParamError-C8bqZx25.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvalidParamError-C8bqZx25.esm.js","names":["defaultClient: DynamicClient | null","token","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/modules/sessionKeys/getSessionKeys/getSessionKeys.ts","../src/modules/auth/getElevatedAccessToken/getElevatedAccessToken.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/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 ELEVATED_ACCESS_TOKEN_HEADER = 'x-dyn-elevated-access-token';\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 DYNAMIC_SDK_SESSION_ID_HEADER = 'x-dyn-session-id';\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","import { getCore } from '../../../client/core/getCore';\nimport type { DynamicClient } from '../../../client/types';\nimport type { SessionKeys } from '../sessionKeys.types';\n\nexport const getSessionKeys = (client: DynamicClient): SessionKeys | undefined => {\n const core = getCore(client);\n\n const publicKey = core.state.get().sessionKeys;\n\n if (!publicKey) {\n return undefined;\n }\n\n return { publicKey };\n};\n","import { getCore } from '../../../client/core/getCore';\nimport { getDefaultClient } from '../../../client/defaultClient';\n\ntype GetElevatedAccessTokenParams = {\n /**\n * Whether to consume single-use tokens after retrieval.\n * Set to `false` to check for token existence without side-effects.\n * @default true\n */\n consume?: boolean;\n scope: string;\n};\n\n/**\n * Gets an elevated access token by scope.\n *\n * This function retrieves an elevated access token that contains the specified scope.\n * Expired tokens are automatically filtered out.\n *\n * By default, if the token has `singleUse: true`, it will be automatically\n * consumed (removed from state) after retrieval. Pass `consume: false` to\n * check for token existence without consuming it.\n *\n * @param params - The parameters object.\n * @param params.scope - The scope to match (e.g., 'wallet:export').\n * @param params.consume - Whether to consume single-use tokens (default: true).\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns The elevated access token if found and not expired, or undefined if not found or expired.\n *\n * @example\n * ```typescript\n * // Retrieve and consume (default)\n * const token = getElevatedAccessToken({ scope: 'wallet:export' });\n *\n * // Check existence without consuming\n * const token = getElevatedAccessToken({ scope: 'credential:unlink', consume: false });\n * ```\n */\nexport const getElevatedAccessToken = (\n { consume = true, scope }: GetElevatedAccessTokenParams,\n client = getDefaultClient()\n): string | undefined => {\n const core = getCore(client);\n\n const now = new Date();\n const elevatedAccessTokens = core.state.get().elevatedAccessTokens || [];\n\n // Filter out expired tokens\n const validTokens = elevatedAccessTokens.filter(\n (token) => !token.expiresAt || token.expiresAt > now\n );\n\n // Remove expired tokens from state if any were found\n if (validTokens.length !== elevatedAccessTokens.length) {\n core.state.set({\n elevatedAccessTokens: validTokens,\n });\n }\n\n const token = validTokens.find((token) => token.scopes.includes(scope));\n\n if (!token) {\n return undefined;\n }\n\n // Check if token should be consumed based on singleUse property\n if (consume && token.singleUse) {\n const updatedTokens = validTokens.filter((t) => t !== token);\n core.state.set({\n elevatedAccessTokens: updatedTokens,\n });\n }\n\n return token.token;\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","import { getCore } from '../../../client/core/getCore';\nimport type { DynamicClient } from '../../../client/types';\nimport type { DeviceSigner } from '../../../services/deviceSigner';\n\nexport const getDeviceSigner = async (\n client: DynamicClient\n): Promise<DeviceSigner> => {\n const { deviceSigner, keychain } = 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 const keyName = 'device';\n\n const existingPublicKey = await keychain.getPublicKey(keyName);\n\n if (!existingPublicKey) {\n await keychain.generateKey(keyName);\n }\n\n return {\n getPublicKey: () => keychain.getPublicKey(keyName) as Promise<string>,\n sign: (payload: string) => keychain.sign(keyName, payload),\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 { getElevatedAccessToken } from '../auth/getElevatedAccessToken';\nimport {\n CLIENT_SDK_NAME,\n DYNAMIC_API_VERSION_HEADER,\n DYNAMIC_REQUEST_ID_HEADER,\n DYNAMIC_SDK_API_VERSION,\n DYNAMIC_SDK_SESSION_ID_HEADER,\n DYNAMIC_SDK_VERSION_HEADER,\n ELEVATED_ACCESS_TOKEN_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_SESSION_ID_HEADER]: string;\n [DYNAMIC_SDK_VERSION_HEADER]: string;\n [ELEVATED_ACCESS_TOKEN_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_SESSION_ID_HEADER]: core.sdkSessionId,\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 if (options.elevatedAccessTokenScope) {\n const elevatedToken = getElevatedAccessToken(\n { scope: options.elevatedAccessTokenScope },\n client\n );\n if (elevatedToken) {\n settings.headers[ELEVATED_ACCESS_TOKEN_HEADER] = elevatedToken;\n }\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 TEMPO: {\n apiChainName: 'tempo',\n blockchainName: 'Tempo',\n verifiedCredentialChainName: 'tempo',\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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"}