@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.
- package/dist/business/api/business-api.d.ts +4 -0
- package/dist/business/api/business-api.d.ts.map +1 -1
- package/dist/business/index.d.ts +1 -1
- package/dist/business/index.d.ts.map +1 -1
- package/dist/business.cjs +1 -1
- package/dist/business.js +1 -1
- package/dist/chunks/{base-token-service-BGuuZX4b.js → base-token-service-N1gwRD8N.js} +2 -2
- package/dist/chunks/{base-token-service-BGuuZX4b.js.map → base-token-service-N1gwRD8N.js.map} +1 -1
- package/dist/chunks/{base-token-service-DSye0WD2.cjs → base-token-service-W7TU23qU.cjs} +2 -2
- package/dist/chunks/{base-token-service-DSye0WD2.cjs.map → base-token-service-W7TU23qU.cjs.map} +1 -1
- package/dist/chunks/{business-membership-service-B9ItWZ2_.cjs → business-membership-service-Dkb780NX.cjs} +21 -1
- package/dist/chunks/business-membership-service-Dkb780NX.cjs.map +1 -0
- package/dist/chunks/{business-membership-service-CPcE-AW0.js → business-membership-service-NLoqoFpG.js} +21 -1
- package/dist/chunks/business-membership-service-NLoqoFpG.js.map +1 -0
- package/dist/chunks/{pers-sdk-DemghJ3a.cjs → pers-sdk-CBvzmlL_.cjs} +158 -77
- package/dist/chunks/pers-sdk-CBvzmlL_.cjs.map +1 -0
- package/dist/chunks/{pers-sdk-Dds2lB27.js → pers-sdk-DuDWwRWC.js} +158 -77
- package/dist/chunks/pers-sdk-DuDWwRWC.js.map +1 -0
- package/dist/chunks/{redemption-service-Dc_0Kzd0.cjs → redemption-service-KamEndzB.cjs} +7 -1
- package/dist/chunks/{redemption-service-Dc_0Kzd0.cjs.map → redemption-service-KamEndzB.cjs.map} +1 -1
- package/dist/chunks/{redemption-service-DWhZgrZT.js → redemption-service-w0GMdF0m.js} +7 -1
- package/dist/chunks/{redemption-service-DWhZgrZT.js.map → redemption-service-w0GMdF0m.js.map} +1 -1
- package/dist/chunks/{token-service-qRSYG9uT.js → token-service-BcuDj292.js} +79 -14
- package/dist/chunks/token-service-BcuDj292.js.map +1 -0
- package/dist/chunks/{token-service-BJqu5Xap.cjs → token-service-CnnrCOsg.cjs} +79 -14
- package/dist/chunks/token-service-CnnrCOsg.cjs.map +1 -0
- package/dist/chunks/{web3-manager-Dvcq4xmn.js → web3-manager-B-IsluxI.js} +770 -34
- package/dist/chunks/web3-manager-B-IsluxI.js.map +1 -0
- package/dist/chunks/{web3-manager-C-JflQ86.cjs → web3-manager-NJaeBrci.cjs} +770 -32
- package/dist/chunks/web3-manager-NJaeBrci.cjs.map +1 -0
- package/dist/core/auth/refresh-manager.d.ts +12 -2
- package/dist/core/auth/refresh-manager.d.ts.map +1 -1
- package/dist/core/auth/services/auth-service.d.ts +4 -1
- package/dist/core/auth/services/auth-service.d.ts.map +1 -1
- package/dist/core/pers-api-client.d.ts.map +1 -1
- package/dist/core.cjs +4 -4
- package/dist/core.js +4 -4
- package/dist/index.cjs +5 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/managers/redemption-manager.d.ts +13 -0
- package/dist/managers/redemption-manager.d.ts.map +1 -1
- package/dist/managers/token-manager.d.ts +66 -40
- package/dist/managers/token-manager.d.ts.map +1 -1
- package/dist/managers/web3-manager.d.ts +69 -1
- package/dist/managers/web3-manager.d.ts.map +1 -1
- package/dist/node.cjs +4 -4
- package/dist/node.js +4 -4
- package/dist/package.json +3 -3
- package/dist/redemption/services/redemption-service.d.ts +4 -0
- package/dist/redemption/services/redemption-service.d.ts.map +1 -1
- package/dist/redemption.cjs +1 -1
- package/dist/redemption.js +1 -1
- package/dist/token/api/token-api.d.ts +50 -12
- package/dist/token/api/token-api.d.ts.map +1 -1
- package/dist/token/index.d.ts +1 -1
- package/dist/token/index.d.ts.map +1 -1
- package/dist/token/services/token-service.d.ts +40 -9
- package/dist/token/services/token-service.d.ts.map +1 -1
- package/dist/token.cjs +2 -2
- package/dist/token.js +2 -2
- package/dist/trigger-source/api/trigger-source-api.d.ts +9 -10
- package/dist/trigger-source/api/trigger-source-api.d.ts.map +1 -1
- package/dist/trigger-source/index.d.ts +1 -0
- package/dist/trigger-source/index.d.ts.map +1 -1
- package/dist/trigger-source/models/index.d.ts +5 -13
- package/dist/trigger-source/models/index.d.ts.map +1 -1
- package/dist/trigger-source/services/trigger-source-service.d.ts +3 -11
- package/dist/trigger-source/services/trigger-source-service.d.ts.map +1 -1
- package/dist/trigger-source.cjs +20 -1
- package/dist/trigger-source.cjs.map +1 -1
- package/dist/trigger-source.js +20 -1
- package/dist/trigger-source.js.map +1 -1
- package/dist/web3/domain/services/balance-manager.d.ts +160 -0
- package/dist/web3/domain/services/balance-manager.d.ts.map +1 -0
- package/dist/web3/domain/services/index.d.ts +2 -0
- package/dist/web3/domain/services/index.d.ts.map +1 -1
- package/dist/web3/domain/services/token-collection-manager.d.ts +155 -0
- package/dist/web3/domain/services/token-collection-manager.d.ts.map +1 -0
- package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
- package/dist/web3/index.d.ts +1 -0
- package/dist/web3/index.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/web3-api.d.ts +16 -0
- package/dist/web3/infrastructure/api/web3-api.d.ts.map +1 -1
- package/dist/web3-manager.cjs +1 -1
- package/dist/web3-manager.js +1 -1
- package/dist/web3.cjs +4 -2
- package/dist/web3.cjs.map +1 -1
- package/dist/web3.js +2 -2
- package/package.json +3 -3
- package/dist/chunks/business-membership-service-B9ItWZ2_.cjs.map +0 -1
- package/dist/chunks/business-membership-service-CPcE-AW0.js.map +0 -1
- package/dist/chunks/pers-sdk-Dds2lB27.js.map +0 -1
- package/dist/chunks/pers-sdk-DemghJ3a.cjs.map +0 -1
- package/dist/chunks/token-service-BJqu5Xap.cjs.map +0 -1
- package/dist/chunks/token-service-qRSYG9uT.js.map +0 -1
- package/dist/chunks/web3-manager-C-JflQ86.cjs.map +0 -1
- 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-
|
|
8
|
-
var businessMembershipService = require('./business-membership-service-
|
|
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-
|
|
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
|
-
*
|
|
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
|
-
|
|
763
|
-
|
|
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.
|
|
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
|
-
//
|
|
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
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
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
|
|
1739
|
+
// Handle 401 Unauthorized errors
|
|
1716
1740
|
if (status === 401) {
|
|
1717
1741
|
const backendError = index.ErrorUtils.extractBackendErrorDetails(error);
|
|
1718
|
-
//
|
|
1719
|
-
//
|
|
1720
|
-
//
|
|
1742
|
+
// ===========================================
|
|
1743
|
+
// FATAL AUTH ERRORS → Immediate logout
|
|
1744
|
+
// ===========================================
|
|
1745
|
+
// Fatal codes: REFRESH_TOKEN_EXPIRED, TOKEN_REVOKED, INVALID_REFRESH_TOKEN, etc.
|
|
1721
1746
|
if (this.authService.isFatalAuthError(backendError.code)) {
|
|
1722
|
-
|
|
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
|
-
//
|
|
1752
|
+
// ===========================================
|
|
1753
|
+
// REFRESH REQUEST FAILED → Logout (prevents infinite loop)
|
|
1754
|
+
// ===========================================
|
|
1728
1755
|
if (options?.isRefreshRequest) {
|
|
1729
|
-
|
|
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
|
-
//
|
|
1761
|
+
// ===========================================
|
|
1762
|
+
// RETRYABLE 401 (TOKEN_EXPIRED) → Try refresh, then retry
|
|
1763
|
+
// ===========================================
|
|
1735
1764
|
if (retryCount === 0 && this.mergedConfig.authProvider) {
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
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
|
-
|
|
1750
|
-
|
|
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
|
-
//
|
|
1754
|
-
|
|
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
|
|
3459
|
+
* Get all token metadata with filtering, pagination, and include relations
|
|
3420
3460
|
*
|
|
3421
|
-
* Retrieves token metadata (rewards/stamps) with server-side filtering
|
|
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
|
|
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
|
-
*
|
|
3440
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
3472
|
-
*
|
|
3473
|
-
*
|
|
3474
|
-
*
|
|
3475
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
3504
|
-
*
|
|
3505
|
-
*
|
|
3506
|
-
*
|
|
3507
|
-
*
|
|
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-
|
|
10953
|
+
//# sourceMappingURL=pers-sdk-CBvzmlL_.cjs.map
|