@explorins/pers-sdk-react-native 1.5.35 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +402 -13
  2. package/dist/hooks/index.d.ts +3 -1
  3. package/dist/hooks/index.d.ts.map +1 -1
  4. package/dist/hooks/index.js +1 -0
  5. package/dist/hooks/useBusiness.d.ts +5 -5
  6. package/dist/hooks/useBusiness.d.ts.map +1 -1
  7. package/dist/hooks/useCampaigns.d.ts +8 -8
  8. package/dist/hooks/useCampaigns.d.ts.map +1 -1
  9. package/dist/hooks/useCampaigns.js +3 -3
  10. package/dist/hooks/useDonations.d.ts +2 -2
  11. package/dist/hooks/useDonations.d.ts.map +1 -1
  12. package/dist/hooks/useEvents.d.ts +178 -0
  13. package/dist/hooks/useEvents.d.ts.map +1 -0
  14. package/dist/hooks/useEvents.js +312 -0
  15. package/dist/hooks/usePurchases.d.ts +3 -3
  16. package/dist/hooks/usePurchases.d.ts.map +1 -1
  17. package/dist/hooks/useRedemptions.d.ts +6 -5
  18. package/dist/hooks/useRedemptions.d.ts.map +1 -1
  19. package/dist/hooks/useRedemptions.js +13 -19
  20. package/dist/hooks/useTenants.d.ts +2 -2
  21. package/dist/hooks/useTenants.d.ts.map +1 -1
  22. package/dist/hooks/useTokens.d.ts +4 -4
  23. package/dist/hooks/useTokens.d.ts.map +1 -1
  24. package/dist/hooks/useTransactionSigner.d.ts +2 -0
  25. package/dist/hooks/useTransactionSigner.d.ts.map +1 -1
  26. package/dist/hooks/useTransactionSigner.js +68 -0
  27. package/dist/hooks/useTransactions.d.ts +3 -3
  28. package/dist/hooks/useTransactions.d.ts.map +1 -1
  29. package/dist/hooks/useUserStatus.d.ts +3 -3
  30. package/dist/hooks/useUserStatus.d.ts.map +1 -1
  31. package/dist/hooks/useUsers.d.ts +3 -3
  32. package/dist/hooks/useUsers.d.ts.map +1 -1
  33. package/dist/hooks/useWeb3.d.ts +5 -53
  34. package/dist/hooks/useWeb3.d.ts.map +1 -1
  35. package/dist/hooks/useWeb3.js +82 -177
  36. package/dist/index.d.ts +83 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +3227 -837
  39. package/dist/index.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/hooks/index.ts +3 -1
  42. package/src/hooks/useBusiness.ts +5 -5
  43. package/src/hooks/useCampaigns.ts +12 -11
  44. package/src/hooks/useDonations.ts +2 -2
  45. package/src/hooks/useEvents.ts +360 -0
  46. package/src/hooks/usePurchases.ts +3 -3
  47. package/src/hooks/useRedemptions.ts +16 -22
  48. package/src/hooks/useTenants.ts +2 -2
  49. package/src/hooks/useTokens.ts +4 -4
  50. package/src/hooks/useTransactionSigner.ts +73 -0
  51. package/src/hooks/useTransactions.ts +4 -3
  52. package/src/hooks/useUserStatus.ts +3 -3
  53. package/src/hooks/useUsers.ts +3 -3
  54. package/src/hooks/useWeb3.ts +98 -202
  55. package/src/index.ts +105 -2
@@ -338,6 +338,63 @@ export const useTransactionSigner = () => {
338
338
  throw error; // Re-throw to maintain error handling upstream
339
339
  }
340
340
  }, [isSignerInitialized]);
341
+ /**
342
+ * Sign a PERS transaction without submitting (for POS flows with QR codes)
343
+ *
344
+ * This method signs the transaction but does NOT submit it to the blockchain.
345
+ * Instead, it returns the signature which can be displayed as a QR code for
346
+ * the business to scan and submit.
347
+ *
348
+ * **Use Case:** Point-of-Sale (POS) flows where:
349
+ * 1. User signs the transaction
350
+ * 2. App generates QR code with signature
351
+ * 3. Business scans QR code
352
+ * 4. Business submits transaction to blockchain
353
+ *
354
+ * @param {string} jwt - JWT token with transaction and user data
355
+ * @param {StatusCallback} [onStatusUpdate] - Optional callback for status updates
356
+ * @returns {Promise<TransactionSigningResult>} Signing result with signature for QR code
357
+ *
358
+ * @example
359
+ * ```typescript
360
+ * const { signPersTransaction } = useTransactionSigner();
361
+ *
362
+ * const result = await signPersTransaction(jwtToken);
363
+ * if (result.success) {
364
+ * const qrData = {
365
+ * transactionId: result.transactionId,
366
+ * signature: result.signature,
367
+ * transactionFormat: result.signingData.format,
368
+ * txType: 'PENDING_SUBMISSION'
369
+ * };
370
+ * // Display QR code with qrData
371
+ * }
372
+ * ```
373
+ */
374
+ const signPersTransaction = useCallback(async (jwt, onStatusUpdate) => {
375
+ if (!isSignerInitialized || !signerSDKRef.current) {
376
+ throw new Error('Signer SDK not initialized');
377
+ }
378
+ // Create status callback wrapper
379
+ const statusCallback = {
380
+ onStatusUpdate: (status, message, data) => {
381
+ setCurrentStatus(status);
382
+ setStatusMessage(message);
383
+ onStatusUpdate?.(status, message, data);
384
+ }
385
+ };
386
+ try {
387
+ // Use the SDK's sign-only method
388
+ const signingResult = await signerSDKRef.current.signPersTransaction(jwt, statusCallback);
389
+ return signingResult;
390
+ }
391
+ catch (error) {
392
+ console.error('[useTransactionSigner] Sign-only transaction failed:', error);
393
+ setCurrentStatus(SigningStatus.ERROR);
394
+ setStatusMessage(error instanceof Error ? error.message : 'Signing failed');
395
+ throw error;
396
+ }
397
+ }, [isSignerInitialized]);
341
398
  return {
342
399
  /**
343
400
  * Sign and submit a blockchain transaction using JWT token
@@ -350,6 +407,17 @@ export const useTransactionSigner = () => {
350
407
  * @returns {Promise<SubmissionResult>} Transaction result with hash and status
351
408
  */
352
409
  signAndSubmitTransactionWithJWT,
410
+ /**
411
+ * Sign a transaction without submitting (for POS flows)
412
+ *
413
+ * Signs the transaction and returns the signature without submitting to blockchain.
414
+ * Use this for Point-of-Sale flows where the business scans a QR code and submits.
415
+ *
416
+ * @param {string} jwt - JWT token with transaction and user data
417
+ * @param {StatusCallback} [onStatusUpdate] - Optional callback for status updates
418
+ * @returns {Promise<TransactionSigningResult>} Signing result with signature for QR code
419
+ */
420
+ signPersTransaction,
353
421
  /**
354
422
  * Whether the transaction signer SDK has been successfully initialized
355
423
  *
@@ -1,5 +1,5 @@
1
1
  import { OnStatusUpdateFn } from './useTransactionSigner';
2
- import type { TransactionRequestDTO, TransactionRequestResponseDTO, TransactionDTO, TransactionRole, TransactionPaginationRequestDTO } from '@explorins/pers-shared';
2
+ import type { TransactionRequestDTO, TransactionRequestResponseDTO, TransactionDTO, TransactionRole, TransactionPaginationRequestDTO, PaginatedResponseDTO } from '@explorins/pers-shared';
3
3
  /**
4
4
  * React hook for transaction operations in the PERS SDK
5
5
  *
@@ -39,8 +39,8 @@ import type { TransactionRequestDTO, TransactionRequestResponseDTO, TransactionD
39
39
  export declare const useTransactions: () => {
40
40
  createTransaction: (request: TransactionRequestDTO, onStatusUpdate?: OnStatusUpdateFn) => Promise<TransactionRequestResponseDTO>;
41
41
  getTransactionById: (transactionId: string) => Promise<TransactionDTO | null>;
42
- getUserTransactionHistory: (role?: TransactionRole) => Promise<TransactionDTO[]>;
43
- getTenantTransactions: () => Promise<TransactionDTO[]>;
42
+ getUserTransactionHistory: (role?: TransactionRole) => Promise<PaginatedResponseDTO<TransactionDTO>>;
43
+ getTenantTransactions: () => Promise<PaginatedResponseDTO<TransactionDTO>>;
44
44
  getPaginatedTransactions: (params: TransactionPaginationRequestDTO) => Promise<any>;
45
45
  exportTransactionsCSV: () => Promise<Blob>;
46
46
  isAvailable: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactions.d.ts","sourceRoot":"","sources":["../../src/hooks/useTransactions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,cAAc,EACd,eAAe,EACf,+BAA+B,EAChC,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,eAAe;iCAgC4B,qBAAqB,mBAAmB,gBAAgB,KAAG,QAAQ,6BAA6B,CAAC;wCA2D1F,MAAM,KAAG,QAAQ,cAAc,GAAG,IAAI,CAAC;uCA4BxC,eAAe,KAAG,QAAQ,cAAc,EAAE,CAAC;iCAenD,QAAQ,cAAc,EAAE,CAAC;uCAcjB,+BAA+B,KAAG,QAAQ,GAAG,CAAC;iCActD,QAAQ,IAAI,CAAC;;;;CA0BlE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC"}
1
+ {"version":3,"file":"useTransactions.d.ts","sourceRoot":"","sources":["../../src/hooks/useTransactions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,cAAc,EACd,eAAe,EACf,+BAA+B,EAC/B,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,eAAe;iCAgC4B,qBAAqB,mBAAmB,gBAAgB,KAAG,QAAQ,6BAA6B,CAAC;wCA2D1F,MAAM,KAAG,QAAQ,cAAc,GAAG,IAAI,CAAC;uCA4BxC,eAAe,KAAG,QAAQ,qBAAqB,cAAc,CAAC,CAAC;iCAevE,QAAQ,qBAAqB,cAAc,CAAC,CAAC;uCAcrC,+BAA+B,KAAG,QAAQ,GAAG,CAAC;iCActD,QAAQ,IAAI,CAAC;;;;CA0BlE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { UserStatusTypeDTO } from '@explorins/pers-shared';
1
+ import type { UserStatusTypeDTO, PaginatedResponseDTO } from '@explorins/pers-shared';
2
2
  export declare const useUserStatus: () => {
3
- getUserStatusTypes: () => Promise<UserStatusTypeDTO[]>;
4
- getEarnedUserStatus: () => Promise<UserStatusTypeDTO[]>;
3
+ getUserStatusTypes: () => Promise<PaginatedResponseDTO<UserStatusTypeDTO>>;
4
+ getEarnedUserStatus: () => Promise<PaginatedResponseDTO<UserStatusTypeDTO>>;
5
5
  createUserStatusType: (userStatusType: UserStatusTypeDTO) => Promise<UserStatusTypeDTO>;
6
6
  isAvailable: boolean;
7
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useUserStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useUserStatus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,eAAO,MAAM,aAAa;8BAGyB,QAAQ,iBAAiB,EAAE,CAAC;+BAc3B,QAAQ,iBAAiB,EAAE,CAAC;2CAkBd,iBAAiB,KAAG,QAAQ,iBAAiB,CAAC;;CAoB/G,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"useUserStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useUserStatus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,eAAO,MAAM,aAAa;8BAGyB,QAAQ,qBAAqB,iBAAiB,CAAC,CAAC;+BAc/C,QAAQ,qBAAqB,iBAAiB,CAAC,CAAC;2CAkBlC,iBAAiB,KAAG,QAAQ,iBAAiB,CAAC;;CAoB/G,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { UserDTO, UserCreateRequestDTO } from '@explorins/pers-shared';
1
+ import type { UserDTO, UserCreateRequestDTO, PaginatedResponseDTO } from '@explorins/pers-shared';
2
2
  import type { UserPublicProfileDTO } from '@explorins/pers-sdk/user';
3
3
  export declare const useUsers: () => {
4
4
  getCurrentUser: () => Promise<UserDTO>;
@@ -7,8 +7,8 @@ export declare const useUsers: () => {
7
7
  getAllUsersPublic: (filter?: {
8
8
  key: string;
9
9
  value: string;
10
- }) => Promise<UserPublicProfileDTO[]>;
11
- getAllUsers: () => Promise<UserDTO[]>;
10
+ }) => Promise<PaginatedResponseDTO<UserPublicProfileDTO>>;
11
+ getAllUsers: () => Promise<PaginatedResponseDTO<UserDTO>>;
12
12
  updateUser: (userId: string, userData: UserCreateRequestDTO) => Promise<UserDTO>;
13
13
  toggleUserStatus: (user: UserDTO) => Promise<UserDTO>;
14
14
  isAvailable: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useUsers.d.ts","sourceRoot":"","sources":["../../src/hooks/useUsers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,eAAO,MAAM,QAAQ;0BAG0B,QAAQ,OAAO,CAAC;kCAiBN,oBAAoB,KAAG,QAAQ,OAAO,CAAC;0BAiB/C,MAAM,KAAG,QAAQ,OAAO,CAAC;iCAclB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAG,QAAQ,oBAAoB,EAAE,CAAC;uBAe5E,QAAQ,OAAO,EAAE,CAAC;yBAcd,MAAM,YAAY,oBAAoB,KAAG,QAAQ,OAAO,CAAC;6BAcrD,OAAO,KAAG,QAAQ,OAAO,CAAC;;CAwB7E,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"useUsers.d.ts","sourceRoot":"","sources":["../../src/hooks/useUsers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,eAAO,MAAM,QAAQ;0BAG0B,QAAQ,OAAO,CAAC;kCAiBN,oBAAoB,KAAG,QAAQ,OAAO,CAAC;0BAiB/C,MAAM,KAAG,QAAQ,OAAO,CAAC;iCAclB;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAG,QAAQ,qBAAqB,oBAAoB,CAAC,CAAC;uBAehG,QAAQ,qBAAqB,OAAO,CAAC,CAAC;yBAclC,MAAM,YAAY,oBAAoB,KAAG,QAAQ,OAAO,CAAC;6BAcrD,OAAO,KAAG,QAAQ,OAAO,CAAC;;CAwB7E,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC"}
@@ -1,17 +1,8 @@
1
1
  import type { TokenBalance, TokenBalanceRequest, TokenCollectionRequest, TokenCollection, TokenMetadata } from '@explorins/pers-sdk/web3';
2
2
  import type { ChainData } from '@explorins/pers-sdk/web3-chain';
3
3
  import type { TokenDTO } from '@explorins/pers-shared';
4
- /**
5
- * Result of getting user's owned tokens from a contract
6
- */
7
- export interface UserOwnedTokensResult {
8
- /** The token definition (contains contract info, ABI, metadata definitions) */
9
- token: TokenDTO;
10
- /** Array of token balances the user owns (filtered to hasBalance: true) */
11
- ownedTokens: readonly TokenBalance[];
12
- /** Total count of owned tokens */
13
- totalOwned: number;
14
- }
4
+ import type { AccountOwnedTokensResult } from '@explorins/pers-sdk';
5
+ export type { AccountOwnedTokensResult } from '@explorins/pers-sdk';
15
6
  /**
16
7
  * React hook for Web3 operations in the PERS SDK
17
8
  *
@@ -21,48 +12,9 @@ export interface UserOwnedTokensResult {
21
12
  *
22
13
  * Note: Wallet addresses should be obtained from `user.wallets` via `usePersSDK()`.
23
14
  *
24
- * ## ERC-1155 Token Handling
25
- *
26
- * **IMPORTANT**: ERC-1155 tokens require specific `tokenIds` to query balances.
27
- * Unlike ERC-721, you cannot enumerate owned tokens - you must know which tokenId to check.
28
- *
29
- * The tokenIds come from `TokenDTO.metadata[].tokenMetadataIncrementalId`.
30
- *
31
- * ### Option 1: Use the helper method (Recommended)
32
- * ```typescript
33
- * const { getUserOwnedTokensFromContract } = useWeb3();
34
- * const { getRewardTokens } = useTokens();
35
- *
36
- * const rewardTokens = await getRewardTokens();
37
- * const result = await getUserOwnedTokensFromContract(walletAddress, rewardTokens[0]);
38
- * console.log('Owned rewards:', result.ownedTokens);
39
- * ```
40
- *
41
- * ### Option 2: Manual tokenIds extraction
42
- * ```typescript
43
- * const { getTokenCollection, extractTokenIds } = useWeb3();
44
- * const { getRewardTokens } = useTokens();
45
- *
46
- * const rewardTokens = await getRewardTokens();
47
- * const rewardToken = rewardTokens[0];
48
- *
49
- * // Extract tokenIds for ERC-1155
50
- * const tokenIds = extractTokenIds(rewardToken);
51
- *
52
- * const collection = await getTokenCollection({
53
- * accountAddress: walletAddress,
54
- * contractAddress: rewardToken.contractAddress,
55
- * abi: rewardToken.abi,
56
- * chainId: rewardToken.chainId,
57
- * tokenIds: tokenIds // Required for ERC-1155!
58
- * });
59
- *
60
- * const ownedTokens = collection.tokens.filter(t => t.hasBalance);
61
- * ```
62
- *
63
15
  * @returns Web3 hook with methods for blockchain operations
64
16
  *
65
- * @example Basic Usage
17
+ * @example
66
18
  * ```typescript
67
19
  * function Web3Component() {
68
20
  * const { user } = usePersSDK();
@@ -110,8 +62,8 @@ export declare const useWeb3: () => {
110
62
  getChainDataById: (chainId: number) => Promise<ChainData | null>;
111
63
  getExplorerUrl: (chainId: number, address: string, type: 'address' | 'tx') => Promise<string>;
112
64
  extractTokenIds: (token: TokenDTO) => string[] | undefined;
113
- getUserOwnedTokensFromContract: (walletAddress: string, token: TokenDTO, maxTokens?: number) => Promise<UserOwnedTokensResult>;
114
- buildCollectionRequest: (walletAddress: string, token: TokenDTO, maxTokens?: number) => TokenCollectionRequest;
65
+ getAccountOwnedTokensFromContract: (accountAddress: string, token: TokenDTO, maxTokens?: number) => Promise<AccountOwnedTokensResult>;
66
+ buildCollectionRequest: (accountAddress: string, token: TokenDTO, maxTokens?: number) => TokenCollectionRequest;
115
67
  isAvailable: boolean;
116
68
  };
117
69
  export type Web3Hook = ReturnType<typeof useWeb3>;
@@ -1 +1 @@
1
- {"version":3,"file":"useWeb3.d.ts","sourceRoot":"","sources":["../../src/hooks/useWeb3.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,aAAa,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,KAAK,EAAE,QAAQ,CAAC;IAChB,2EAA2E;IAC3E,WAAW,EAAE,SAAS,YAAY,EAAE,CAAC;IACrC,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwFG;AACH,eAAO,MAAM,OAAO;+BA0BkC,mBAAmB,KAAG,QAAQ,YAAY,CAAC;gCAiC1C,mBAAmB,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;kCAcjD,sBAAsB,KAAG,QAAQ,eAAe,CAAC;0BAgKzD,MAAM,WAAW,MAAM,KAAG,QAAQ,MAAM,CAAC;wCAc3B,MAAM,WAAW,MAAM,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;gCAc/D,MAAM,KAAG,QAAQ,SAAS,GAAG,IAAI,CAAC;8BAcpC,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI,KAAG,QAAQ,MAAM,CAAC;6BAhKxE,QAAQ,KAAG,MAAM,EAAE,GAAG,SAAS;oDA6C1D,MAAM,SACd,QAAQ,cACJ,MAAM,KAChB,QAAQ,qBAAqB,CAAC;4CAwDhB,MAAM,SACd,QAAQ,cACJ,MAAM,KAChB,sBAAsB;;CAmF1B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"useWeb3.d.ts","sourceRoot":"","sources":["../../src/hooks/useWeb3.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,aAAa,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,eAAO,MAAM,OAAO;+BA0BkC,mBAAmB,KAAG,QAAQ,YAAY,CAAC;gCAiC1C,mBAAmB,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;kCAcjD,sBAAsB,KAAG,QAAQ,eAAe,CAAC;0BAczD,MAAM,WAAW,MAAM,KAAG,QAAQ,MAAM,CAAC;wCAc3B,MAAM,WAAW,MAAM,KAAG,QAAQ,aAAa,GAAG,IAAI,CAAC;gCAc/D,MAAM,KAAG,QAAQ,SAAS,GAAG,IAAI,CAAC;8BAcpC,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI,KAAG,QAAQ,MAAM,CAAC;6BAiCxE,QAAQ,KAAG,MAAM,EAAE,GAAG,SAAS;wDAuCzD,MAAM,SACf,QAAQ,cACJ,MAAM,KAChB,QAAQ,wBAAwB,CAAC;6CAqBlB,MAAM,SACf,QAAQ,cACJ,MAAM,KAChB,sBAAsB;;CAqB1B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { useCallback } from 'react';
2
2
  import { usePersSDK } from '../providers/PersSDKProvider';
3
- import { NativeTokenTypes } from '@explorins/pers-shared';
4
3
  /**
5
4
  * React hook for Web3 operations in the PERS SDK
6
5
  *
@@ -10,48 +9,9 @@ import { NativeTokenTypes } from '@explorins/pers-shared';
10
9
  *
11
10
  * Note: Wallet addresses should be obtained from `user.wallets` via `usePersSDK()`.
12
11
  *
13
- * ## ERC-1155 Token Handling
14
- *
15
- * **IMPORTANT**: ERC-1155 tokens require specific `tokenIds` to query balances.
16
- * Unlike ERC-721, you cannot enumerate owned tokens - you must know which tokenId to check.
17
- *
18
- * The tokenIds come from `TokenDTO.metadata[].tokenMetadataIncrementalId`.
19
- *
20
- * ### Option 1: Use the helper method (Recommended)
21
- * ```typescript
22
- * const { getUserOwnedTokensFromContract } = useWeb3();
23
- * const { getRewardTokens } = useTokens();
24
- *
25
- * const rewardTokens = await getRewardTokens();
26
- * const result = await getUserOwnedTokensFromContract(walletAddress, rewardTokens[0]);
27
- * console.log('Owned rewards:', result.ownedTokens);
28
- * ```
29
- *
30
- * ### Option 2: Manual tokenIds extraction
31
- * ```typescript
32
- * const { getTokenCollection, extractTokenIds } = useWeb3();
33
- * const { getRewardTokens } = useTokens();
34
- *
35
- * const rewardTokens = await getRewardTokens();
36
- * const rewardToken = rewardTokens[0];
37
- *
38
- * // Extract tokenIds for ERC-1155
39
- * const tokenIds = extractTokenIds(rewardToken);
40
- *
41
- * const collection = await getTokenCollection({
42
- * accountAddress: walletAddress,
43
- * contractAddress: rewardToken.contractAddress,
44
- * abi: rewardToken.abi,
45
- * chainId: rewardToken.chainId,
46
- * tokenIds: tokenIds // Required for ERC-1155!
47
- * });
48
- *
49
- * const ownedTokens = collection.tokens.filter(t => t.hasBalance);
50
- * ```
51
- *
52
12
  * @returns Web3 hook with methods for blockchain operations
53
13
  *
54
- * @example Basic Usage
14
+ * @example
55
15
  * ```typescript
56
16
  * function Web3Component() {
57
17
  * const { user } = usePersSDK();
@@ -172,138 +132,6 @@ export const useWeb3 = () => {
172
132
  throw error;
173
133
  }
174
134
  }, [sdk, isInitialized]);
175
- /**
176
- * Extract tokenIds from a TokenDTO for use with ERC-1155 contracts.
177
- *
178
- * ERC-1155 tokens require specific tokenIds to query balances. This helper
179
- * extracts the `tokenMetadataIncrementalId` from each metadata entry.
180
- *
181
- * @param token - Token definition containing metadata array
182
- * @returns Array of tokenId strings, or undefined if no metadata
183
- *
184
- * @example
185
- * ```typescript
186
- * const { extractTokenIds, getTokenCollection } = useWeb3();
187
- * const { getRewardTokens } = useTokens();
188
- *
189
- * const rewardToken = (await getRewardTokens())[0];
190
- * const tokenIds = extractTokenIds(rewardToken);
191
- *
192
- * if (tokenIds) {
193
- * const collection = await getTokenCollection({
194
- * accountAddress: walletAddress,
195
- * contractAddress: rewardToken.contractAddress,
196
- * abi: rewardToken.abi,
197
- * chainId: rewardToken.chainId,
198
- * tokenIds: tokenIds
199
- * });
200
- * }
201
- * ```
202
- */
203
- const extractTokenIds = useCallback((token) => {
204
- if (!token.metadata || token.metadata.length === 0) {
205
- return undefined;
206
- }
207
- return token.metadata.map(meta => meta.tokenMetadataIncrementalId.toString());
208
- }, []);
209
- /**
210
- * Get user's owned tokens from a specific token contract.
211
- *
212
- * This is a convenience method that automatically handles:
213
- * - ERC-1155 tokenId extraction from metadata
214
- * - Building the collection request
215
- * - Filtering to only tokens with balance > 0
216
- *
217
- * **This is the recommended way to get user's owned reward/status tokens.**
218
- *
219
- * @param walletAddress - User's wallet address
220
- * @param token - Token definition (from getRewardTokens, getStatusTokens, etc.)
221
- * @param maxTokens - Maximum tokens to retrieve (default: 50)
222
- * @returns Promise resolving to result with owned tokens
223
- * @throws Error if SDK is not initialized
224
- *
225
- * @example Get User's Owned Rewards
226
- * ```typescript
227
- * const { user } = usePersSDK();
228
- * const { getRewardTokens } = useTokens();
229
- * const { getUserOwnedTokensFromContract } = useWeb3();
230
- *
231
- * const walletAddress = user?.wallets?.[0]?.address;
232
- * const rewardTokens = await getRewardTokens();
233
- *
234
- * for (const token of rewardTokens) {
235
- * const result = await getUserOwnedTokensFromContract(walletAddress, token);
236
- *
237
- * console.log(`${token.name}: ${result.totalOwned} owned`);
238
- * result.ownedTokens.forEach(owned => {
239
- * console.log(` - TokenId ${owned.tokenId}: ${owned.balance}`);
240
- * console.log(` Name: ${owned.metadata?.name}`);
241
- * console.log(` Image: ${owned.metadata?.imageUrl}`);
242
- * });
243
- * }
244
- * ```
245
- */
246
- const getUserOwnedTokensFromContract = useCallback(async (walletAddress, token, maxTokens = 50) => {
247
- if (!isInitialized || !sdk) {
248
- throw new Error('SDK not initialized. Call initialize() first.');
249
- }
250
- try {
251
- // For ERC-1155, extract tokenIds from metadata
252
- const tokenIds = token.type === NativeTokenTypes.ERC1155 ? extractTokenIds(token) : undefined;
253
- const collection = await sdk.web3.getTokenCollection({
254
- accountAddress: walletAddress,
255
- contractAddress: token.contractAddress,
256
- abi: token.abi,
257
- chainId: token.chainId,
258
- tokenIds,
259
- maxTokens
260
- });
261
- // Filter to only owned tokens (hasBalance: true)
262
- // For ERC721, include all since they're enumerated
263
- const ownedTokens = token.type === NativeTokenTypes.ERC721
264
- ? collection.tokens
265
- : collection.tokens.filter(t => t.hasBalance);
266
- return {
267
- token,
268
- ownedTokens,
269
- totalOwned: ownedTokens.length
270
- };
271
- }
272
- catch (error) {
273
- console.error('Failed to get user owned tokens:', error);
274
- throw error;
275
- }
276
- }, [sdk, isInitialized, extractTokenIds]);
277
- /**
278
- * Build a TokenCollectionRequest from a TokenDTO.
279
- *
280
- * Automatically handles ERC-1155 tokenId extraction from metadata.
281
- * Use this when you need more control over the request than
282
- * `getUserOwnedTokensFromContract` provides.
283
- *
284
- * @param walletAddress - User's wallet address
285
- * @param token - Token definition
286
- * @param maxTokens - Maximum tokens to retrieve (default: 50)
287
- * @returns TokenCollectionRequest ready for getTokenCollection()
288
- *
289
- * @example
290
- * ```typescript
291
- * const { buildCollectionRequest, getTokenCollection } = useWeb3();
292
- *
293
- * const request = buildCollectionRequest(walletAddress, rewardToken);
294
- * const collection = await getTokenCollection(request);
295
- * ```
296
- */
297
- const buildCollectionRequest = useCallback((walletAddress, token, maxTokens = 50) => {
298
- return {
299
- accountAddress: walletAddress,
300
- contractAddress: token.contractAddress,
301
- abi: token.abi,
302
- chainId: token.chainId,
303
- tokenIds: token.type === NativeTokenTypes.ERC1155 ? extractTokenIds(token) : undefined,
304
- maxTokens
305
- };
306
- }, [extractTokenIds]);
307
135
  const resolveIPFSUrl = useCallback(async (url, chainId) => {
308
136
  if (!isInitialized || !sdk) {
309
137
  throw new Error('SDK not initialized. Call initialize() first.');
@@ -356,8 +184,86 @@ export const useWeb3 = () => {
356
184
  throw error;
357
185
  }
358
186
  }, [sdk, isInitialized]);
187
+ // ==========================================
188
+ // HELPER METHODS (delegating to core SDK)
189
+ // ==========================================
190
+ /**
191
+ * Extract tokenIds from a TokenDTO's metadata.
192
+ *
193
+ * Extracts `tokenMetadataIncrementalId` from each metadata entry. This is
194
+ * particularly useful for ERC-1155 tokens which require specific tokenIds
195
+ * to query balances, but works with any token that has metadata.
196
+ *
197
+ * **Note:** For most use cases, prefer `getAccountOwnedTokensFromContract()`
198
+ * which handles tokenId extraction automatically.
199
+ *
200
+ * @param token - Token definition containing metadata array
201
+ * @returns Array of tokenId strings, or undefined if no metadata
202
+ *
203
+ * @see {@link getAccountOwnedTokensFromContract} - Recommended helper that handles this automatically
204
+ */
205
+ const extractTokenIds = useCallback((token) => {
206
+ // Pure function - delegates to core SDK (no initialization required)
207
+ return sdk?.web3.extractTokenIds(token);
208
+ }, [sdk]);
209
+ /**
210
+ * Get owned tokens from a specific token contract for any blockchain address.
211
+ *
212
+ * **Recommended method** for querying token balances. Automatically handles:
213
+ * - Token type detection (ERC-20, ERC-721, ERC-1155)
214
+ * - TokenId extraction from metadata (uses `extractTokenIds()` internally for ERC-1155)
215
+ * - Building the collection request
216
+ * - Filtering to only tokens with balance > 0
217
+ *
218
+ * Works with any valid blockchain address - can query user wallets, external
219
+ * wallets, contract addresses, or any other address holding tokens.
220
+ *
221
+ * @param accountAddress - Any valid blockchain address (wallet, contract, etc.)
222
+ * @param token - Token definition (from getRewardTokens, getStatusTokens, etc.)
223
+ * @param maxTokens - Maximum tokens to retrieve (default: 50)
224
+ * @returns Promise resolving to result with owned tokens
225
+ * @throws Error if SDK is not initialized
226
+ *
227
+ * @example Query user's wallet
228
+ * ```typescript
229
+ * const { user } = usePersSDK();
230
+ * const { getAccountOwnedTokensFromContract } = useWeb3();
231
+ * const { getRewardTokens } = useTokens();
232
+ *
233
+ * const userWallet = user?.wallets?.[0]?.address;
234
+ * const rewardTokens = await getRewardTokens();
235
+ * const result = await getAccountOwnedTokensFromContract(userWallet, rewardTokens[0]);
236
+ * console.log(`User owns ${result.totalOwned} tokens`);
237
+ * ```
238
+ *
239
+ * @see {@link extractTokenIds} - Low-level helper used internally for ERC-1155
240
+ * @see {@link buildCollectionRequest} - For manual request building
241
+ */
242
+ const getAccountOwnedTokensFromContract = useCallback(async (accountAddress, token, maxTokens = 50) => {
243
+ if (!isInitialized || !sdk) {
244
+ throw new Error('SDK not initialized. Call initialize() first.');
245
+ }
246
+ return sdk.web3.getAccountOwnedTokensFromContract(accountAddress, token, maxTokens);
247
+ }, [sdk, isInitialized]);
248
+ /**
249
+ * Build a TokenCollectionRequest from a TokenDTO.
250
+ *
251
+ * Automatically handles ERC-1155 tokenId extraction from metadata.
252
+ * Use this when you need more control over the request than
253
+ * `getAccountOwnedTokensFromContract` provides.
254
+ *
255
+ * @param accountAddress - Any valid blockchain address (wallet, contract, etc.)
256
+ * @param token - Token definition
257
+ * @param maxTokens - Maximum tokens to retrieve (default: 50)
258
+ * @returns TokenCollectionRequest ready for getTokenCollection()
259
+ */
260
+ const buildCollectionRequest = useCallback((accountAddress, token, maxTokens = 50) => {
261
+ if (!sdk) {
262
+ throw new Error('SDK not initialized. Call initialize() first.');
263
+ }
264
+ return sdk.web3.buildCollectionRequest(accountAddress, token, maxTokens);
265
+ }, [sdk]);
359
266
  return {
360
- // Core methods
361
267
  getTokenBalance,
362
268
  getTokenMetadata,
363
269
  getTokenCollection,
@@ -365,11 +271,10 @@ export const useWeb3 = () => {
365
271
  fetchAndProcessMetadata,
366
272
  getChainDataById,
367
273
  getExplorerUrl,
368
- // Helper methods for ERC-1155 tokens
274
+ // Helper methods
369
275
  extractTokenIds,
370
- getUserOwnedTokensFromContract,
276
+ getAccountOwnedTokensFromContract,
371
277
  buildCollectionRequest,
372
- // State
373
278
  isAvailable: isInitialized && !!sdk?.web3,
374
279
  };
375
280
  };
package/dist/index.d.ts CHANGED
@@ -144,6 +144,7 @@ export { PersSDKProvider, usePersSDK, type PersConfig, type PersSDKContext } fro
144
144
  * - `useAnalytics` - Usage analytics and reporting
145
145
  * - `useFiles` - File upload and management
146
146
  * - `useWeb3` - Blockchain integration and wallet operations
147
+ * - `useEvents` - ** SDK event subscriptions for notifications**
147
148
  *
148
149
  * @example
149
150
  * **Token Operations:**
@@ -184,9 +185,30 @@ export { PersSDKProvider, usePersSDK, type PersConfig, type PersSDKContext } fro
184
185
  * };
185
186
  * }
186
187
  * ```
188
+ *
189
+ * @example
190
+ * **Event Subscriptions:**
191
+ * ```typescript
192
+ * import { useEvents, useEffect } from '@explorins/pers-sdk-react-native';
193
+ *
194
+ * function NotificationHandler() {
195
+ * const { subscribe, isAvailable } = useEvents();
196
+ *
197
+ * useEffect(() => {
198
+ * if (!isAvailable) return;
199
+ *
200
+ * const unsubscribe = subscribe((event) => {
201
+ * showNotification(event.userMessage, event.level);
202
+ * });
203
+ *
204
+ * return () => unsubscribe();
205
+ * }, [subscribe, isAvailable]);
206
+ * }
207
+ * ```
187
208
  */
188
- export { useAuth, useTokens, useTransactions, useTransactionSigner, SigningStatus, useBusiness, useCampaigns, useRedemptions, useWeb3, usePurchases, useTenants, useUsers, useUserStatus, useFiles, useAnalytics, useDonations } from './hooks';
209
+ export { useAuth, useTokens, useTransactions, useTransactionSigner, SigningStatus, useBusiness, useCampaigns, useRedemptions, useWeb3, usePurchases, useTenants, useUsers, useUserStatus, useFiles, useAnalytics, useDonations, useEvents } from './hooks';
189
210
  export type { OnStatusUpdateFn, StatusUpdateData, SigningStatusType } from './hooks';
211
+ export type { EventsHook, PersEvent, EventHandler, EventFilter, Unsubscribe } from './hooks';
190
212
  /**
191
213
  * React Native-optimized HTTP client with automatic request/response handling
192
214
  *
@@ -235,4 +257,64 @@ export * from '@explorins/pers-shared';
235
257
  * @see {@link TokenCollection} - Collection of tokens for batch operations
236
258
  */
237
259
  export type { TokenBalanceRequest, TokenBalance, TokenMetadata, TokenCollection, TokenCollectionRequest } from '@explorins/pers-sdk/web3';
260
+ /**
261
+ * Transaction Request Factory Functions
262
+ *
263
+ * Factory functions for creating properly structured transaction DTOs.
264
+ * Prioritizes accountId/accountType over raw addresses for security and consistency.
265
+ *
266
+ * @example
267
+ * ```typescript
268
+ * import {
269
+ * buildMintRequest,
270
+ * buildTransferRequest,
271
+ * buildBurnRequest,
272
+ * useTransactions,
273
+ * AccountOwnerType
274
+ * } from '@explorins/pers-sdk-react-native';
275
+ *
276
+ * function TokenOperations() {
277
+ * const { createTransaction } = useTransactions();
278
+ *
279
+ * const handleMint = async () => {
280
+ * const request = buildMintRequest({
281
+ * amount: 100,
282
+ * contractAddress: '0x...',
283
+ * chainId: 137,
284
+ * recipientAccountType: AccountOwnerType.USER,
285
+ * recipientAccountId: 'user-123'
286
+ * });
287
+ * await createTransaction(request);
288
+ * };
289
+ * }
290
+ * ```
291
+ *
292
+ * @see {@link buildMintRequest} - Create mint transaction requests
293
+ * @see {@link buildBurnRequest} - Create burn transaction requests
294
+ * @see {@link buildTransferRequest} - Create transfer transaction requests
295
+ * @see {@link buildPOSTransferRequest} - Create POS transfer requests (business submits on behalf of user)
296
+ * @see {@link buildPOSBurnRequest} - Create POS burn requests (business submits burn on behalf of user)
297
+ * @see {@link buildSubmissionRequest} - Create submission requests from QR/signature data
298
+ */
299
+ export { buildMintRequest, buildBurnRequest, buildTransferRequest, buildPOSTransferRequest, buildPOSBurnRequest, buildSubmissionRequest } from '@explorins/pers-sdk/transaction';
300
+ export type { POSAuthorizationOptions } from '@explorins/pers-sdk/transaction';
301
+ /**
302
+ * SDK Error classes for type checking in catch blocks
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * import { PersApiError } from '@explorins/pers-sdk-react-native';
307
+ *
308
+ * try {
309
+ * await sdk.campaigns.claimCampaign({ campaignId });
310
+ * } catch (error) {
311
+ * if (error instanceof PersApiError) {
312
+ * console.log(error.message); // Clean backend message
313
+ * console.log(error.code); // e.g., 'CAMPAIGN_BUSINESS_REQUIRED'
314
+ * console.log(error.status); // e.g., 400
315
+ * }
316
+ * }
317
+ * ```
318
+ */
319
+ export { PersApiError, AuthenticationError } from '@explorins/pers-sdk/core';
238
320
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,OAAO,aAAa,CAAC;AAMrB;;;;;;;;GAQG;AACH,OAAO,EACL,6BAA6B,EAC7B,KAAK,qBAAqB,EAC3B,MAAM,wCAAwC,CAAC;AAMhD;;;;;;;;;;GAUG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;;;;;GAQG;AACH,OAAO,EACL,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAM/C;;;GAGG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAMvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,eAAe,EACf,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAMrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACb,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAMrF;;;;;;GAMG;AACH,OAAO,EACL,qBAAqB,EACtB,MAAM,sCAAsC,CAAC;AAM9C;;;;;;;;GAQG;AACH,OAAO,EACL,8BAA8B,EAC/B,MAAM,aAAa,CAAC;AAMrB;;;;;;;;;;;;;;;GAeG;AACH,cAAc,wBAAwB,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,sBAAsB,EACvB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,OAAO,aAAa,CAAC;AAMrB;;;;;;;;GAQG;AACH,OAAO,EACL,6BAA6B,EAC7B,KAAK,qBAAqB,EAC3B,MAAM,wCAAwC,CAAC;AAMhD;;;;;;;;;;GAUG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;;;;;GAQG;AACH,OAAO,EACL,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAM/C;;;GAGG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAMvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,eAAe,EACf,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAMrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGrF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM7F;;;;;;GAMG;AACH,OAAO,EACL,qBAAqB,EACtB,MAAM,sCAAsC,CAAC;AAM9C;;;;;;;;GAQG;AACH,OAAO,EACL,8BAA8B,EAC/B,MAAM,aAAa,CAAC;AAMrB;;;;;;;;;;;;;;;GAeG;AACH,cAAc,wBAAwB,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAMlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAM/E;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}