@chipi-stack/chipi-react 14.13.1 → 14.15.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.
package/dist/hooks.d.mts CHANGED
@@ -1,6 +1,7 @@
1
- export { g as ChipiWalletData, a1 as PrivacyConfig, a2 as PrivacyKeys, a5 as PrivacyLedgerEvent, a3 as PrivacyStep, a6 as PrivateBalanceInput, S as SessionState, k as SessionWallet, a4 as ShieldHookInput, X as ThresholdSignState, i as UseChipiSessionConfig, j as UseChipiSessionReturn, e as UseChipiWalletConfig, U as UseChipiWalletObjectConfig, f as UseChipiWalletReturn, R as UseGuardianRecoveryReturn, P as UseShhhSignerReturn, W as UseThresholdSignOptions, V as UseThresholdSignReturn, p as UseTransferConfig, M as UseX402PaymentConfig, N as UseX402PaymentReturn, $ as derivePrivacyAccount, a0 as netPrivateBalance, H as useAddSessionKeyToContract, q as useApprove, A as useCallAnyContract, h as useChipiSession, d as useChipiWallet, D as useChipiWalletObject, G as useCreateSessionKey, u as useCreateWallet, K as useExecuteWithSession, J as useGetSessionData, z as useGetSku, y as useGetSkuList, x as useGetSkuPurchase, F as useGetTokenBalance, s as useGetTransaction, r as useGetTransactionList, t as useGetTransactionStatus, c as useGetWallet, Q as useGuardianRecovery, l as useMigrateWalletToPasskey, n as useMigrateWalletToShhh, _ as usePrivateBalance, w as usePurchaseSku, E as useRecordSendTransaction, I as useRevokeSessionKey, O as useShhhSigner, Y as useShield, B as useSignTypedData, v as useSyncOnChainTransfers, T as useThresholdSign, o as useTransfer, Z as useUnshield, m as useUpdateWalletEncryption, L as useX402Payment } from './index-D9-uVlda.mjs';
1
+ export { g as ChipiWalletData, a2 as PrivacyConfig, a3 as PrivacyKeys, a6 as PrivacyLedgerEvent, a4 as PrivacyStep, a7 as PrivateBalanceInput, R as RegisterSessionConfig, S as SessionState, k as SessionWallet, a5 as ShieldHookInput, Y as ThresholdSignState, i as UseChipiSessionConfig, j as UseChipiSessionReturn, e as UseChipiWalletConfig, U as UseChipiWalletObjectConfig, f as UseChipiWalletReturn, T as UseGuardianRecoveryReturn, P as UseShhhSignerReturn, X as UseThresholdSignOptions, W as UseThresholdSignReturn, p as UseTransferConfig, M as UseX402PaymentConfig, N as UseX402PaymentReturn, a0 as derivePrivacyAccount, a1 as netPrivateBalance, H as useAddSessionKeyToContract, q as useApprove, A as useCallAnyContract, h as useChipiSession, d as useChipiWallet, D as useChipiWalletObject, G as useCreateSessionKey, u as useCreateWallet, K as useExecuteWithSession, J as useGetSessionData, z as useGetSku, y as useGetSkuList, x as useGetSkuPurchase, F as useGetTokenBalance, s as useGetTransaction, r as useGetTransactionList, t as useGetTransactionStatus, c as useGetWallet, Q as useGuardianRecovery, l as useMigrateWalletToPasskey, n as useMigrateWalletToShhh, $ as usePrivateBalance, w as usePurchaseSku, E as useRecordSendTransaction, I as useRevokeSessionKey, O as useShhhSigner, Z as useShield, B as useSignTypedData, v as useSyncOnChainTransfers, V as useThresholdSign, o as useTransfer, _ as useUnshield, m as useUpdateWalletEncryption, L as useX402Payment } from './index-B8OIdrOX.mjs';
2
2
  import '@chipi-stack/types';
3
3
  import '@tanstack/react-query';
4
+ import 'react';
4
5
  import '@chipi-stack/backend';
5
6
  import 'starknet';
6
7
  import '@starknet-io/types-js';
package/dist/hooks.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export { g as ChipiWalletData, a1 as PrivacyConfig, a2 as PrivacyKeys, a5 as PrivacyLedgerEvent, a3 as PrivacyStep, a6 as PrivateBalanceInput, S as SessionState, k as SessionWallet, a4 as ShieldHookInput, X as ThresholdSignState, i as UseChipiSessionConfig, j as UseChipiSessionReturn, e as UseChipiWalletConfig, U as UseChipiWalletObjectConfig, f as UseChipiWalletReturn, R as UseGuardianRecoveryReturn, P as UseShhhSignerReturn, W as UseThresholdSignOptions, V as UseThresholdSignReturn, p as UseTransferConfig, M as UseX402PaymentConfig, N as UseX402PaymentReturn, $ as derivePrivacyAccount, a0 as netPrivateBalance, H as useAddSessionKeyToContract, q as useApprove, A as useCallAnyContract, h as useChipiSession, d as useChipiWallet, D as useChipiWalletObject, G as useCreateSessionKey, u as useCreateWallet, K as useExecuteWithSession, J as useGetSessionData, z as useGetSku, y as useGetSkuList, x as useGetSkuPurchase, F as useGetTokenBalance, s as useGetTransaction, r as useGetTransactionList, t as useGetTransactionStatus, c as useGetWallet, Q as useGuardianRecovery, l as useMigrateWalletToPasskey, n as useMigrateWalletToShhh, _ as usePrivateBalance, w as usePurchaseSku, E as useRecordSendTransaction, I as useRevokeSessionKey, O as useShhhSigner, Y as useShield, B as useSignTypedData, v as useSyncOnChainTransfers, T as useThresholdSign, o as useTransfer, Z as useUnshield, m as useUpdateWalletEncryption, L as useX402Payment } from './index-D9-uVlda.js';
1
+ export { g as ChipiWalletData, a2 as PrivacyConfig, a3 as PrivacyKeys, a6 as PrivacyLedgerEvent, a4 as PrivacyStep, a7 as PrivateBalanceInput, R as RegisterSessionConfig, S as SessionState, k as SessionWallet, a5 as ShieldHookInput, Y as ThresholdSignState, i as UseChipiSessionConfig, j as UseChipiSessionReturn, e as UseChipiWalletConfig, U as UseChipiWalletObjectConfig, f as UseChipiWalletReturn, T as UseGuardianRecoveryReturn, P as UseShhhSignerReturn, X as UseThresholdSignOptions, W as UseThresholdSignReturn, p as UseTransferConfig, M as UseX402PaymentConfig, N as UseX402PaymentReturn, a0 as derivePrivacyAccount, a1 as netPrivateBalance, H as useAddSessionKeyToContract, q as useApprove, A as useCallAnyContract, h as useChipiSession, d as useChipiWallet, D as useChipiWalletObject, G as useCreateSessionKey, u as useCreateWallet, K as useExecuteWithSession, J as useGetSessionData, z as useGetSku, y as useGetSkuList, x as useGetSkuPurchase, F as useGetTokenBalance, s as useGetTransaction, r as useGetTransactionList, t as useGetTransactionStatus, c as useGetWallet, Q as useGuardianRecovery, l as useMigrateWalletToPasskey, n as useMigrateWalletToShhh, $ as usePrivateBalance, w as usePurchaseSku, E as useRecordSendTransaction, I as useRevokeSessionKey, O as useShhhSigner, Z as useShield, B as useSignTypedData, v as useSyncOnChainTransfers, V as useThresholdSign, o as useTransfer, _ as useUnshield, m as useUpdateWalletEncryption, L as useX402Payment } from './index-B8OIdrOX.js';
2
2
  import '@chipi-stack/types';
3
3
  import '@tanstack/react-query';
4
+ import 'react';
4
5
  import '@chipi-stack/backend';
5
6
  import 'starknet';
6
7
  import '@starknet-io/types-js';
package/dist/hooks.js CHANGED
@@ -167,6 +167,17 @@ function useGetWallet(input) {
167
167
  fetchWallet
168
168
  };
169
169
  }
170
+
171
+ // src/utils/wallet-capabilities.ts
172
+ var SHHH_SESSION_SIGNER_KINDS = /* @__PURE__ */ new Set(["STARK", "ED25519"]);
173
+ function walletSupportsSessions(wallet) {
174
+ if (!wallet) return false;
175
+ if (wallet.walletType === "CHIPI") return true;
176
+ if (wallet.walletType === "SHHH") {
177
+ return !wallet.signerKind || SHHH_SESSION_SIGNER_KINDS.has(wallet.signerKind);
178
+ }
179
+ return false;
180
+ }
170
181
  function useChipiWallet(config3) {
171
182
  const { chipiSDK } = useChipiContext();
172
183
  const queryClient = reactQuery.useQueryClient();
@@ -247,7 +258,7 @@ function useChipiWallet(config3) {
247
258
  const data = walletQuery.data;
248
259
  return {
249
260
  ...data,
250
- supportsSessionKeys: data.walletType === "CHIPI",
261
+ supportsSessionKeys: walletSupportsSessions(data),
251
262
  shortAddress: formatAddress(data.publicKey)
252
263
  };
253
264
  }, [walletQuery.data, walletQuery.isLoading]);
@@ -304,6 +315,7 @@ function useChipiSession(config3) {
304
315
  const {
305
316
  wallet,
306
317
  encryptKey,
318
+ getEncryptKey,
307
319
  getBearerToken,
308
320
  storedSession,
309
321
  onSessionCreated,
@@ -317,10 +329,13 @@ function useChipiSession(config3) {
317
329
  react.useEffect(() => {
318
330
  setLocalSession(storedSession ?? null);
319
331
  }, [storedSession]);
320
- const supportsSession = react.useMemo(() => {
321
- if (!wallet) return false;
322
- return wallet.walletType === "CHIPI";
323
- }, [wallet]);
332
+ const supportsSession = react.useMemo(() => walletSupportsSessions(wallet), [wallet]);
333
+ const resolveEncryptKey = react.useCallback(async () => {
334
+ const key = encryptKey || (getEncryptKey ? await getEncryptKey() : void 0);
335
+ if (!key) throw new Error("Encryption key (PIN) is required");
336
+ return key;
337
+ }, [encryptKey, getEncryptKey]);
338
+ const [awaitingRegistrationUntil, setAwaitingRegistrationUntil] = react.useState(null);
324
339
  const sessionStatusQuery = reactQuery.useQuery({
325
340
  queryKey: ["chipi-session-status", wallet?.publicKey, localSession?.publicKey],
326
341
  queryFn: async () => {
@@ -333,8 +348,12 @@ function useChipiSession(config3) {
333
348
  enabled: Boolean(
334
349
  autoCheckStatus && wallet?.publicKey && localSession?.publicKey && supportsSession
335
350
  ),
336
- staleTime: 3e4
351
+ staleTime: 3e4,
337
352
  // 30 seconds
353
+ // The registration hash comes back before the transaction is in a block, so
354
+ // right after registerSession the struct can still read as zero. Poll until
355
+ // it shows up (or for two minutes), then go back to on-demand reads.
356
+ refetchInterval: (query) => awaitingRegistrationUntil !== null && Date.now() < awaitingRegistrationUntil && (query.state.data?.validUntil ?? 0) === 0 ? 3e3 : false
338
357
  });
339
358
  const [revokedSessionKey, setRevokedSessionKey] = react.useState(null);
340
359
  const sessionState = react.useMemo(() => {
@@ -357,13 +376,13 @@ function useChipiSession(config3) {
357
376
  const createSessionMutation = reactQuery.useMutation(
358
377
  {
359
378
  mutationFn: async (params = {}) => {
360
- if (!encryptKey) throw new Error("Encryption key (PIN) is required");
361
379
  if (!supportsSession)
362
380
  throw new Error(
363
- "Wallet does not support sessions. Only CHIPI wallets support session keys."
381
+ "Wallet does not support sessions. Session keys need a CHIPI wallet or a SHHH wallet with a STARK / ED25519 signer."
364
382
  );
383
+ const key = await resolveEncryptKey();
365
384
  const sessionData = chipiSDK.sessions.createSessionKey({
366
- encryptKey,
385
+ encryptKey: key,
367
386
  durationSeconds: params.durationSeconds ?? defaultDurationSeconds
368
387
  });
369
388
  return sessionData;
@@ -383,29 +402,38 @@ function useChipiSession(config3) {
383
402
  const registerSessionMutation = reactQuery.useMutation({
384
403
  mutationFn: async (sessionConfig = {}) => {
385
404
  if (!wallet) throw new Error("Wallet is required");
386
- if (!localSession) throw new Error("No session to register. Call createSession first.");
387
- if (!encryptKey) throw new Error("Encryption key (PIN) is required");
405
+ const sessionPublicKey = sessionConfig.sessionPublicKey ?? localSession?.publicKey;
406
+ const validUntil = sessionConfig.validUntil ?? localSession?.validUntil;
407
+ if (!sessionPublicKey || validUntil === void 0)
408
+ throw new Error(
409
+ "No session to register. Call createSession first, or pass sessionPublicKey and validUntil."
410
+ );
388
411
  if (!supportsSession) throw new Error("Wallet does not support sessions");
412
+ const key = await resolveEncryptKey();
389
413
  const bearerToken = await getBearerToken();
390
414
  if (!bearerToken) throw new Error("Bearer token is required");
391
- const txHash = await chipiSDK.sessions.addSessionKeyToContract(
392
- {
393
- encryptKey,
394
- wallet,
395
- sessionConfig: {
396
- sessionPublicKey: localSession.publicKey,
397
- validUntil: sessionConfig.validUntil ?? localSession.validUntil,
398
- maxCalls: sessionConfig.maxCalls ?? defaultMaxCalls,
399
- allowedEntrypoints: sessionConfig.allowedEntrypoints ?? []
400
- }
401
- },
402
- bearerToken
403
- );
404
- return txHash;
415
+ const params = {
416
+ encryptKey: key,
417
+ wallet,
418
+ sessionConfig: {
419
+ sessionPublicKey,
420
+ validUntil,
421
+ maxCalls: sessionConfig.maxCalls ?? defaultMaxCalls,
422
+ allowedEntrypoints: sessionConfig.allowedEntrypoints ?? []
423
+ }
424
+ };
425
+ if (sessionConfig.spendingPolicies?.length) {
426
+ return chipiSDK.sessions.setupSession(
427
+ { ...params, spendingPolicies: sessionConfig.spendingPolicies },
428
+ bearerToken
429
+ );
430
+ }
431
+ return chipiSDK.sessions.addSessionKeyToContract(params, bearerToken);
405
432
  },
406
433
  onSuccess: () => {
407
434
  setError(null);
408
435
  if (localSession && revokedSessionKey === localSession.publicKey) setRevokedSessionKey(null);
436
+ setAwaitingRegistrationUntil(Date.now() + 12e4);
409
437
  queryClient.invalidateQueries({
410
438
  queryKey: ["chipi-session-status", wallet?.publicKey, localSession?.publicKey]
411
439
  });
@@ -415,26 +443,28 @@ function useChipiSession(config3) {
415
443
  }
416
444
  });
417
445
  const revokeSessionMutation = reactQuery.useMutation({
418
- mutationFn: async () => {
446
+ mutationFn: async (sessionPublicKey) => {
419
447
  if (!wallet) throw new Error("Wallet is required");
420
- if (!localSession) throw new Error("No session to revoke");
421
- if (!encryptKey) throw new Error("Encryption key (PIN) is required");
448
+ const target = sessionPublicKey ?? localSession?.publicKey;
449
+ if (!target) throw new Error("No session to revoke");
422
450
  if (!supportsSession) throw new Error("Wallet does not support sessions");
451
+ const key = await resolveEncryptKey();
423
452
  const bearerToken = await getBearerToken();
424
453
  if (!bearerToken) throw new Error("Bearer token is required");
425
454
  const txHash = await chipiSDK.sessions.revokeSessionKey(
426
455
  {
427
- encryptKey,
456
+ encryptKey: key,
428
457
  wallet,
429
- sessionPublicKey: localSession.publicKey
458
+ sessionPublicKey: target
430
459
  },
431
460
  bearerToken
432
461
  );
433
462
  return txHash;
434
463
  },
435
- onSuccess: () => {
464
+ onSuccess: (_txHash, sessionPublicKey) => {
436
465
  setError(null);
437
- if (localSession) setRevokedSessionKey(localSession.publicKey);
466
+ const target = sessionPublicKey ?? localSession?.publicKey;
467
+ if (target) setRevokedSessionKey(target);
438
468
  queryClient.invalidateQueries({
439
469
  queryKey: ["chipi-session-status", wallet?.publicKey, localSession?.publicKey]
440
470
  });
@@ -447,13 +477,13 @@ function useChipiSession(config3) {
447
477
  mutationFn: async (calls) => {
448
478
  if (!wallet) throw new Error("Wallet is required");
449
479
  if (!localSession) throw new Error("No active session");
450
- if (!encryptKey) throw new Error("Encryption key (PIN) is required");
451
480
  if (!hasActiveSession) throw new Error("Session is not active. Register the session first.");
481
+ const key = await resolveEncryptKey();
452
482
  const bearerToken = await getBearerToken();
453
483
  if (!bearerToken) throw new Error("Bearer token is required");
454
484
  const txHash = await chipiSDK.executeTransactionWithSession({
455
485
  params: {
456
- encryptKey,
486
+ encryptKey: key,
457
487
  wallet,
458
488
  session: localSession,
459
489
  calls
@@ -477,13 +507,13 @@ function useChipiSession(config3) {
477
507
  if (!wallet) throw new Error("Wallet is required");
478
508
  if (!localSession)
479
509
  throw new Error("No session to set policy on. Create and register a session first.");
480
- if (!encryptKey) throw new Error("Encryption key (PIN) is required");
481
510
  if (!supportsSession) throw new Error("Wallet does not support sessions");
511
+ const key = await resolveEncryptKey();
482
512
  const bearerToken = await getBearerToken();
483
513
  if (!bearerToken) throw new Error("Bearer token is required");
484
514
  const txHash = await chipiSDK.sessions.setSpendingPolicy(
485
515
  {
486
- encryptKey,
516
+ encryptKey: key,
487
517
  wallet,
488
518
  spendingPolicyConfig: {
489
519
  sessionPublicKey: localSession.publicKey,
@@ -505,13 +535,13 @@ function useChipiSession(config3) {
505
535
  mutationFn: async (token) => {
506
536
  if (!wallet) throw new Error("Wallet is required");
507
537
  if (!localSession) throw new Error("No session to remove policy from");
508
- if (!encryptKey) throw new Error("Encryption key (PIN) is required");
509
538
  if (!supportsSession) throw new Error("Wallet does not support sessions");
539
+ const key = await resolveEncryptKey();
510
540
  const bearerToken = await getBearerToken();
511
541
  if (!bearerToken) throw new Error("Bearer token is required");
512
542
  const txHash = await chipiSDK.sessions.removeSpendingPolicy(
513
543
  {
514
- encryptKey,
544
+ encryptKey: key,
515
545
  wallet,
516
546
  sessionPublicKey: localSession.publicKey,
517
547
  token
@@ -539,9 +569,14 @@ function useChipiSession(config3) {
539
569
  },
540
570
  [registerSessionMutation]
541
571
  );
542
- const revokeSession = react.useCallback(async () => {
543
- return revokeSessionMutation.mutateAsync();
544
- }, [revokeSessionMutation]);
572
+ const revokeSession = react.useCallback(
573
+ async (sessionPublicKey) => {
574
+ return revokeSessionMutation.mutateAsync(
575
+ typeof sessionPublicKey === "string" ? sessionPublicKey : void 0
576
+ );
577
+ },
578
+ [revokeSessionMutation]
579
+ );
545
580
  const executeWithSession = react.useCallback(
546
581
  async (calls) => {
547
582
  return executeWithSessionMutation.mutateAsync(calls);