@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
package/dist/index.cjs.js CHANGED
@@ -1,14 +1,14 @@
1
- const require_InvalidParamError = require('./InvalidParamError-zIxsXkiH.cjs.js');
2
- const require_getNetworkProviderFromNetworkId = require('./getNetworkProviderFromNetworkId-BJR1GciB.cjs.js');
3
- const require_getVerifiedCredentialForWalletAccount = require('./getVerifiedCredentialForWalletAccount-D25Vyxub.cjs.js');
4
- const require_NotWaasWalletAccountError = require('./NotWaasWalletAccountError-B_Wl6sTh.cjs.js');
5
- const require_isMfaRequiredForAction = require('./isMfaRequiredForAction-CYYU8V1B.cjs.js');
1
+ const require_getNetworkProviderFromNetworkId = require('./getNetworkProviderFromNetworkId-DK9fnM_Y.cjs.js');
2
+ const require_InvalidParamError = require('./InvalidParamError-DvFYOkxL.cjs.js');
3
+ const require_getVerifiedCredentialForWalletAccount = require('./getVerifiedCredentialForWalletAccount-CyLnpS2G.cjs.js');
4
+ const require_NotWaasWalletAccountError = require('./NotWaasWalletAccountError-CHSFUjd9.cjs.js');
5
+ const require_isMfaRequiredForAction = require('./isMfaRequiredForAction-BrRKwK_i.cjs.js');
6
6
  let _dynamic_labs_sdk_assert_package_version = require("@dynamic-labs-sdk/assert-package-version");
7
7
  let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
8
8
  let zod_mini = require("zod/mini");
9
- zod_mini = require_InvalidParamError.__toESM(zod_mini);
9
+ zod_mini = require_getNetworkProviderFromNetworkId.__toESM(zod_mini);
10
10
  let eventemitter3 = require("eventemitter3");
11
- eventemitter3 = require_InvalidParamError.__toESM(eventemitter3);
11
+ eventemitter3 = require_getNetworkProviderFromNetworkId.__toESM(eventemitter3);
12
12
  let _simplewebauthn_browser = require("@simplewebauthn/browser");
13
13
 
14
14
  //#region src/modules/state/raiseStateEvents/events.ts
@@ -86,7 +86,7 @@ const isSignedIn = (client = require_InvalidParamError.getDefaultClient()) => Bo
86
86
  /**
87
87
  * The schema to track the expiration time of the project settings.
88
88
  */
89
- const projectSettingsExpirationStorageKeySchema = require_InvalidParamError.createStorageKeySchema({
89
+ const projectSettingsExpirationStorageKeySchema = require_getNetworkProviderFromNetworkId.createStorageKeySchema({
90
90
  key: "projectSettingsExpiration",
91
91
  schema: zod_mini.number()
92
92
  });
@@ -205,6 +205,7 @@ const logout = async (client = require_InvalidParamError.getDefaultClient()) =>
205
205
  */
206
206
  if (require_InvalidParamError.isCookieEnabled(client)) require_getVerifiedCredentialForWalletAccount.setCookie(`${require_getVerifiedCredentialForWalletAccount.DYNAMIC_AUTH_COOKIE_NAME}=; Max-Age=-99999999; path=/; SameSite=Lax`);
207
207
  }
208
+ await core.keychain.removeKey("session");
208
209
  core.state.set({
209
210
  captchaToken: null,
210
211
  elevatedAccessTokens: [],
@@ -298,20 +299,6 @@ const setupCrossTabEventSync = (client) => {
298
299
  core.crossTabBroadcast.on("deviceRegistrationCompleted", handleCrossTabDeviceRegistrationCompleted);
299
300
  };
300
301
 
301
- //#endregion
302
- //#region src/modules/state/raiseStateEvents/raiseStateEvents.ts
303
- const raiseStateEvents = (client) => {
304
- require_InvalidParamError.getCore(client).state.subscribe((value, previous) => {
305
- Object.entries(stateChangeEvents).forEach(([key, event]) => {
306
- if (require_getNetworkProviderFromNetworkId.isEqualShallow(value[key], previous[key])) return;
307
- require_getVerifiedCredentialForWalletAccount.emitEvent({
308
- args: { [key]: value[key] },
309
- event
310
- }, client);
311
- });
312
- });
313
- };
314
-
315
302
  //#endregion
316
303
  //#region src/modules/wallets/unverifiedWalletAccounts/schema.ts
317
304
  const unverifiedWalletAccountSchema = zod_mini.object({
@@ -334,7 +321,7 @@ const walletProviderKeyMapSchema = zod_mini.record(zod_mini.string(), zod_mini.s
334
321
 
335
322
  //#endregion
336
323
  //#region src/modules/storageSync/schema.ts
337
- const stateStorageKeySchema = require_InvalidParamError.createStorageKeySchema({
324
+ const stateStorageKeySchema = require_getNetworkProviderFromNetworkId.createStorageKeySchema({
338
325
  key: "state",
339
326
  schema: zod_mini.object({
340
327
  apiVersion: zod_mini.string(),
@@ -346,7 +333,7 @@ const stateStorageKeySchema = require_InvalidParamError.createStorageKeySchema({
346
333
  walletProviderKeyMap: walletProviderKeyMapSchema
347
334
  })
348
335
  });
349
- const sessionStorageKeySchema = require_InvalidParamError.createStorageKeySchema({
336
+ const sessionStorageKeySchema = require_getNetworkProviderFromNetworkId.createStorageKeySchema({
350
337
  key: "session",
351
338
  schema: zod_mini.object({
352
339
  captchaToken: zod_mini.nullable(zod_mini.string()),
@@ -364,6 +351,87 @@ const sessionStorageKeySchema = require_InvalidParamError.createStorageKeySchema
364
351
  })
365
352
  });
366
353
 
354
+ //#endregion
355
+ //#region src/modules/keychainMigration/migrateSessionKeyToKeychain/KeyMigrationError.ts
356
+ var KeyMigrationError = class extends require_InvalidParamError.BaseError {
357
+ constructor(expectedPublicKey, importedPublicKey) {
358
+ super({
359
+ cause: null,
360
+ code: "key_migration_public_key_mismatch",
361
+ docsUrl: null,
362
+ name: "KeyMigrationError",
363
+ shortMessage: `Public key mismatch after import: expected "${expectedPublicKey}", got "${importedPublicKey}"`
364
+ });
365
+ }
366
+ };
367
+
368
+ //#endregion
369
+ //#region src/modules/keychainMigration/migrateSessionKeyToKeychain/migrateSessionKeyToKeychain.ts
370
+ /**
371
+ * Migrates legacy session keys from the hydrated state into the IndexedDB keychain
372
+ * as non-extractable CryptoKey objects.
373
+ *
374
+ * Must run after hydrateStateWithStorage so that state.sessionKeys already holds
375
+ * the legacy base64 blob (or the new public key hex if already migrated).
376
+ *
377
+ * Idempotent: skips if the keychain already has a `session` key.
378
+ * Throws on failure — callers should handle errors (e.g. .catch(() => logout(client))).
379
+ */
380
+ const migrateSessionKeyToKeychain = async ({ keychain, logger, state, storage }) => {
381
+ if (require_getNetworkProviderFromNetworkId.isServerSideRendering()) return;
382
+ logger.debug("[migrateSessionKeyToKeychain] Checking for existing session key in keychain");
383
+ if (await keychain.hasKey("session")) {
384
+ logger.debug("[migrateSessionKeyToKeychain] Session key already exists in keychain, skipping migration");
385
+ return;
386
+ }
387
+ const encodedSessionKeys = state.get().sessionKeys;
388
+ if (!encodedSessionKeys) {
389
+ logger.debug("[migrateSessionKeyToKeychain] No session keys in state, nothing to migrate");
390
+ return;
391
+ }
392
+ let blob;
393
+ try {
394
+ blob = JSON.parse(require_getNetworkProviderFromNetworkId.getBuffer().from(encodedSessionKeys, "base64").toString());
395
+ } catch {
396
+ logger.debug("[migrateSessionKeyToKeychain] Session keys are not a legacy blob, skipping migration");
397
+ return;
398
+ }
399
+ const { privateKeyJwk, publicKey } = blob;
400
+ if (!privateKeyJwk || !publicKey) {
401
+ logger.debug("[migrateSessionKeyToKeychain] Legacy blob missing privateKeyJwk or publicKey, skipping migration");
402
+ return;
403
+ }
404
+ logger.debug("[migrateSessionKeyToKeychain] Found legacy session key, importing into keychain", { expectedPublicKey: publicKey });
405
+ const importedPublicKey = await keychain.importKey("session", privateKeyJwk);
406
+ logger.debug("[migrateSessionKeyToKeychain] Key imported", {
407
+ expectedPublicKey: publicKey,
408
+ importedPublicKey
409
+ });
410
+ if (importedPublicKey !== publicKey) throw new KeyMigrationError(publicKey, importedPublicKey);
411
+ logger.debug("[migrateSessionKeyToKeychain] Public key validated, updating state and storage");
412
+ state.set({ sessionKeys: importedPublicKey });
413
+ const currentSession = await storage.getItem(sessionStorageKeySchema);
414
+ if (currentSession) await storage.setItem(sessionStorageKeySchema, {
415
+ ...currentSession,
416
+ sessionKeys: importedPublicKey
417
+ });
418
+ logger.debug("[migrateSessionKeyToKeychain] Migration complete");
419
+ };
420
+
421
+ //#endregion
422
+ //#region src/modules/state/raiseStateEvents/raiseStateEvents.ts
423
+ const raiseStateEvents = (client) => {
424
+ require_InvalidParamError.getCore(client).state.subscribe((value, previous) => {
425
+ Object.entries(stateChangeEvents).forEach(([key, event]) => {
426
+ if (require_getNetworkProviderFromNetworkId.isEqualShallow(value[key], previous[key])) return;
427
+ require_getVerifiedCredentialForWalletAccount.emitEvent({
428
+ args: { [key]: value[key] },
429
+ event
430
+ }, client);
431
+ });
432
+ });
433
+ };
434
+
367
435
  //#endregion
368
436
  //#region src/modules/storageSync/hydrateStateWithStorage/hydrateStateWithStorage.ts
369
437
  const hydrateStateWithStorage = async (client) => {
@@ -479,6 +547,14 @@ const initializeClient = async (client = require_InvalidParamError.getDefaultCli
479
547
  setupCrossTabEventSync(client);
480
548
  const initializeStorageSyncPromise = initializeStorageSync(client);
481
549
  const fetchProjectSettingsPromise = initializeStorageSyncPromise.then(async () => {
550
+ await migrateSessionKeyToKeychain({
551
+ keychain: core.keychain,
552
+ logger: core.logger,
553
+ state: core.state,
554
+ storage: core.storage
555
+ }).catch(() => logout(client));
556
+ if (core.state.get().sessionKeys && !await core.keychain.hasKey("session")) await logout(client);
557
+ }).then(async () => {
482
558
  if (!core.state.get().projectSettings) await fetchProjectSettings(client);
483
559
  });
484
560
  fetchProjectSettingsPromise.then(() => prefetchNoncesIfNeeded(client)).catch((error) => {
@@ -627,6 +703,59 @@ const createWebFetch = () => {
627
703
  return window.fetch.bind(window);
628
704
  };
629
705
 
706
+ //#endregion
707
+ //#region src/services/instrumentation/constants.ts
708
+ const DEFAULT_PII_FIELDS = [
709
+ "password",
710
+ "token",
711
+ "secret",
712
+ "privateKey",
713
+ "mnemonic",
714
+ "seed",
715
+ "email",
716
+ "phone",
717
+ "ssn",
718
+ "address",
719
+ "authorization"
720
+ ];
721
+
722
+ //#endregion
723
+ //#region src/services/instrumentation/createInstrumentation/createInstrumentation.ts
724
+ const buildPiiFields = (customFields = []) => {
725
+ const merged = [...DEFAULT_PII_FIELDS, ...customFields];
726
+ return [...new Set(merged)];
727
+ };
728
+ /**
729
+ * Creates the instrumentation service that gates event emission behind an
730
+ * enabled flag and delegates to a pluggable transport.
731
+ *
732
+ * The transport is intentionally optional at creation time — it is wired in
733
+ * later via setTransport so the SDK can initialise without one. Events logged
734
+ * before a transport is set are simply dropped.
735
+ *
736
+ * Custom piiFields are merged with and deduplicated against the defaults so
737
+ * callers only need to list additional fields, not replicate the baseline.
738
+ */
739
+ const createInstrumentation = ({ config: inputConfig } = {}) => {
740
+ let transport;
741
+ const config = {
742
+ enabled: inputConfig?.enabled ?? true,
743
+ piiFields: buildPiiFields(inputConfig?.piiFields)
744
+ };
745
+ return {
746
+ config,
747
+ log: (event) => {
748
+ if (config.enabled) transport?.log(event);
749
+ },
750
+ setEnabled: (value) => {
751
+ config.enabled = value;
752
+ },
753
+ setTransport: (t) => {
754
+ transport = t;
755
+ }
756
+ };
757
+ };
758
+
630
759
  //#endregion
631
760
  //#region src/services/navigate/createNavigationHandler/createNavigationHandler.ts
632
761
  /**
@@ -842,9 +971,13 @@ const createCore = (config) => {
842
971
  const debouncedMutex = createDebouncedMutex();
843
972
  const eventEmitter = createEventEmitter();
844
973
  const initTrack = createAsyncTrack();
974
+ const sdkSessionId = require_InvalidParamError.randomString({ length: 32 });
975
+ const instrumentation = createInstrumentation({ config: config.instrumentation });
845
976
  const runtimeServices = createRuntimeServices();
846
977
  const passkey = config.coreConfig?.passkey ?? createWebPasskeyService();
978
+ const realtime = config.coreConfig?.realtime ?? require_getNetworkProviderFromNetworkId.createRealtimeService();
847
979
  const deviceSigner = config.coreConfig?.deviceSigner;
980
+ const keychain = config.coreConfig?.keychain ?? require_getNetworkProviderFromNetworkId.createIndexedDBKeychainService({ dbName: `dynamic_${config.environmentId}_keychain` });
848
981
  return {
849
982
  apiBaseUrl,
850
983
  crossTabBroadcast: config.coreConfig?.crossTabBroadcast ?? require_getNetworkProviderFromNetworkId.createCrossTabBroadcast({ channelName: `dynamic_${config.environmentId}_broadcast` }),
@@ -856,6 +989,8 @@ const createCore = (config) => {
856
989
  fetch,
857
990
  getApiHeaders: config.coreConfig?.getApiHeaders ?? (() => ({})),
858
991
  initTrack,
992
+ instrumentation,
993
+ keychain,
859
994
  logger,
860
995
  metadata: {
861
996
  ...config.metadata,
@@ -864,7 +999,9 @@ const createCore = (config) => {
864
999
  navigate,
865
1000
  openDeeplink,
866
1001
  passkey,
1002
+ realtime,
867
1003
  runtimeServices,
1004
+ sdkSessionId,
868
1005
  state,
869
1006
  storage,
870
1007
  transformers: config.transformers,
@@ -1287,47 +1424,6 @@ const signInWithExternalJwt = async ({ externalJwt, sessionPublicKey } = {}, cli
1287
1424
  return response;
1288
1425
  };
1289
1426
 
1290
- //#endregion
1291
- //#region src/modules/auth/getElevatedAccessToken/getElevatedAccessToken.ts
1292
- /**
1293
- * Gets an elevated access token by scope.
1294
- *
1295
- * This function retrieves an elevated access token that contains the specified scope.
1296
- * Expired tokens are automatically filtered out.
1297
- *
1298
- * If the token has `singleUse: true`, it will be automatically
1299
- * consumed (removed from state) after retrieval. Otherwise, it remains in state
1300
- * for future use.
1301
- *
1302
- * @param params - The parameters object.
1303
- * @param params.scope - The scope to match (e.g., 'wallet:export').
1304
- * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
1305
- * @returns The elevated access token if found and not expired, or undefined if not found or expired.
1306
- *
1307
- * @example
1308
- * ```typescript
1309
- * const token = getElevatedAccessToken({ scope: 'wallet:export' });
1310
- * if (token) {
1311
- * // Use the token
1312
- * // Token is automatically consumed if singleUse: true
1313
- * }
1314
- * ```
1315
- */
1316
- const getElevatedAccessToken = ({ scope }, client = require_InvalidParamError.getDefaultClient()) => {
1317
- const core = require_InvalidParamError.getCore(client);
1318
- const now = /* @__PURE__ */ new Date();
1319
- const elevatedAccessTokens = core.state.get().elevatedAccessTokens || [];
1320
- const validTokens = elevatedAccessTokens.filter((token$1) => !token$1.expiresAt || token$1.expiresAt > now);
1321
- if (validTokens.length !== elevatedAccessTokens.length) core.state.set({ elevatedAccessTokens: validTokens });
1322
- const token = validTokens.find((token$1) => token$1.scopes.includes(scope));
1323
- if (!token) return;
1324
- if (token.singleUse) {
1325
- const updatedTokens = validTokens.filter((t) => t !== token);
1326
- core.state.set({ elevatedAccessTokens: updatedTokens });
1327
- }
1328
- return token.token;
1329
- };
1330
-
1331
1427
  //#endregion
1332
1428
  //#region src/modules/auth/passkeys/deletePasskey/deletePasskey.ts
1333
1429
  /**
@@ -1339,7 +1435,10 @@ const getElevatedAccessToken = ({ scope }, client = require_InvalidParamError.ge
1339
1435
  */
1340
1436
  const deletePasskey = async ({ passkeyId }, client = require_InvalidParamError.getDefaultClient()) => {
1341
1437
  const core = require_InvalidParamError.getCore(client);
1342
- await require_InvalidParamError.createApiClient({ includeMfaToken: true }, client).deletePasskey({
1438
+ await require_InvalidParamError.createApiClient({
1439
+ elevatedAccessTokenScope: _dynamic_labs_sdk_api_core.TokenScope.Credentialunlink,
1440
+ includeMfaToken: true
1441
+ }, client).deletePasskey({
1343
1442
  deleteUserPasskeyRequest: { passkeyId },
1344
1443
  environmentId: core.environmentId
1345
1444
  });
@@ -1372,7 +1471,7 @@ const getPasskeyRegistrationOptions = async (client) => {
1372
1471
  //#region src/modules/auth/passkeys/serverRegisterPasskey/serverRegisterPasskey.ts
1373
1472
  const serverRegisterPasskey = async ({ registration, createMfaToken }, client) => {
1374
1473
  const core = require_InvalidParamError.getCore(client);
1375
- return await require_InvalidParamError.createApiClient({}, client).registerPasskey({
1474
+ return await require_InvalidParamError.createApiClient({ elevatedAccessTokenScope: _dynamic_labs_sdk_api_core.TokenScope.Credentiallink }, client).registerPasskey({
1376
1475
  environmentId: core.environmentId,
1377
1476
  passkeyRegisterRequest: {
1378
1477
  ...registration,
@@ -1494,7 +1593,7 @@ const removeDynamicOauthParamsFromUrl = (url) => {
1494
1593
  //#endregion
1495
1594
  //#region src/modules/auth/social/oauth/redirectStateStorageSchema/redirectStateStorageSchema.ts
1496
1595
  /** The schema to track the state of the OAuth flow. */
1497
- const redirectStateStorageKeySchema = require_InvalidParamError.createStorageKeySchema({
1596
+ const redirectStateStorageKeySchema = require_getNetworkProviderFromNetworkId.createStorageKeySchema({
1498
1597
  key: "redirectState",
1499
1598
  schema: zod_mini.object({
1500
1599
  codeVerifier: zod_mini.optional(zod_mini.string()),
@@ -1805,7 +1904,7 @@ const getMultichainBalances = async ({ balanceRequest }, client = require_Invali
1805
1904
  //#endregion
1806
1905
  //#region src/modules/checkout/utils/createCheckoutSessionTokenStorageKey/createCheckoutSessionTokenStorageKey.ts
1807
1906
  const createCheckoutSessionTokenStorageKey = (transactionId) => {
1808
- return require_InvalidParamError.createStorageKeySchema({
1907
+ return require_getNetworkProviderFromNetworkId.createStorageKeySchema({
1809
1908
  key: `checkoutSessionToken:${transactionId}`,
1810
1909
  schema: zod_mini.string()
1811
1910
  });
@@ -2447,7 +2546,7 @@ const fetchWithTimeout = async (client) => {
2447
2546
  /**
2448
2547
  * The schema to store the cached wallet book data.
2449
2548
  */
2450
- const walletBookCacheStorageKeySchema = require_InvalidParamError.createStorageKeySchema({
2549
+ const walletBookCacheStorageKeySchema = require_getNetworkProviderFromNetworkId.createStorageKeySchema({
2451
2550
  key: "legacyWalletBookCache",
2452
2551
  schema: zod_mini.object({
2453
2552
  groups: zod_mini.record(zod_mini.string(), zod_mini.any()),
@@ -3041,23 +3140,27 @@ const createNewMfaRecoveryCodes = async (client = require_InvalidParamError.getD
3041
3140
  /**
3042
3141
  * Deletes a specific MFA device from the user's account.
3043
3142
  *
3044
- * This function removes a multi-factor authentication device such as
3045
- * a TOTP authenticator from the user's registered devices.
3143
+ * When an elevated access token for `credential:unlink` is available,
3144
+ * it is sent via the `x-dyn-elevated-access-token` header and the
3145
+ * MFA auth token is not required. Otherwise, `mfaAuthToken` must be
3146
+ * provided for backward compatibility with the legacy MFA flow.
3046
3147
  *
3047
3148
  * @param params.deviceId - The unique identifier of the MFA device to delete.
3048
- * @param params.mfaAuthToken - The MFA authentication token required for device deletion.
3149
+ * @param params.mfaAuthToken - The MFA authentication token. Optional when using elevated access tokens.
3049
3150
  * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
3050
3151
  * @returns A promise that resolves when the MFA device is successfully deleted.
3051
3152
  */
3052
3153
  const deleteMfaDevice = async ({ deviceId, mfaAuthToken }, client = require_InvalidParamError.getDefaultClient()) => {
3053
3154
  const core = require_InvalidParamError.getCore(client);
3054
- const apiClient = require_InvalidParamError.createApiClient({}, client);
3055
3155
  require_InvalidParamError.assertDefined(deviceId, "deviceId is required");
3056
- require_InvalidParamError.assertDefined(mfaAuthToken, "mfaAuthToken is required");
3057
- return apiClient.deleteMfaDevice({
3156
+ if (!require_InvalidParamError.getElevatedAccessToken({
3157
+ consume: false,
3158
+ scope: _dynamic_labs_sdk_api_core.TokenScope.Credentialunlink
3159
+ }, client)) require_InvalidParamError.assertDefined(mfaAuthToken, "mfaAuthToken is required");
3160
+ return require_InvalidParamError.createApiClient({ elevatedAccessTokenScope: _dynamic_labs_sdk_api_core.TokenScope.Credentialunlink }, client).deleteMfaDevice({
3058
3161
  environmentId: core.environmentId,
3059
3162
  mfaDeviceId: deviceId,
3060
- xMfaAuthToken: mfaAuthToken
3163
+ xMfaAuthToken: mfaAuthToken ?? ""
3061
3164
  });
3062
3165
  };
3063
3166
 
@@ -3144,7 +3247,7 @@ const isUserMissingMfaAuth = (client = require_InvalidParamError.getDefaultClien
3144
3247
  */
3145
3248
  const registerTotpMfaDevice = async (client = require_InvalidParamError.getDefaultClient()) => {
3146
3249
  const core = require_InvalidParamError.getCore(client);
3147
- return require_InvalidParamError.createApiClient({}, client).registerTotpMfaDevice({ environmentId: core.environmentId });
3250
+ return require_InvalidParamError.createApiClient({ elevatedAccessTokenScope: _dynamic_labs_sdk_api_core.TokenScope.Credentiallink }, client).registerTotpMfaDevice({ environmentId: core.environmentId });
3148
3251
  };
3149
3252
 
3150
3253
  //#endregion
@@ -5201,7 +5304,7 @@ exports.getCoinbaseBuyUrl = getCoinbaseBuyUrl;
5201
5304
  exports.getConnectedAddresses = getConnectedAddresses;
5202
5305
  exports.getDefaultClient = require_InvalidParamError.getDefaultClient;
5203
5306
  exports.getDeviceRegistrationTokenFromUrl = getDeviceRegistrationTokenFromUrl;
5204
- exports.getElevatedAccessToken = getElevatedAccessToken;
5307
+ exports.getElevatedAccessToken = require_InvalidParamError.getElevatedAccessToken;
5205
5308
  exports.getKrakenAccounts = getKrakenAccounts;
5206
5309
  exports.getKrakenWhitelistedAddresses = getKrakenWhitelistedAddresses;
5207
5310
  exports.getMfaDevices = getMfaDevices;