@explorins/pers-sdk 2.1.37 → 2.1.40

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 (99) hide show
  1. package/dist/business/api/business-api.d.ts +4 -0
  2. package/dist/business/api/business-api.d.ts.map +1 -1
  3. package/dist/business/index.d.ts +1 -1
  4. package/dist/business/index.d.ts.map +1 -1
  5. package/dist/business.cjs +1 -1
  6. package/dist/business.js +1 -1
  7. package/dist/chunks/{base-token-service-BGuuZX4b.js → base-token-service-N1gwRD8N.js} +2 -2
  8. package/dist/chunks/{base-token-service-BGuuZX4b.js.map → base-token-service-N1gwRD8N.js.map} +1 -1
  9. package/dist/chunks/{base-token-service-DSye0WD2.cjs → base-token-service-W7TU23qU.cjs} +2 -2
  10. package/dist/chunks/{base-token-service-DSye0WD2.cjs.map → base-token-service-W7TU23qU.cjs.map} +1 -1
  11. package/dist/chunks/{business-membership-service-B9ItWZ2_.cjs → business-membership-service-Dkb780NX.cjs} +21 -1
  12. package/dist/chunks/business-membership-service-Dkb780NX.cjs.map +1 -0
  13. package/dist/chunks/{business-membership-service-CPcE-AW0.js → business-membership-service-NLoqoFpG.js} +21 -1
  14. package/dist/chunks/business-membership-service-NLoqoFpG.js.map +1 -0
  15. package/dist/chunks/{pers-sdk-DemghJ3a.cjs → pers-sdk-CBvzmlL_.cjs} +158 -77
  16. package/dist/chunks/pers-sdk-CBvzmlL_.cjs.map +1 -0
  17. package/dist/chunks/{pers-sdk-Dds2lB27.js → pers-sdk-DuDWwRWC.js} +158 -77
  18. package/dist/chunks/pers-sdk-DuDWwRWC.js.map +1 -0
  19. package/dist/chunks/{redemption-service-Dc_0Kzd0.cjs → redemption-service-KamEndzB.cjs} +7 -1
  20. package/dist/chunks/{redemption-service-Dc_0Kzd0.cjs.map → redemption-service-KamEndzB.cjs.map} +1 -1
  21. package/dist/chunks/{redemption-service-DWhZgrZT.js → redemption-service-w0GMdF0m.js} +7 -1
  22. package/dist/chunks/{redemption-service-DWhZgrZT.js.map → redemption-service-w0GMdF0m.js.map} +1 -1
  23. package/dist/chunks/{token-service-qRSYG9uT.js → token-service-BcuDj292.js} +79 -14
  24. package/dist/chunks/token-service-BcuDj292.js.map +1 -0
  25. package/dist/chunks/{token-service-BJqu5Xap.cjs → token-service-CnnrCOsg.cjs} +79 -14
  26. package/dist/chunks/token-service-CnnrCOsg.cjs.map +1 -0
  27. package/dist/chunks/{web3-manager-Dvcq4xmn.js → web3-manager-B-IsluxI.js} +770 -34
  28. package/dist/chunks/web3-manager-B-IsluxI.js.map +1 -0
  29. package/dist/chunks/{web3-manager-C-JflQ86.cjs → web3-manager-NJaeBrci.cjs} +770 -32
  30. package/dist/chunks/web3-manager-NJaeBrci.cjs.map +1 -0
  31. package/dist/core/auth/refresh-manager.d.ts +12 -2
  32. package/dist/core/auth/refresh-manager.d.ts.map +1 -1
  33. package/dist/core/auth/services/auth-service.d.ts +4 -1
  34. package/dist/core/auth/services/auth-service.d.ts.map +1 -1
  35. package/dist/core/pers-api-client.d.ts.map +1 -1
  36. package/dist/core.cjs +4 -4
  37. package/dist/core.js +4 -4
  38. package/dist/index.cjs +5 -5
  39. package/dist/index.d.ts +1 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +5 -5
  42. package/dist/managers/redemption-manager.d.ts +13 -0
  43. package/dist/managers/redemption-manager.d.ts.map +1 -1
  44. package/dist/managers/token-manager.d.ts +66 -40
  45. package/dist/managers/token-manager.d.ts.map +1 -1
  46. package/dist/managers/web3-manager.d.ts +69 -1
  47. package/dist/managers/web3-manager.d.ts.map +1 -1
  48. package/dist/node.cjs +4 -4
  49. package/dist/node.js +4 -4
  50. package/dist/package.json +3 -3
  51. package/dist/redemption/services/redemption-service.d.ts +4 -0
  52. package/dist/redemption/services/redemption-service.d.ts.map +1 -1
  53. package/dist/redemption.cjs +1 -1
  54. package/dist/redemption.js +1 -1
  55. package/dist/token/api/token-api.d.ts +50 -12
  56. package/dist/token/api/token-api.d.ts.map +1 -1
  57. package/dist/token/index.d.ts +1 -1
  58. package/dist/token/index.d.ts.map +1 -1
  59. package/dist/token/services/token-service.d.ts +40 -9
  60. package/dist/token/services/token-service.d.ts.map +1 -1
  61. package/dist/token.cjs +2 -2
  62. package/dist/token.js +2 -2
  63. package/dist/trigger-source/api/trigger-source-api.d.ts +9 -10
  64. package/dist/trigger-source/api/trigger-source-api.d.ts.map +1 -1
  65. package/dist/trigger-source/index.d.ts +1 -0
  66. package/dist/trigger-source/index.d.ts.map +1 -1
  67. package/dist/trigger-source/models/index.d.ts +5 -13
  68. package/dist/trigger-source/models/index.d.ts.map +1 -1
  69. package/dist/trigger-source/services/trigger-source-service.d.ts +3 -11
  70. package/dist/trigger-source/services/trigger-source-service.d.ts.map +1 -1
  71. package/dist/trigger-source.cjs +20 -1
  72. package/dist/trigger-source.cjs.map +1 -1
  73. package/dist/trigger-source.js +20 -1
  74. package/dist/trigger-source.js.map +1 -1
  75. package/dist/web3/domain/services/balance-manager.d.ts +160 -0
  76. package/dist/web3/domain/services/balance-manager.d.ts.map +1 -0
  77. package/dist/web3/domain/services/index.d.ts +2 -0
  78. package/dist/web3/domain/services/index.d.ts.map +1 -1
  79. package/dist/web3/domain/services/token-collection-manager.d.ts +155 -0
  80. package/dist/web3/domain/services/token-collection-manager.d.ts.map +1 -0
  81. package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
  82. package/dist/web3/index.d.ts +1 -0
  83. package/dist/web3/index.d.ts.map +1 -1
  84. package/dist/web3/infrastructure/api/web3-api.d.ts +16 -0
  85. package/dist/web3/infrastructure/api/web3-api.d.ts.map +1 -1
  86. package/dist/web3-manager.cjs +1 -1
  87. package/dist/web3-manager.js +1 -1
  88. package/dist/web3.cjs +4 -2
  89. package/dist/web3.cjs.map +1 -1
  90. package/dist/web3.js +2 -2
  91. package/package.json +3 -3
  92. package/dist/chunks/business-membership-service-B9ItWZ2_.cjs.map +0 -1
  93. package/dist/chunks/business-membership-service-CPcE-AW0.js.map +0 -1
  94. package/dist/chunks/pers-sdk-Dds2lB27.js.map +0 -1
  95. package/dist/chunks/pers-sdk-DemghJ3a.cjs.map +0 -1
  96. package/dist/chunks/token-service-BJqu5Xap.cjs.map +0 -1
  97. package/dist/chunks/token-service-qRSYG9uT.js.map +0 -1
  98. package/dist/chunks/web3-manager-C-JflQ86.cjs.map +0 -1
  99. package/dist/chunks/web3-manager-Dvcq4xmn.js.map +0 -1
@@ -4,10 +4,10 @@ var persShared = require('@explorins/pers-shared');
4
4
  var index = require('./index-C4K-jkRO.cjs');
5
5
  var user = require('../user.cjs');
6
6
  var userStatus = require('../user-status.cjs');
7
- var tokenService = require('./token-service-BJqu5Xap.cjs');
8
- var businessMembershipService = require('./business-membership-service-B9ItWZ2_.cjs');
7
+ var tokenService = require('./token-service-CnnrCOsg.cjs');
8
+ var businessMembershipService = require('./business-membership-service-Dkb780NX.cjs');
9
9
  var campaign = require('../campaign.cjs');
10
- var redemptionService = require('./redemption-service-Dc_0Kzd0.cjs');
10
+ var redemptionService = require('./redemption-service-KamEndzB.cjs');
11
11
  var transactionRequest_builder = require('./transaction-request.builder-D8pIzjYD.cjs');
12
12
  var paymentService = require('./payment-service-Bkw7ZXev.cjs');
13
13
  var tenantManager = require('./tenant-manager-DR5eSEJw.cjs');
@@ -504,6 +504,9 @@ class AuthService {
504
504
  * Extracts context (tenantId/businessId) from the current refresh token to ensure
505
505
  * the recovered session maintains the same context.
506
506
  *
507
+ * This is a PUBLIC method that can be called by TokenRefreshManager when internal
508
+ * refresh fails, to try external (provider token) recovery before giving up.
509
+ *
507
510
  * @returns true if session was successfully recovered
508
511
  */
509
512
  async attemptProviderTokenRecovery() {
@@ -656,6 +659,8 @@ class TokenRefreshManager {
656
659
  // Retry configuration for transient failures
657
660
  this.MAX_RETRY_ATTEMPTS = 3;
658
661
  this.RETRY_DELAY_MS = 1000;
662
+ // Active refresh promise for deduplication
663
+ this.activeRefreshPromise = null;
659
664
  }
660
665
  /**
661
666
  * Ensures the access token is valid, refreshing if needed.
@@ -756,11 +761,27 @@ class TokenRefreshManager {
756
761
  return new Promise(resolve => setTimeout(resolve, ms));
757
762
  }
758
763
  /**
759
- * @deprecated Use ensureValidToken() instead
764
+ * Attempt token refresh: internal first, then provider token fallback.
765
+ * DEDUPLICATES concurrent calls - all callers share the same promise.
760
766
  */
761
767
  async attemptInternalRefresh() {
762
- const result = await this.attemptRefreshWithRetry();
763
- return result.success;
768
+ if (this.activeRefreshPromise) {
769
+ return this.activeRefreshPromise;
770
+ }
771
+ this.activeRefreshPromise = (async () => {
772
+ const result = await this.attemptRefreshWithRetry();
773
+ if (result.success)
774
+ return result;
775
+ // Internal failed - try provider token recovery
776
+ const recovered = await this.authService.attemptProviderTokenRecovery();
777
+ return recovered ? { success: true, retryable: false } : result;
778
+ })();
779
+ try {
780
+ return await this.activeRefreshPromise;
781
+ }
782
+ finally {
783
+ this.activeRefreshPromise = null;
784
+ }
764
785
  }
765
786
  }
766
787
 
@@ -1566,7 +1587,7 @@ class DefaultAuthProvider {
1566
1587
  /** SDK package name */
1567
1588
  const SDK_NAME = "@explorins/pers-sdk";
1568
1589
  /** SDK version - injected from package.json at build time */
1569
- const SDK_VERSION = "2.1.37";
1590
+ const SDK_VERSION = "2.1.40";
1570
1591
  /** Full SDK identifier for headers */
1571
1592
  const SDK_USER_AGENT = `${SDK_NAME}/${SDK_VERSION}`;
1572
1593
 
@@ -1676,12 +1697,16 @@ class PersApiClient {
1676
1697
  }
1677
1698
  const { retryCount = 0, responseType = 'json', bypassAuth = false } = options || {};
1678
1699
  const url = `${this.apiRoot}${endpoint}`;
1679
- // SMART TOKEN VALIDATION: Only check if we suspect the token might be expired
1700
+ // TOKEN VALIDATION: Ensure token is valid before request
1701
+ // This blocks the request until token validation completes - prevents 401s from expired tokens
1680
1702
  if (!bypassAuth && this.mergedConfig.authProvider && retryCount === 0) {
1681
- // Fire-and-forget validation - don't block the request unless we know there's an issue
1682
- this.ensureValidToken().catch(error => {
1683
- console.debug('[PersApiClient] Background token validation failed:', error);
1684
- });
1703
+ try {
1704
+ await this.ensureValidToken();
1705
+ }
1706
+ catch (error) {
1707
+ console.debug('[PersApiClient] Token validation failed:', error);
1708
+ // Continue with request - it will fail with 401 and trigger retry logic
1709
+ }
1685
1710
  }
1686
1711
  const requestOptions = {
1687
1712
  headers: await this.getHeaders(!bypassAuth, method, url),
@@ -1709,49 +1734,63 @@ class PersApiClient {
1709
1734
  return result;
1710
1735
  }
1711
1736
  catch (error) {
1712
- // Error handling - proactive token refresh should prevent most 401s
1713
1737
  const status = index.ErrorUtils.getStatus(error);
1714
1738
  const errorMessage = index.ErrorUtils.getMessage(error);
1715
- // Handle 401 errors centrally through AuthService
1739
+ // Handle 401 Unauthorized errors
1716
1740
  if (status === 401) {
1717
1741
  const backendError = index.ErrorUtils.extractBackendErrorDetails(error);
1718
- // Check for FATAL auth error CODES (not just 401 status)
1719
- // Fatal codes: REFRESH_TOKEN_EXPIRED, TOKEN_REVOKED, etc. immediate logout
1720
- // Non-fatal codes: TOKEN_EXPIRED → try refresh first
1742
+ // ===========================================
1743
+ // FATAL AUTH ERRORSImmediate logout
1744
+ // ===========================================
1745
+ // Fatal codes: REFRESH_TOKEN_EXPIRED, TOKEN_REVOKED, INVALID_REFRESH_TOKEN, etc.
1721
1746
  if (this.authService.isFatalAuthError(backendError.code)) {
1722
- // Definitive auth failure - no retry, session is invalid
1747
+ console.warn(`[PersApiClient] Fatal auth error: ${backendError.code}`);
1723
1748
  await this.authService.handleAuthFailure();
1724
1749
  this.emitErrorEvent(backendError, errorMessage, endpoint, method, status, error);
1725
1750
  throw new index.AuthenticationError(errorMessage, endpoint, method, backendError);
1726
1751
  }
1727
- // If this IS a refresh request that failed with 401, don't retry to avoid infinite loop
1752
+ // ===========================================
1753
+ // REFRESH REQUEST FAILED → Logout (prevents infinite loop)
1754
+ // ===========================================
1728
1755
  if (options?.isRefreshRequest) {
1729
- // Refresh failed - this is a real auth failure
1756
+ console.warn('[PersApiClient] Refresh request itself failed with 401');
1730
1757
  await this.authService.handleAuthFailure();
1731
1758
  this.emitErrorEvent(backendError, errorMessage, endpoint, method, status, error);
1732
1759
  throw new index.AuthenticationError(errorMessage, endpoint, method, backendError);
1733
1760
  }
1734
- // TOKEN_EXPIRED or unknown 401: try refresh once, then retry
1761
+ // ===========================================
1762
+ // RETRYABLE 401 (TOKEN_EXPIRED) → Try refresh, then retry
1763
+ // ===========================================
1735
1764
  if (retryCount === 0 && this.mergedConfig.authProvider) {
1736
- try {
1737
- const refreshSuccessful = await this.refreshManager.attemptInternalRefresh();
1738
- if (refreshSuccessful) {
1739
- // Emit TOKEN_REFRESHED event so WS clients can retry if they gave up
1740
- this._events?.emitSuccess({
1741
- type: 'token_refreshed',
1742
- domain: 'authentication',
1743
- userMessage: 'Authentication token refreshed',
1744
- });
1745
- // Retry with new token
1746
- return await this.request(method, endpoint, body, { ...options, retryCount: 1 });
1747
- }
1765
+ const refreshResult = await this.refreshManager.attemptInternalRefresh();
1766
+ if (refreshResult.success) {
1767
+ // Refresh succeeded → retry request with new token
1768
+ this._events?.emitSuccess({
1769
+ type: 'token_refreshed',
1770
+ domain: 'authentication',
1771
+ userMessage: 'Authentication token refreshed',
1772
+ });
1773
+ return await this.request(method, endpoint, body, { ...options, retryCount: 1 });
1748
1774
  }
1749
- catch (refreshError) {
1750
- // Refresh failed - fall through to handleAuthFailure
1775
+ // Refresh failed - check if it's a definitive failure
1776
+ if (!refreshResult.retryable) {
1777
+ // Non-retryable failure (e.g., refresh token expired) → logout
1778
+ console.warn('[PersApiClient] Refresh failed with non-retryable error, logging out');
1779
+ await this.authService.handleAuthFailure();
1751
1780
  }
1781
+ else {
1782
+ // Retryable failure (network error, etc.) → DON'T logout, let app retry later
1783
+ console.warn('[PersApiClient] Refresh failed with retryable error, NOT logging out');
1784
+ }
1785
+ this.emitErrorEvent(backendError, errorMessage, endpoint, method, status, error);
1786
+ throw new index.AuthenticationError(errorMessage, endpoint, method, backendError);
1752
1787
  }
1753
- // All recovery attempts failed
1754
- await this.authService.handleAuthFailure();
1788
+ // ===========================================
1789
+ // RETRY FAILED (retryCount > 0) → Something wrong, but DON'T logout
1790
+ // ===========================================
1791
+ // We already refreshed successfully, but retry still got 401
1792
+ // This is unexpected - don't logout, let app investigate
1793
+ console.warn('[PersApiClient] Retry with new token still got 401 - not logging out');
1755
1794
  this.emitErrorEvent(backendError, errorMessage, endpoint, method, status, error);
1756
1795
  throw new index.AuthenticationError(errorMessage, endpoint, method, backendError);
1757
1796
  }
@@ -3264,10 +3303,11 @@ class UserStatusManager {
3264
3303
  * ```
3265
3304
  */
3266
3305
  class TokenManager {
3267
- constructor(apiClient) {
3306
+ constructor(apiClient, eventEmitter) {
3268
3307
  this.apiClient = apiClient;
3269
3308
  const tokenApi = new tokenService.TokenApi(apiClient);
3270
3309
  this.tokenService = new tokenService.TokenService(tokenApi);
3310
+ this.eventEmitter = eventEmitter;
3271
3311
  }
3272
3312
  /**
3273
3313
  * Get all available tokens
@@ -3416,16 +3456,17 @@ class TokenManager {
3416
3456
  return this.tokenService.getTokenByContractAddress(contractAddress, contractTokenId);
3417
3457
  }
3418
3458
  /**
3419
- * Get all token metadata with filtering and pagination
3459
+ * Get all token metadata with filtering, pagination, and include relations
3420
3460
  *
3421
- * Retrieves token metadata (rewards/stamps) with server-side filtering and pagination.
3461
+ * Retrieves token metadata (rewards/stamps) with server-side filtering, pagination,
3462
+ * and optional include relations for additional data.
3422
3463
  * Useful for displaying rewards (ERC1155) or stamps (ERC721) in admin tables.
3423
3464
  * Non-admin users always get active metadata only.
3424
3465
  *
3425
- * @param options - Filter and pagination options
3466
+ * @param options - Filter, pagination, and include options
3426
3467
  * @returns Promise resolving to paginated token metadata
3427
3468
  *
3428
- * @example Get paginated rewards
3469
+ * @example Get paginated rewards with counts
3429
3470
  * ```typescript
3430
3471
  * const rewards = await sdk.tokens.getTokenMetadata({
3431
3472
  * tokenType: 'ERC1155',
@@ -3433,19 +3474,26 @@ class TokenManager {
3433
3474
  * page: 1,
3434
3475
  * limit: 10,
3435
3476
  * sortBy: 'name',
3436
- * sortOrder: 'ASC'
3477
+ * sortOrder: 'ASC',
3478
+ * include: ['mintCount', 'burnCount', 'token']
3437
3479
  * });
3438
3480
  *
3439
- * console.log(`Page 1 of ${rewards.pagination.pages}`);
3440
- * rewards.data.forEach(r => console.log(r.name));
3481
+ * rewards.data.forEach(r => {
3482
+ * console.log(`${r.name}: ${r.mintCount} minted, ${r.burnCount} burned`);
3483
+ * console.log(`Contract: ${r.included?.token?.contractAddress}`);
3484
+ * });
3441
3485
  * ```
3442
3486
  *
3443
- * @example Get stamps with search
3487
+ * @example Get stamps with owner business
3444
3488
  * ```typescript
3445
3489
  * const stamps = await sdk.tokens.getTokenMetadata({
3446
3490
  * tokenType: 'ERC721',
3447
3491
  * search: 'gold',
3448
- * limit: 25
3492
+ * include: ['ownerBusiness', 'token']
3493
+ * });
3494
+ *
3495
+ * stamps.data.forEach(s => {
3496
+ * console.log(`${s.name} owned by ${s.included?.ownerBusiness?.displayName}`);
3449
3497
  * });
3450
3498
  * ```
3451
3499
  */
@@ -3453,31 +3501,27 @@ class TokenManager {
3453
3501
  return this.tokenService.getTokenMetadata(options);
3454
3502
  }
3455
3503
  /**
3456
- * Get rewards (ERC1155 token metadata) with filtering and pagination
3504
+ * Get rewards (ERC1155 token metadata) with filtering, pagination, and include relations
3457
3505
  *
3458
3506
  * Convenience method for fetching reward metadata. Rewards are ERC1155 tokens
3459
3507
  * that represent collectible items, vouchers, or other redeemable rewards.
3460
3508
  *
3461
- * @param options - Filter and pagination options (tokenType is set automatically)
3509
+ * @param options - Filter, pagination, and include options (tokenType is set automatically)
3462
3510
  * @returns Promise resolving to paginated reward metadata
3463
3511
  *
3464
- * @example Get active rewards
3512
+ * @example Get active rewards with mint counts
3465
3513
  * ```typescript
3466
3514
  * const rewards = await sdk.tokens.getRewards({
3467
3515
  * active: true,
3468
- * limit: 10
3516
+ * limit: 10,
3517
+ * include: ['mintCount', 'burnCount', 'token', 'ownerBusiness']
3469
3518
  * });
3470
3519
  *
3471
- * console.log(`Found ${rewards.pagination.total} rewards`);
3472
- * rewards.data.forEach(r => console.log(`${r.name}: ${r.description}`));
3473
- * ```
3474
- *
3475
- * @example Search rewards
3476
- * ```typescript
3477
- * const discountRewards = await sdk.tokens.getRewards({
3478
- * search: 'discount',
3479
- * sortBy: 'name',
3480
- * sortOrder: 'ASC'
3520
+ * rewards.data.forEach(r => {
3521
+ * console.log(`${r.name}: ${r.mintCount ?? 0} minted`);
3522
+ * if (r.included?.token) {
3523
+ * console.log(` Chain: ${r.included.token.chainId}, Contract: ${r.included.token.contractAddress}`);
3524
+ * }
3481
3525
  * });
3482
3526
  * ```
3483
3527
  */
@@ -3485,31 +3529,27 @@ class TokenManager {
3485
3529
  return this.tokenService.getRewards(options);
3486
3530
  }
3487
3531
  /**
3488
- * Get stamps (ERC721 token metadata) with filtering and pagination
3532
+ * Get stamps (ERC721 token metadata) with filtering, pagination, and include relations
3489
3533
  *
3490
3534
  * Convenience method for fetching stamp metadata. Stamps are ERC721 tokens
3491
3535
  * that represent achievements, badges, or collectible status markers.
3492
3536
  *
3493
- * @param options - Filter and pagination options (tokenType is set automatically)
3537
+ * @param options - Filter, pagination, and include options (tokenType is set automatically)
3494
3538
  * @returns Promise resolving to paginated stamp metadata
3495
3539
  *
3496
- * @example Get active stamps
3540
+ * @example Get active stamps with all includes
3497
3541
  * ```typescript
3498
3542
  * const stamps = await sdk.tokens.getStamps({
3499
3543
  * active: true,
3500
- * limit: 10
3544
+ * limit: 10,
3545
+ * include: ['mintCount', 'burnCount', 'token', 'ownerBusiness']
3501
3546
  * });
3502
3547
  *
3503
- * console.log(`Found ${stamps.pagination.total} stamps`);
3504
- * stamps.data.forEach(s => console.log(`${s.name}: ${s.description}`));
3505
- * ```
3506
- *
3507
- * @example Filter stamps by tags
3508
- * ```typescript
3509
- * const goldStamps = await sdk.tokens.getStamps({
3510
- * tags: ['gold', 'premium'],
3511
- * sortBy: 'createdAt',
3512
- * sortOrder: 'DESC'
3548
+ * stamps.data.forEach(s => {
3549
+ * console.log(`${s.name}: ${s.mintCount ?? 0} minted`);
3550
+ * if (s.included?.ownerBusiness) {
3551
+ * console.log(` Owner: ${s.included.ownerBusiness.displayName}`);
3552
+ * }
3513
3553
  * });
3514
3554
  * ```
3515
3555
  */
@@ -3607,6 +3647,32 @@ class TokenManager {
3607
3647
  async toggleTokenActive(tokenId) {
3608
3648
  return this.tokenService.toggleTokenActive(tokenId);
3609
3649
  }
3650
+ /**
3651
+ * Admin: Delete token metadata (soft delete)
3652
+ *
3653
+ * Soft deletes token metadata by setting deletedAt timestamp.
3654
+ * Requires administrator privileges. Will fail with 409 Conflict
3655
+ * if metadata is currently in use by active campaigns or redemptions.
3656
+ *
3657
+ * @param metadataId - ID of the token metadata to delete
3658
+ * @throws {PersApiError} When not authenticated as admin
3659
+ * @throws {PersApiError} 409 Conflict if metadata is in use
3660
+ *
3661
+ * @example
3662
+ * ```typescript
3663
+ * try {
3664
+ * await sdk.tokens.deleteTokenMetadata('metadata-123');
3665
+ * console.log('Token metadata deleted');
3666
+ * } catch (error) {
3667
+ * if (error.statusCode === 409) {
3668
+ * console.log('Cannot delete: metadata is used by campaigns/redemptions');
3669
+ * }
3670
+ * }
3671
+ * ```
3672
+ */
3673
+ async deleteTokenMetadata(metadataId) {
3674
+ return this.tokenService.deleteTokenMetadata(metadataId);
3675
+ }
3610
3676
  /**
3611
3677
  * Get the full token SDK for advanced operations
3612
3678
  *
@@ -6000,6 +6066,21 @@ class RedemptionManager {
6000
6066
  async deleteRedemptionType(id) {
6001
6067
  return this.redemptionService.deleteRedemptionType(id);
6002
6068
  }
6069
+ /**
6070
+ * Delete a redemption (soft delete)
6071
+ *
6072
+ * @param id - Redemption ID to delete
6073
+ * @returns Promise resolving to true if deleted successfully
6074
+ *
6075
+ * @example
6076
+ * ```typescript
6077
+ * const success = await sdk.redemptions.deleteRedemption('redemption-123');
6078
+ * console.log('Deleted:', success);
6079
+ * ```
6080
+ */
6081
+ async deleteRedemption(id) {
6082
+ return this.redemptionService.deleteRedemption(id);
6083
+ }
6003
6084
  /**
6004
6085
  * Get the full redemption service for advanced operations
6005
6086
  *
@@ -10470,7 +10551,7 @@ class PersSDK {
10470
10551
  */
10471
10552
  get tokens() {
10472
10553
  if (!this._tokens) {
10473
- this._tokens = new TokenManager(this.apiClient);
10554
+ this._tokens = new TokenManager(this.apiClient, this._events);
10474
10555
  }
10475
10556
  return this._tokens;
10476
10557
  }
@@ -10869,4 +10950,4 @@ exports.createPersEventsClient = createPersEventsClient;
10869
10950
  exports.createPersSDK = createPersSDK;
10870
10951
  exports.isFatalAuthErrorInMessage = isFatalAuthErrorInMessage;
10871
10952
  exports.mergeWithDefaults = mergeWithDefaults;
10872
- //# sourceMappingURL=pers-sdk-DemghJ3a.cjs.map
10953
+ //# sourceMappingURL=pers-sdk-CBvzmlL_.cjs.map