@pepu-chain/sdk 0.0.0-stage → 0.2.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 (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +565 -2
  3. package/dist/aa/kernel.cjs +40 -0
  4. package/dist/aa/kernel.cjs.map +1 -0
  5. package/dist/aa/kernel.d.cts +88 -0
  6. package/dist/aa/kernel.d.ts +88 -0
  7. package/dist/aa/kernel.js +11 -0
  8. package/dist/aa/kernel.js.map +1 -0
  9. package/dist/aa/react-direct.cjs +110 -0
  10. package/dist/aa/react-direct.cjs.map +1 -0
  11. package/dist/aa/react-direct.d.cts +42 -0
  12. package/dist/aa/react-direct.d.ts +42 -0
  13. package/dist/aa/react-direct.js +107 -0
  14. package/dist/aa/react-direct.js.map +1 -0
  15. package/dist/aa/react.cjs +151 -0
  16. package/dist/aa/react.cjs.map +1 -0
  17. package/dist/aa/react.d.cts +62 -0
  18. package/dist/aa/react.d.ts +62 -0
  19. package/dist/aa/react.js +147 -0
  20. package/dist/aa/react.js.map +1 -0
  21. package/dist/aa.cjs +84 -0
  22. package/dist/aa.cjs.map +1 -0
  23. package/dist/aa.d.cts +85 -0
  24. package/dist/aa.d.ts +85 -0
  25. package/dist/aa.js +11 -0
  26. package/dist/aa.js.map +1 -0
  27. package/dist/api-Dz4sCHH_.d.cts +654 -0
  28. package/dist/api-Dz4sCHH_.d.ts +654 -0
  29. package/dist/calls-BRPjKgjl.d.cts +70 -0
  30. package/dist/calls-z_EQOtFb.d.ts +70 -0
  31. package/dist/chains-DK13zGIp.d.cts +235 -0
  32. package/dist/chains-DK13zGIp.d.ts +235 -0
  33. package/dist/chunk-3XUGQODR.js +194 -0
  34. package/dist/chunk-3XUGQODR.js.map +1 -0
  35. package/dist/chunk-45KSZH26.cjs +145 -0
  36. package/dist/chunk-45KSZH26.cjs.map +1 -0
  37. package/dist/chunk-4GINFJO6.cjs +44 -0
  38. package/dist/chunk-4GINFJO6.cjs.map +1 -0
  39. package/dist/chunk-62M2LKQW.js +136 -0
  40. package/dist/chunk-62M2LKQW.js.map +1 -0
  41. package/dist/chunk-6DSZ4Z2N.js +498 -0
  42. package/dist/chunk-6DSZ4Z2N.js.map +1 -0
  43. package/dist/chunk-7MNJF2OB.cjs +72 -0
  44. package/dist/chunk-7MNJF2OB.cjs.map +1 -0
  45. package/dist/chunk-A5LP2UCS.cjs +2729 -0
  46. package/dist/chunk-A5LP2UCS.cjs.map +1 -0
  47. package/dist/chunk-AJS4UFQX.cjs +121 -0
  48. package/dist/chunk-AJS4UFQX.cjs.map +1 -0
  49. package/dist/chunk-C2XW44FI.cjs +200 -0
  50. package/dist/chunk-C2XW44FI.cjs.map +1 -0
  51. package/dist/chunk-C7IC36XS.cjs +13 -0
  52. package/dist/chunk-C7IC36XS.cjs.map +1 -0
  53. package/dist/chunk-D52PADVY.js +84 -0
  54. package/dist/chunk-D52PADVY.js.map +1 -0
  55. package/dist/chunk-DH6BFNVJ.cjs +272 -0
  56. package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
  57. package/dist/chunk-DPCZJLB3.cjs +87 -0
  58. package/dist/chunk-DPCZJLB3.cjs.map +1 -0
  59. package/dist/chunk-EHBPIYY4.js +262 -0
  60. package/dist/chunk-EHBPIYY4.js.map +1 -0
  61. package/dist/chunk-ESMNAXUI.js +86 -0
  62. package/dist/chunk-ESMNAXUI.js.map +1 -0
  63. package/dist/chunk-ET3P6TX6.cjs +49 -0
  64. package/dist/chunk-ET3P6TX6.cjs.map +1 -0
  65. package/dist/chunk-FCXSP2YF.js +219 -0
  66. package/dist/chunk-FCXSP2YF.js.map +1 -0
  67. package/dist/chunk-IB2FSPMJ.js +66 -0
  68. package/dist/chunk-IB2FSPMJ.js.map +1 -0
  69. package/dist/chunk-IG7RSL2Y.cjs +178 -0
  70. package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
  71. package/dist/chunk-IY3ALPUJ.js +2716 -0
  72. package/dist/chunk-IY3ALPUJ.js.map +1 -0
  73. package/dist/chunk-J3O2ZGG3.cjs +93 -0
  74. package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
  75. package/dist/chunk-J6UXXHBE.js +37 -0
  76. package/dist/chunk-J6UXXHBE.js.map +1 -0
  77. package/dist/chunk-JLZ4LZ4Z.js +22 -0
  78. package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
  79. package/dist/chunk-KIIFL4VM.js +274 -0
  80. package/dist/chunk-KIIFL4VM.js.map +1 -0
  81. package/dist/chunk-KVG3AYYR.js +99 -0
  82. package/dist/chunk-KVG3AYYR.js.map +1 -0
  83. package/dist/chunk-MBA4CLA5.js +45 -0
  84. package/dist/chunk-MBA4CLA5.js.map +1 -0
  85. package/dist/chunk-NE3QKDOB.cjs +24 -0
  86. package/dist/chunk-NE3QKDOB.cjs.map +1 -0
  87. package/dist/chunk-NVOPDXTA.cjs +95 -0
  88. package/dist/chunk-NVOPDXTA.cjs.map +1 -0
  89. package/dist/chunk-OH3QMAIB.js +11 -0
  90. package/dist/chunk-OH3QMAIB.js.map +1 -0
  91. package/dist/chunk-PHM3ZORG.cjs +110 -0
  92. package/dist/chunk-PHM3ZORG.cjs.map +1 -0
  93. package/dist/chunk-R5PXQNO3.cjs +209 -0
  94. package/dist/chunk-R5PXQNO3.cjs.map +1 -0
  95. package/dist/chunk-SLW7FRTL.cjs +285 -0
  96. package/dist/chunk-SLW7FRTL.cjs.map +1 -0
  97. package/dist/chunk-SVWRRALU.cjs +17 -0
  98. package/dist/chunk-SVWRRALU.cjs.map +1 -0
  99. package/dist/chunk-T43PQXJD.js +202 -0
  100. package/dist/chunk-T43PQXJD.js.map +1 -0
  101. package/dist/chunk-TIEAZYHF.cjs +225 -0
  102. package/dist/chunk-TIEAZYHF.cjs.map +1 -0
  103. package/dist/chunk-VBH3JLQ5.js +116 -0
  104. package/dist/chunk-VBH3JLQ5.js.map +1 -0
  105. package/dist/chunk-VF3D6KLQ.cjs +94 -0
  106. package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
  107. package/dist/chunk-VTQIHMF3.js +82 -0
  108. package/dist/chunk-VTQIHMF3.js.map +1 -0
  109. package/dist/chunk-W3JN3YIW.js +15 -0
  110. package/dist/chunk-W3JN3YIW.js.map +1 -0
  111. package/dist/chunk-WANILJZQ.cjs +87 -0
  112. package/dist/chunk-WANILJZQ.cjs.map +1 -0
  113. package/dist/chunk-XC4IBCI2.js +86 -0
  114. package/dist/chunk-XC4IBCI2.js.map +1 -0
  115. package/dist/chunk-YKEWWQEJ.js +165 -0
  116. package/dist/chunk-YKEWWQEJ.js.map +1 -0
  117. package/dist/chunk-YQL7NISX.cjs +515 -0
  118. package/dist/chunk-YQL7NISX.cjs.map +1 -0
  119. package/dist/chunk-ZB6SVBK4.js +89 -0
  120. package/dist/chunk-ZB6SVBK4.js.map +1 -0
  121. package/dist/combo/react.cjs +235 -0
  122. package/dist/combo/react.cjs.map +1 -0
  123. package/dist/combo/react.d.cts +148 -0
  124. package/dist/combo/react.d.ts +148 -0
  125. package/dist/combo/react.js +230 -0
  126. package/dist/combo/react.js.map +1 -0
  127. package/dist/combo.cjs +262 -0
  128. package/dist/combo.cjs.map +1 -0
  129. package/dist/combo.d.cts +139 -0
  130. package/dist/combo.d.ts +139 -0
  131. package/dist/combo.js +249 -0
  132. package/dist/combo.js.map +1 -0
  133. package/dist/config-CHjz7ZjZ.d.cts +57 -0
  134. package/dist/config-COjhIZTh.d.ts +57 -0
  135. package/dist/doctor.cjs +354 -0
  136. package/dist/doctor.cjs.map +1 -0
  137. package/dist/doctor.d.cts +177 -0
  138. package/dist/doctor.d.ts +177 -0
  139. package/dist/doctor.js +345 -0
  140. package/dist/doctor.js.map +1 -0
  141. package/dist/erc7677-DOW58QBE.d.cts +111 -0
  142. package/dist/erc7677-DOW58QBE.d.ts +111 -0
  143. package/dist/errors-CgX1vNj7.d.cts +100 -0
  144. package/dist/errors-CgX1vNj7.d.ts +100 -0
  145. package/dist/index.cjs +802 -0
  146. package/dist/index.cjs.map +1 -0
  147. package/dist/index.d.cts +2398 -0
  148. package/dist/index.d.ts +2398 -0
  149. package/dist/index.js +559 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/paymaster/server.cjs +38 -0
  152. package/dist/paymaster/server.cjs.map +1 -0
  153. package/dist/paymaster/server.d.cts +57 -0
  154. package/dist/paymaster/server.d.ts +57 -0
  155. package/dist/paymaster/server.js +36 -0
  156. package/dist/paymaster/server.js.map +1 -0
  157. package/dist/paymaster.cjs +356 -0
  158. package/dist/paymaster.cjs.map +1 -0
  159. package/dist/paymaster.d.cts +1851 -0
  160. package/dist/paymaster.d.ts +1851 -0
  161. package/dist/paymaster.js +289 -0
  162. package/dist/paymaster.js.map +1 -0
  163. package/dist/privy/react.cjs +48 -0
  164. package/dist/privy/react.cjs.map +1 -0
  165. package/dist/privy/react.d.cts +194 -0
  166. package/dist/privy/react.d.ts +194 -0
  167. package/dist/privy/react.js +7 -0
  168. package/dist/privy/react.js.map +1 -0
  169. package/dist/privy/server.cjs +43 -0
  170. package/dist/privy/server.cjs.map +1 -0
  171. package/dist/privy/server.d.cts +192 -0
  172. package/dist/privy/server.d.ts +192 -0
  173. package/dist/privy/server.js +6 -0
  174. package/dist/privy/server.js.map +1 -0
  175. package/dist/privy/wagmi.d.ts +90 -0
  176. package/dist/privy/wagmi.js +55 -0
  177. package/dist/privy/wagmi.js.map +1 -0
  178. package/dist/privy.cjs +34 -0
  179. package/dist/privy.cjs.map +1 -0
  180. package/dist/privy.d.cts +4 -0
  181. package/dist/privy.d.ts +4 -0
  182. package/dist/privy.js +5 -0
  183. package/dist/privy.js.map +1 -0
  184. package/dist/react.cjs +72 -0
  185. package/dist/react.cjs.map +1 -0
  186. package/dist/react.d.cts +66 -0
  187. package/dist/react.d.ts +66 -0
  188. package/dist/react.js +68 -0
  189. package/dist/react.js.map +1 -0
  190. package/dist/requirements-C-QiJkL9.d.cts +134 -0
  191. package/dist/requirements-C-QiJkL9.d.ts +134 -0
  192. package/dist/scope-DBRkN7bR.d.cts +94 -0
  193. package/dist/scope-DBRkN7bR.d.ts +94 -0
  194. package/dist/server.cjs +59 -0
  195. package/dist/server.cjs.map +1 -0
  196. package/dist/server.d.cts +208 -0
  197. package/dist/server.d.ts +208 -0
  198. package/dist/server.js +8 -0
  199. package/dist/server.js.map +1 -0
  200. package/dist/session/kernel.cjs +82 -0
  201. package/dist/session/kernel.cjs.map +1 -0
  202. package/dist/session/kernel.d.cts +131 -0
  203. package/dist/session/kernel.d.ts +131 -0
  204. package/dist/session/kernel.js +13 -0
  205. package/dist/session/kernel.js.map +1 -0
  206. package/dist/session/react.cjs +37 -0
  207. package/dist/session/react.cjs.map +1 -0
  208. package/dist/session/react.d.cts +119 -0
  209. package/dist/session/react.d.ts +119 -0
  210. package/dist/session/react.js +8 -0
  211. package/dist/session/react.js.map +1 -0
  212. package/dist/session/server.cjs +267 -0
  213. package/dist/session/server.cjs.map +1 -0
  214. package/dist/session/server.d.cts +151 -0
  215. package/dist/session/server.d.ts +151 -0
  216. package/dist/session/server.js +252 -0
  217. package/dist/session/server.js.map +1 -0
  218. package/dist/session.cjs +74 -0
  219. package/dist/session.cjs.map +1 -0
  220. package/dist/session.d.cts +3 -0
  221. package/dist/session.d.ts +3 -0
  222. package/dist/session.js +5 -0
  223. package/dist/session.js.map +1 -0
  224. package/dist/status-CmOsyPmO.d.cts +295 -0
  225. package/dist/status-DwkkOrGQ.d.ts +295 -0
  226. package/dist/store-CjmLgp9g.d.cts +64 -0
  227. package/dist/store-CjmLgp9g.d.ts +64 -0
  228. package/dist/types-BEEM7WdG.d.cts +25 -0
  229. package/dist/types-BEEM7WdG.d.ts +25 -0
  230. package/dist/types-BilBTDqK.d.cts +27 -0
  231. package/dist/types-BilBTDqK.d.ts +27 -0
  232. package/package.json +209 -3
@@ -0,0 +1,148 @@
1
+ import { Address, PublicClient } from 'viem';
2
+ import { P as PepuError } from '../errors-CgX1vNj7.js';
3
+ import { AuthFetch } from '../session/react.js';
4
+ import { KernelOwner } from '../aa/kernel.js';
5
+ import { a as KernelSessionScope, K as KernelSessionCall } from '../scope-DBRkN7bR.js';
6
+ export { S as SponsoredActResult } from '../types-BEEM7WdG.js';
7
+ import '@zerodev/sdk/types';
8
+ import '@zerodev/sdk';
9
+ import '../erc7677-DOW58QBE.js';
10
+ import '../types-BilBTDqK.js';
11
+ import '../calls-z_EQOtFb.js';
12
+
13
+ /**
14
+ * `@pepu-chain/sdk/combo/react` (browser): hooks for the combined flow. Google
15
+ * sign-in (Privy), ONE owner signature for an on-chain session, then actions
16
+ * with no popup and no gas. Pairs with `createSponsoredSessionRoutes` from
17
+ * `@pepu-chain/sdk/combo`.
18
+ *
19
+ * Extracted from templates/sponsored-session-app/components/session-flow.tsx.
20
+ * The browser's only signing job is the grant; everything after it is a request
21
+ * to your own server, authenticated by the Privy access token.
22
+ *
23
+ * Needs `react`, `@privy-io/react-auth` and the `@zerodev/*` peers.
24
+ */
25
+ /** The routes {@link useSponsoredSession} calls. */
26
+ interface SponsoredSessionEndpoints {
27
+ prepare: string;
28
+ activate: string;
29
+ status: string;
30
+ act: string;
31
+ revoke: string;
32
+ }
33
+ /** Defaults match the `app/api/session/<name>/route.ts` convention. */
34
+ declare const DEFAULT_SESSION_ENDPOINTS: SponsoredSessionEndpoints;
35
+ /** Where the session flow is, for rendering. */
36
+ type SponsoredSessionPhase = "signed-out" | "provisioning" | "ready" | "granting" | "active" | "expired" | "error";
37
+ /**
38
+ * Derive the phase from plain inputs. Pure.
39
+ *
40
+ * - not signed in: `signed-out`; signed in without an embedded wallet: `provisioning`
41
+ * - a grant in flight: `granting`
42
+ * - an expiry that has passed: `expired`; one still ahead: `active`
43
+ * - an error with nothing active: `error`; otherwise `ready`
44
+ *
45
+ * @example
46
+ * deriveSessionPhase({ authenticated: true, hasWallet: true, validUntil: 100, nowSeconds: 200 }); // "expired"
47
+ */
48
+ declare function deriveSessionPhase(p: {
49
+ authenticated: boolean;
50
+ hasWallet: boolean;
51
+ /** The last expiry the server reported for an active session, if any. */
52
+ validUntil?: number | undefined;
53
+ nowSeconds: number;
54
+ granting?: boolean;
55
+ hasError?: boolean;
56
+ }): SponsoredSessionPhase;
57
+ /** What the server's `prepare` route returns. */
58
+ interface PreparedSession {
59
+ ownerAddress: Address;
60
+ kernelAddress: Address;
61
+ sessionKeyAddress: Address;
62
+ validUntil: number;
63
+ minutes: number;
64
+ scope: KernelSessionScope;
65
+ }
66
+ /** What the server's `status` route returns. */
67
+ type SponsoredSessionStatus = {
68
+ active: false;
69
+ } | {
70
+ active: true;
71
+ validUntil: number;
72
+ kernelAddress: Address;
73
+ ownerAddress: Address;
74
+ sessionKeyAddress: Address;
75
+ actions: number;
76
+ };
77
+ /**
78
+ * The grant, outside React: ask the server to `prepare` a session key, have
79
+ * `owner` sign the ONE EIP-712 approval (no gas), then `activate`. Rebuilds
80
+ * the policies from `scope` and the server's expiry; the server checks the
81
+ * resulting permission id matches what it issued, so a different scope is
82
+ * rejected with `SESSION_APPROVAL_MISMATCH`.
83
+ *
84
+ * @example
85
+ * const prepared = await grantKernelSession({ authFetch, publicClient, owner: walletClient, scope });
86
+ */
87
+ declare function grantKernelSession(p: {
88
+ authFetch: AuthFetch;
89
+ publicClient: PublicClient;
90
+ owner: KernelOwner;
91
+ scope: {
92
+ calls: readonly KernelSessionCall[];
93
+ };
94
+ endpoints?: Partial<SponsoredSessionEndpoints>;
95
+ }): Promise<PreparedSession>;
96
+ /** Options for {@link useSponsoredSession}. */
97
+ interface UseSponsoredSessionOptions {
98
+ /** The same scope the server uses. The browser rebuilds the policies from it. */
99
+ scope: {
100
+ calls: readonly KernelSessionCall[];
101
+ };
102
+ endpoints?: Partial<SponsoredSessionEndpoints>;
103
+ /** Default `usePepuAuthFetch()` (Privy bearer token). */
104
+ authFetch?: AuthFetch;
105
+ /** Default: a viem client on the PEPU RPC. */
106
+ publicClient?: PublicClient;
107
+ /** Re-poll the status route this often. Default 0 (only on mount and after actions). */
108
+ pollMs?: number;
109
+ }
110
+ /**
111
+ * The whole session flow for a component.
112
+ *
113
+ * - `grant()`: prepare, ONE owner signature through the Privy embedded wallet
114
+ * (no gas), activate.
115
+ * - `act(input)`: POST the act route. No popup, no gas.
116
+ * - `revoke()`: deletes the server-side key right away. The on-chain grant
117
+ * lapses at its expiry; only the deleted key could ever use it.
118
+ * - `smartAccount` is the Kernel address that sends and holds assets (a read,
119
+ * known before any session exists); `owner` is the embedded wallet that signs.
120
+ *
121
+ * @example
122
+ * const { phase, grant, act, revoke, smartAccount, expiresAt, error } = useSponsoredSession<{}, { transactionHash: string }>({
123
+ * scope: { calls: [{ target: tapScore, abi: tapScoreAbi, functionName: "tap" }] },
124
+ * });
125
+ * if (phase === "ready") return <button onClick={grant}>Start session</button>;
126
+ */
127
+ declare function useSponsoredSession<I = undefined, O = unknown>(o: UseSponsoredSessionOptions): {
128
+ phase: SponsoredSessionPhase;
129
+ /**
130
+ * True while a signed-in user with a wallet has not yet had the first status
131
+ * response (or failure). While true, `phase` is `ready` only because nothing
132
+ * is known yet: render a spinner instead of the "start a session" card.
133
+ */
134
+ statusLoading: boolean;
135
+ owner?: Address;
136
+ smartAccount?: Address;
137
+ scope?: KernelSessionScope;
138
+ expiresAt?: number;
139
+ /** Successful actions in this session, as counted by the server. */
140
+ actions?: number;
141
+ grant(): Promise<void>;
142
+ act(input?: I): Promise<O>;
143
+ revoke(): Promise<void>;
144
+ refetch(): void;
145
+ error?: PepuError;
146
+ };
147
+
148
+ export { DEFAULT_SESSION_ENDPOINTS, type PreparedSession, type SponsoredSessionEndpoints, type SponsoredSessionPhase, type SponsoredSessionStatus, type UseSponsoredSessionOptions, deriveSessionPhase, grantKernelSession, useSponsoredSession };
@@ -0,0 +1,230 @@
1
+ import { errorFromResponse } from '../chunk-T43PQXJD.js';
2
+ import { approveKernelSession, buildKernelSessionPolicies } from '../chunk-KVG3AYYR.js';
3
+ import { getKernelAddress } from '../chunk-ZB6SVBK4.js';
4
+ import '../chunk-IB2FSPMJ.js';
5
+ import '../chunk-VBH3JLQ5.js';
6
+ import '../chunk-IY3ALPUJ.js';
7
+ import '../chunk-D52PADVY.js';
8
+ import { useEmbeddedWallet, usePepuAuthFetch } from '../chunk-EHBPIYY4.js';
9
+ import '../chunk-JLZ4LZ4Z.js';
10
+ import { describeKernelSessionScope } from '../chunk-ESMNAXUI.js';
11
+ import { getPublicClient } from '../chunk-OH3QMAIB.js';
12
+ import '../chunk-J6UXXHBE.js';
13
+ import '../chunk-XC4IBCI2.js';
14
+ import { pepuMainnet } from '../chunk-VTQIHMF3.js';
15
+ import '../chunk-3XUGQODR.js';
16
+ import { toPepuError, PepuAuthError } from '../chunk-6DSZ4Z2N.js';
17
+ import { usePrivy } from '@privy-io/react-auth';
18
+ import { useCallback, useRef, useState, useEffect } from 'react';
19
+ import { createWalletClient, custom } from 'viem';
20
+
21
+ var DEFAULT_SESSION_ENDPOINTS = {
22
+ prepare: "/api/session/prepare",
23
+ activate: "/api/session/activate",
24
+ status: "/api/session/status",
25
+ act: "/api/session/act",
26
+ revoke: "/api/session/revoke"
27
+ };
28
+ function deriveSessionPhase(p) {
29
+ if (!p.authenticated) return "signed-out";
30
+ if (!p.hasWallet) return "provisioning";
31
+ if (p.granting) return "granting";
32
+ if (p.validUntil !== void 0) return p.nowSeconds < p.validUntil ? "active" : "expired";
33
+ return p.hasError ? "error" : "ready";
34
+ }
35
+ async function postJson(authFetch, url, body) {
36
+ const res = await authFetch(url, {
37
+ method: "POST",
38
+ ...body === void 0 ? {} : { headers: { "content-type": "application/json" }, body: JSON.stringify(body) }
39
+ });
40
+ if (!res.ok) throw await errorFromResponse(res);
41
+ return await res.json();
42
+ }
43
+ async function grantKernelSession(p) {
44
+ const ep = { ...DEFAULT_SESSION_ENDPOINTS, ...p.endpoints };
45
+ const prepared = await postJson(p.authFetch, ep.prepare);
46
+ const { approval } = await approveKernelSession({
47
+ publicClient: p.publicClient,
48
+ owner: p.owner,
49
+ sessionKeyAddress: prepared.sessionKeyAddress,
50
+ policies: buildKernelSessionPolicies({ calls: p.scope.calls, validUntil: prepared.validUntil })
51
+ });
52
+ await postJson(p.authFetch, ep.activate, { approval });
53
+ return prepared;
54
+ }
55
+ var sharedClient;
56
+ function defaultPublicClient() {
57
+ sharedClient ??= getPublicClient(pepuMainnet);
58
+ return sharedClient;
59
+ }
60
+ function useSponsoredSession(o) {
61
+ const { authenticated, ready: privyReady } = usePrivy();
62
+ const { wallet, address: owner } = useEmbeddedWallet();
63
+ const pepuAuthFetch = usePepuAuthFetch();
64
+ const customFetch = o.authFetch;
65
+ const authFetch = useCallback(
66
+ (url, init) => customFetch ? customFetch(url, init) : pepuAuthFetch(url, init),
67
+ [customFetch, pepuAuthFetch]
68
+ );
69
+ const endpointsRef = useRef({ ...DEFAULT_SESSION_ENDPOINTS, ...o.endpoints });
70
+ endpointsRef.current = { ...DEFAULT_SESSION_ENDPOINTS, ...o.endpoints };
71
+ const scopeRef = useRef(o.scope);
72
+ scopeRef.current = o.scope;
73
+ const publicClient = o.publicClient ?? defaultPublicClient();
74
+ const [smartAccount, setSmartAccount] = useState();
75
+ const [status, setStatus] = useState();
76
+ const [statusChecked, setStatusChecked] = useState(false);
77
+ const [prepared, setPrepared] = useState();
78
+ const [granting, setGranting] = useState(false);
79
+ const [error, setError] = useState();
80
+ const [now, setNow] = useState(() => Math.floor(Date.now() / 1e3));
81
+ const [tick, setTick] = useState(0);
82
+ const refetch = useCallback(() => setTick((t) => t + 1), []);
83
+ const [lastValidUntil, setLastValidUntil] = useState();
84
+ const grantInFlight = useRef(false);
85
+ useEffect(() => {
86
+ if (!owner) {
87
+ setSmartAccount(void 0);
88
+ return;
89
+ }
90
+ let cancelled = false;
91
+ getKernelAddress(publicClient, owner).then((a) => {
92
+ if (!cancelled) setSmartAccount(a);
93
+ }).catch((e) => {
94
+ if (!cancelled) setError(toPepuError(e, { op: "derive smart account" }));
95
+ });
96
+ return () => {
97
+ cancelled = true;
98
+ };
99
+ }, [owner, publicClient]);
100
+ useEffect(() => {
101
+ if (!authenticated || !owner) return;
102
+ let cancelled = false;
103
+ void (async () => {
104
+ try {
105
+ const res = await authFetch(endpointsRef.current.status);
106
+ if (!res.ok) throw await errorFromResponse(res);
107
+ const body = await res.json();
108
+ if (cancelled) return;
109
+ setStatus(body);
110
+ if (body.active) setLastValidUntil(body.validUntil);
111
+ } catch (e) {
112
+ if (!cancelled) setError(toPepuError(e, { op: "session status" }));
113
+ } finally {
114
+ if (!cancelled) setStatusChecked(true);
115
+ }
116
+ })();
117
+ return () => {
118
+ cancelled = true;
119
+ };
120
+ }, [authenticated, owner, authFetch, tick]);
121
+ useEffect(() => {
122
+ const id = setInterval(() => setNow(Math.floor(Date.now() / 1e3)), 1e3);
123
+ return () => clearInterval(id);
124
+ }, []);
125
+ useEffect(() => {
126
+ if (!o.pollMs || o.pollMs <= 0) return;
127
+ const id = setInterval(refetch, o.pollMs);
128
+ return () => clearInterval(id);
129
+ }, [o.pollMs, refetch]);
130
+ const grant = useCallback(async () => {
131
+ if (grantInFlight.current) return;
132
+ grantInFlight.current = true;
133
+ setGranting(true);
134
+ setError(void 0);
135
+ try {
136
+ if (!wallet || !owner) {
137
+ throw new PepuAuthError("WALLET_NOT_PROVISIONED", "No embedded wallet to sign the session grant.");
138
+ }
139
+ const provider = await wallet.getEthereumProvider();
140
+ const walletClient = createWalletClient({
141
+ account: owner,
142
+ chain: pepuMainnet,
143
+ transport: custom(provider)
144
+ });
145
+ const result = await grantKernelSession({
146
+ authFetch,
147
+ publicClient,
148
+ owner: walletClient,
149
+ scope: scopeRef.current,
150
+ endpoints: endpointsRef.current
151
+ });
152
+ setPrepared(result);
153
+ setLastValidUntil(result.validUntil);
154
+ setStatus({
155
+ active: true,
156
+ validUntil: result.validUntil,
157
+ kernelAddress: result.kernelAddress,
158
+ ownerAddress: result.ownerAddress,
159
+ sessionKeyAddress: result.sessionKeyAddress,
160
+ actions: 0
161
+ });
162
+ } catch (e) {
163
+ setError(toPepuError(e, { op: "session grant" }));
164
+ } finally {
165
+ grantInFlight.current = false;
166
+ setGranting(false);
167
+ }
168
+ }, [wallet, owner, authFetch, publicClient]);
169
+ const act = useCallback(
170
+ async (input) => {
171
+ try {
172
+ const out = await postJson(authFetch, endpointsRef.current.act, input === void 0 ? {} : input);
173
+ setError(void 0);
174
+ refetch();
175
+ return out;
176
+ } catch (e) {
177
+ const err = toPepuError(e, { op: "session act" });
178
+ setError(err);
179
+ if (err.code === "SESSION_NONE") {
180
+ setStatus({ active: false });
181
+ setLastValidUntil(void 0);
182
+ }
183
+ throw err;
184
+ }
185
+ },
186
+ [authFetch, refetch]
187
+ );
188
+ const revoke = useCallback(async () => {
189
+ try {
190
+ await postJson(authFetch, endpointsRef.current.revoke);
191
+ setStatus({ active: false });
192
+ setLastValidUntil(void 0);
193
+ setPrepared(void 0);
194
+ setError(void 0);
195
+ } catch (e) {
196
+ const err = toPepuError(e, { op: "session revoke" });
197
+ setError(err);
198
+ throw err;
199
+ }
200
+ }, [authFetch]);
201
+ const phase = deriveSessionPhase({
202
+ authenticated: privyReady ? authenticated : false,
203
+ hasWallet: owner !== void 0,
204
+ validUntil: status?.active ? status.validUntil : lastValidUntil,
205
+ nowSeconds: now,
206
+ granting,
207
+ hasError: error !== void 0
208
+ });
209
+ const expiresAt = status?.active ? status.validUntil : lastValidUntil;
210
+ const scope = prepared?.scope ?? (expiresAt !== void 0 ? describeKernelSessionScope({ calls: o.scope.calls, validUntil: expiresAt }) : void 0);
211
+ const statusLoading = privyReady && authenticated && owner !== void 0 && !statusChecked && status === void 0;
212
+ return {
213
+ phase,
214
+ statusLoading,
215
+ ...owner ? { owner } : {},
216
+ ...smartAccount ? { smartAccount } : {},
217
+ ...scope ? { scope } : {},
218
+ ...expiresAt !== void 0 ? { expiresAt } : {},
219
+ ...status?.active ? { actions: status.actions } : {},
220
+ grant,
221
+ act,
222
+ revoke,
223
+ refetch,
224
+ ...error ? { error } : {}
225
+ };
226
+ }
227
+
228
+ export { DEFAULT_SESSION_ENDPOINTS, deriveSessionPhase, grantKernelSession, useSponsoredSession };
229
+ //# sourceMappingURL=react.js.map
230
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/combo/react.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAyCO,IAAM,yBAAA,GAAuD;AAAA,EAClE,OAAA,EAAS,sBAAA;AAAA,EACT,QAAA,EAAU,uBAAA;AAAA,EACV,MAAA,EAAQ,qBAAA;AAAA,EACR,GAAA,EAAK,kBAAA;AAAA,EACL,MAAA,EAAQ;AACV;AAuBO,SAAS,mBAAmB,CAAA,EAQT;AACxB,EAAA,IAAI,CAAC,CAAA,CAAE,aAAA,EAAe,OAAO,YAAA;AAC7B,EAAA,IAAI,CAAC,CAAA,CAAE,SAAA,EAAW,OAAO,cAAA;AACzB,EAAA,IAAI,CAAA,CAAE,UAAU,OAAO,UAAA;AACvB,EAAA,IAAI,CAAA,CAAE,eAAe,MAAA,EAAW,OAAO,EAAE,UAAA,GAAa,CAAA,CAAE,aAAa,QAAA,GAAW,SAAA;AAChF,EAAA,OAAO,CAAA,CAAE,WAAW,OAAA,GAAU,OAAA;AAChC;AAwBA,eAAe,QAAA,CAAY,SAAA,EAAsB,GAAA,EAAa,IAAA,EAA4B;AACxF,EAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,GAAA,EAAK;AAAA,IAC/B,MAAA,EAAQ,MAAA;AAAA,IACR,GAAI,IAAA,KAAS,MAAA,GACT,KACA,EAAE,OAAA,EAAS,EAAE,cAAA,EAAgB,oBAAmB,EAAG,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAE,GACnF,CAAA;AACD,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,MAAM,kBAAkB,GAAG,CAAA;AAC9C,EAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AACzB;AAYA,eAAsB,mBAAmB,CAAA,EAMZ;AAC3B,EAAA,MAAM,KAAK,EAAE,GAAG,yBAAA,EAA2B,GAAG,EAAE,SAAA,EAAU;AAC1D,EAAA,MAAM,WAAW,MAAM,QAAA,CAA0B,CAAA,CAAE,SAAA,EAAW,GAAG,OAAO,CAAA;AACxE,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,oBAAA,CAAqB;AAAA,IAC9C,cAAc,CAAA,CAAE,YAAA;AAAA,IAChB,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,mBAAmB,QAAA,CAAS,iBAAA;AAAA,IAC5B,QAAA,EAAU,0BAAA,CAA2B,EAAE,KAAA,EAAO,CAAA,CAAE,MAAM,KAAA,EAAO,UAAA,EAAY,QAAA,CAAS,UAAA,EAAY;AAAA,GAC/F,CAAA;AACD,EAAA,MAAM,SAA+C,CAAA,CAAE,SAAA,EAAW,GAAG,QAAA,EAAU,EAAE,UAAU,CAAA;AAC3F,EAAA,OAAO,QAAA;AACT;AAeA,IAAI,YAAA;AACJ,SAAS,mBAAA,GAAoC;AAC3C,EAAA,YAAA,KAAiB,gBAAgB,WAAW,CAAA;AAC5C,EAAA,OAAO,YAAA;AACT;AAmBO,SAAS,oBACd,CAAA,EAoBA;AACA,EAAA,MAAM,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,KAAe,QAAA,EAAS;AACtD,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,KAAU,iBAAA,EAAkB;AACrD,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AACvC,EAAA,MAAM,cAAc,CAAA,CAAE,SAAA;AACtB,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,GAAA,EAAK,IAAA,KAAU,WAAA,GAAc,WAAA,CAAY,KAAK,IAAI,CAAA,GAAI,aAAA,CAAc,GAAA,EAAK,IAAI,CAAA;AAAA,IAC9E,CAAC,aAAa,aAAa;AAAA,GAC7B;AACA,EAAA,MAAM,YAAA,GAAe,OAAO,EAAE,GAAG,2BAA2B,GAAG,CAAA,CAAE,WAAW,CAAA;AAC5E,EAAA,YAAA,CAAa,UAAU,EAAE,GAAG,yBAAA,EAA2B,GAAG,EAAE,SAAA,EAAU;AACtE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AAC/B,EAAA,QAAA,CAAS,UAAU,CAAA,CAAE,KAAA;AACrB,EAAA,MAAM,YAAA,GAAe,CAAA,CAAE,YAAA,IAAgB,mBAAA,EAAoB;AAE3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA,EAA8B;AACtE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,EAA6C;AACzE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAsC;AACtE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAgC;AAC1D,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,QAAA,CAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAClE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAM,OAAA,CAAQ,CAAC,MAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAG3D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA,EAA6B;AACzE,EAAA,MAAM,aAAA,GAAgB,OAAO,KAAK,CAAA;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,eAAA,CAAgB,MAAS,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,gBAAA,CAAiB,YAAA,EAAc,KAAK,CAAA,CACjC,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,CAAC,SAAA,EAAW,eAAA,CAAgB,CAAC,CAAA;AAAA,IACnC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,CAAA,KAAe;AACrB,MAAA,IAAI,CAAC,WAAW,QAAA,CAAS,WAAA,CAAY,GAAG,EAAE,EAAA,EAAI,sBAAA,EAAwB,CAAC,CAAA;AAAA,IACzE,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,YAAY,CAAC,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,KAAA,EAAO;AAC9B,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,YAAA,CAAa,QAAQ,MAAM,CAAA;AACvD,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,MAAM,kBAAkB,GAAG,CAAA;AAC9C,QAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA;AAAA,MACpD,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAC,WAAW,QAAA,CAAS,WAAA,CAAY,GAAG,EAAE,EAAA,EAAI,gBAAA,EAAkB,CAAC,CAAA;AAAA,MACnE,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,KAAA,EAAO,SAAA,EAAW,IAAI,CAAC,CAAA;AAE1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA,EAAG,GAAI,CAAA;AACxE,IAAA,OAAO,MAAM,cAAc,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,UAAU,CAAA,EAAG;AAChC,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AACxC,IAAA,OAAO,MAAM,cAAc,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,KAAA,GAAQ,YAAY,YAA2B;AACnD,IAAA,IAAI,cAAc,OAAA,EAAS;AAC3B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,QAAA,CAAS,MAAS,CAAA;AAClB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,EAAO;AACrB,QAAA,MAAM,IAAI,aAAA,CAAc,wBAAA,EAA0B,+CAA+C,CAAA;AAAA,MACnG;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,mBAAA,EAAoB;AAClD,MAAA,MAAM,eAAe,kBAAA,CAAmB;AAAA,QACtC,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAW,OAAO,QAAQ;AAAA,OAC3B,CAAA;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB;AAAA,QACtC,SAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP,OAAO,QAAA,CAAS,OAAA;AAAA,QAChB,WAAW,YAAA,CAAa;AAAA,OACzB,CAAA;AACD,MAAA,WAAA,CAAY,MAAM,CAAA;AAClB,MAAA,iBAAA,CAAkB,OAAO,UAAU,CAAA;AACnC,MAAA,SAAA,CAAU;AAAA,QACR,MAAA,EAAQ,IAAA;AAAA,QACR,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,QAC1B,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAA,QAAA,CAAS,YAAY,CAAA,EAAG,EAAE,EAAA,EAAI,eAAA,EAAiB,CAAC,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,YAAY,CAAC,CAAA;AAE3C,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,OAAO,KAAA,KAA0B;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAY,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,KAAA,KAAU,KAAA,CAAA,GAAY,EAAC,GAAI,KAAK,CAAA;AACnG,QAAA,QAAA,CAAS,KAAA,CAAS,CAAA;AAClB,QAAA,OAAA,EAAQ;AACR,QAAA,OAAO,GAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,MAAM,MAAM,WAAA,CAAY,CAAA,EAAG,EAAE,EAAA,EAAI,eAAe,CAAA;AAChD,QAAA,QAAA,CAAS,GAAG,CAAA;AAEZ,QAAA,IAAI,GAAA,CAAI,SAAS,cAAA,EAAgB;AAC/B,UAAA,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAC3B,UAAA,iBAAA,CAAkB,MAAS,CAAA;AAAA,QAC7B;AACA,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW,OAAO;AAAA,GACrB;AAEA,EAAA,MAAM,MAAA,GAAS,YAAY,YAA2B;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAA4B,SAAA,EAAW,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AACxE,MAAA,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAC3B,MAAA,iBAAA,CAAkB,KAAA,CAAS,CAAA;AAC3B,MAAA,WAAA,CAAY,KAAA,CAAS,CAAA;AACrB,MAAA,QAAA,CAAS,KAAA,CAAS,CAAA;AAAA,IACpB,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,MAAM,WAAA,CAAY,CAAA,EAAG,EAAE,EAAA,EAAI,kBAAkB,CAAA;AACnD,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,QAAQ,kBAAA,CAAmB;AAAA,IAC/B,aAAA,EAAe,aAAa,aAAA,GAAgB,KAAA;AAAA,IAC5C,WAAW,KAAA,KAAU,MAAA;AAAA,IACrB,UAAA,EAAY,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,UAAA,GAAa,cAAA;AAAA,IACjD,UAAA,EAAY,GAAA;AAAA,IACZ,QAAA;AAAA,IACA,UAAU,KAAA,KAAU;AAAA,GACrB,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,MAAA,GAAS,MAAA,CAAO,UAAA,GAAa,cAAA;AACvD,EAAA,MAAM,KAAA,GACJ,QAAA,EAAU,KAAA,KACT,SAAA,KAAc,SACX,0BAAA,CAA2B,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,CAAA,GAC1E,MAAA,CAAA;AAEN,EAAA,MAAM,gBAAgB,UAAA,IAAc,aAAA,IAAiB,UAAU,MAAA,IAAa,CAAC,iBAAiB,MAAA,KAAW,MAAA;AAEzG,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,IACzB,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,IACvC,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,IACzB,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IAC/C,GAAI,QAAQ,MAAA,GAAS,EAAE,SAAS,MAAA,CAAO,OAAA,KAAY,EAAC;AAAA,IACpD,KAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,GAC3B;AACF","file":"react.js","sourcesContent":["import { usePrivy } from \"@privy-io/react-auth\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createWalletClient, custom } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\nimport { pepuMainnet } from \"../chains.js\";\nimport { getPublicClient } from \"../client.js\";\nimport { PepuAuthError, toPepuError } from \"../errors.js\";\nimport type { PepuError } from \"../errors.js\";\nimport { usePepuAuthFetch, useEmbeddedWallet } from \"../privy/react.js\";\nimport { errorFromResponse } from \"../session/react.js\";\nimport type { AuthFetch } from \"../session/react.js\";\nimport { approveKernelSession, buildKernelSessionPolicies, getKernelAddress } from \"../session/kernel.js\";\nimport type { KernelOwner } from \"../session/kernel.js\";\nimport { describeKernelSessionScope } from \"../session/scope.js\";\nimport type { KernelSessionCall, KernelSessionScope } from \"../session/scope.js\";\n\nexport type { SponsoredActResult } from \"./types.js\";\n\n/**\n * `@pepu-chain/sdk/combo/react` (browser): hooks for the combined flow. Google\n * sign-in (Privy), ONE owner signature for an on-chain session, then actions\n * with no popup and no gas. Pairs with `createSponsoredSessionRoutes` from\n * `@pepu-chain/sdk/combo`.\n *\n * Extracted from templates/sponsored-session-app/components/session-flow.tsx.\n * The browser's only signing job is the grant; everything after it is a request\n * to your own server, authenticated by the Privy access token.\n *\n * Needs `react`, `@privy-io/react-auth` and the `@zerodev/*` peers.\n */\n\n/** The routes {@link useSponsoredSession} calls. */\nexport interface SponsoredSessionEndpoints {\n prepare: string;\n activate: string;\n status: string;\n act: string;\n revoke: string;\n}\n\n/** Defaults match the `app/api/session/<name>/route.ts` convention. */\nexport const DEFAULT_SESSION_ENDPOINTS: SponsoredSessionEndpoints = {\n prepare: \"/api/session/prepare\",\n activate: \"/api/session/activate\",\n status: \"/api/session/status\",\n act: \"/api/session/act\",\n revoke: \"/api/session/revoke\",\n};\n\n/** Where the session flow is, for rendering. */\nexport type SponsoredSessionPhase =\n | \"signed-out\"\n | \"provisioning\"\n | \"ready\"\n | \"granting\"\n | \"active\"\n | \"expired\"\n | \"error\";\n\n/**\n * Derive the phase from plain inputs. Pure.\n *\n * - not signed in: `signed-out`; signed in without an embedded wallet: `provisioning`\n * - a grant in flight: `granting`\n * - an expiry that has passed: `expired`; one still ahead: `active`\n * - an error with nothing active: `error`; otherwise `ready`\n *\n * @example\n * deriveSessionPhase({ authenticated: true, hasWallet: true, validUntil: 100, nowSeconds: 200 }); // \"expired\"\n */\nexport function deriveSessionPhase(p: {\n authenticated: boolean;\n hasWallet: boolean;\n /** The last expiry the server reported for an active session, if any. */\n validUntil?: number | undefined;\n nowSeconds: number;\n granting?: boolean;\n hasError?: boolean;\n}): SponsoredSessionPhase {\n if (!p.authenticated) return \"signed-out\";\n if (!p.hasWallet) return \"provisioning\";\n if (p.granting) return \"granting\";\n if (p.validUntil !== undefined) return p.nowSeconds < p.validUntil ? \"active\" : \"expired\";\n return p.hasError ? \"error\" : \"ready\";\n}\n\n/** What the server's `prepare` route returns. */\nexport interface PreparedSession {\n ownerAddress: Address;\n kernelAddress: Address;\n sessionKeyAddress: Address;\n validUntil: number;\n minutes: number;\n scope: KernelSessionScope;\n}\n\n/** What the server's `status` route returns. */\nexport type SponsoredSessionStatus =\n | { active: false }\n | {\n active: true;\n validUntil: number;\n kernelAddress: Address;\n ownerAddress: Address;\n sessionKeyAddress: Address;\n actions: number;\n };\n\nasync function postJson<T>(authFetch: AuthFetch, url: string, body?: unknown): Promise<T> {\n const res = await authFetch(url, {\n method: \"POST\",\n ...(body === undefined\n ? {}\n : { headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(body) }),\n });\n if (!res.ok) throw await errorFromResponse(res);\n return (await res.json()) as T;\n}\n\n/**\n * The grant, outside React: ask the server to `prepare` a session key, have\n * `owner` sign the ONE EIP-712 approval (no gas), then `activate`. Rebuilds\n * the policies from `scope` and the server's expiry; the server checks the\n * resulting permission id matches what it issued, so a different scope is\n * rejected with `SESSION_APPROVAL_MISMATCH`.\n *\n * @example\n * const prepared = await grantKernelSession({ authFetch, publicClient, owner: walletClient, scope });\n */\nexport async function grantKernelSession(p: {\n authFetch: AuthFetch;\n publicClient: PublicClient;\n owner: KernelOwner;\n scope: { calls: readonly KernelSessionCall[] };\n endpoints?: Partial<SponsoredSessionEndpoints>;\n}): Promise<PreparedSession> {\n const ep = { ...DEFAULT_SESSION_ENDPOINTS, ...p.endpoints };\n const prepared = await postJson<PreparedSession>(p.authFetch, ep.prepare);\n const { approval } = await approveKernelSession({\n publicClient: p.publicClient,\n owner: p.owner,\n sessionKeyAddress: prepared.sessionKeyAddress,\n policies: buildKernelSessionPolicies({ calls: p.scope.calls, validUntil: prepared.validUntil }),\n });\n await postJson<{ active: true; validUntil: number }>(p.authFetch, ep.activate, { approval });\n return prepared;\n}\n\n/** Options for {@link useSponsoredSession}. */\nexport interface UseSponsoredSessionOptions {\n /** The same scope the server uses. The browser rebuilds the policies from it. */\n scope: { calls: readonly KernelSessionCall[] };\n endpoints?: Partial<SponsoredSessionEndpoints>;\n /** Default `usePepuAuthFetch()` (Privy bearer token). */\n authFetch?: AuthFetch;\n /** Default: a viem client on the PEPU RPC. */\n publicClient?: PublicClient;\n /** Re-poll the status route this often. Default 0 (only on mount and after actions). */\n pollMs?: number;\n}\n\nlet sharedClient: PublicClient | undefined;\nfunction defaultPublicClient(): PublicClient {\n sharedClient ??= getPublicClient(pepuMainnet) as unknown as PublicClient;\n return sharedClient;\n}\n\n/**\n * The whole session flow for a component.\n *\n * - `grant()`: prepare, ONE owner signature through the Privy embedded wallet\n * (no gas), activate.\n * - `act(input)`: POST the act route. No popup, no gas.\n * - `revoke()`: deletes the server-side key right away. The on-chain grant\n * lapses at its expiry; only the deleted key could ever use it.\n * - `smartAccount` is the Kernel address that sends and holds assets (a read,\n * known before any session exists); `owner` is the embedded wallet that signs.\n *\n * @example\n * const { phase, grant, act, revoke, smartAccount, expiresAt, error } = useSponsoredSession<{}, { transactionHash: string }>({\n * scope: { calls: [{ target: tapScore, abi: tapScoreAbi, functionName: \"tap\" }] },\n * });\n * if (phase === \"ready\") return <button onClick={grant}>Start session</button>;\n */\nexport function useSponsoredSession<I = undefined, O = unknown>(\n o: UseSponsoredSessionOptions,\n): {\n phase: SponsoredSessionPhase;\n /**\n * True while a signed-in user with a wallet has not yet had the first status\n * response (or failure). While true, `phase` is `ready` only because nothing\n * is known yet: render a spinner instead of the \"start a session\" card.\n */\n statusLoading: boolean;\n owner?: Address;\n smartAccount?: Address;\n scope?: KernelSessionScope;\n expiresAt?: number;\n /** Successful actions in this session, as counted by the server. */\n actions?: number;\n grant(): Promise<void>;\n act(input?: I): Promise<O>;\n revoke(): Promise<void>;\n refetch(): void;\n error?: PepuError;\n} {\n const { authenticated, ready: privyReady } = usePrivy();\n const { wallet, address: owner } = useEmbeddedWallet();\n const pepuAuthFetch = usePepuAuthFetch();\n const customFetch = o.authFetch;\n const authFetch = useCallback<AuthFetch>(\n (url, init) => (customFetch ? customFetch(url, init) : pepuAuthFetch(url, init)),\n [customFetch, pepuAuthFetch],\n );\n const endpointsRef = useRef({ ...DEFAULT_SESSION_ENDPOINTS, ...o.endpoints });\n endpointsRef.current = { ...DEFAULT_SESSION_ENDPOINTS, ...o.endpoints };\n const scopeRef = useRef(o.scope);\n scopeRef.current = o.scope;\n const publicClient = o.publicClient ?? defaultPublicClient();\n\n const [smartAccount, setSmartAccount] = useState<Address | undefined>();\n const [status, setStatus] = useState<SponsoredSessionStatus | undefined>();\n const [statusChecked, setStatusChecked] = useState(false);\n const [prepared, setPrepared] = useState<PreparedSession | undefined>();\n const [granting, setGranting] = useState(false);\n const [error, setError] = useState<PepuError | undefined>();\n const [now, setNow] = useState(() => Math.floor(Date.now() / 1000));\n const [tick, setTick] = useState(0);\n const refetch = useCallback(() => setTick((t) => t + 1), []);\n // The last expiry seen for an active session. The server reports\n // `{ active: false }` once it passes, so this is what makes `expired`.\n const [lastValidUntil, setLastValidUntil] = useState<number | undefined>();\n const grantInFlight = useRef(false);\n\n // The Kernel address depends only on the owner: known before any session.\n useEffect(() => {\n if (!owner) {\n setSmartAccount(undefined);\n return;\n }\n let cancelled = false;\n getKernelAddress(publicClient, owner)\n .then((a) => {\n if (!cancelled) setSmartAccount(a);\n })\n .catch((e: unknown) => {\n if (!cancelled) setError(toPepuError(e, { op: \"derive smart account\" }));\n });\n return () => {\n cancelled = true;\n };\n }, [owner, publicClient]);\n\n useEffect(() => {\n if (!authenticated || !owner) return;\n let cancelled = false;\n void (async () => {\n try {\n const res = await authFetch(endpointsRef.current.status);\n if (!res.ok) throw await errorFromResponse(res);\n const body = (await res.json()) as SponsoredSessionStatus;\n if (cancelled) return;\n setStatus(body);\n if (body.active) setLastValidUntil(body.validUntil);\n } catch (e) {\n if (!cancelled) setError(toPepuError(e, { op: \"session status\" }));\n } finally {\n if (!cancelled) setStatusChecked(true);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [authenticated, owner, authFetch, tick]);\n\n useEffect(() => {\n const id = setInterval(() => setNow(Math.floor(Date.now() / 1000)), 1000);\n return () => clearInterval(id);\n }, []);\n\n useEffect(() => {\n if (!o.pollMs || o.pollMs <= 0) return;\n const id = setInterval(refetch, o.pollMs);\n return () => clearInterval(id);\n }, [o.pollMs, refetch]);\n\n const grant = useCallback(async (): Promise<void> => {\n if (grantInFlight.current) return;\n grantInFlight.current = true;\n setGranting(true);\n setError(undefined);\n try {\n if (!wallet || !owner) {\n throw new PepuAuthError(\"WALLET_NOT_PROVISIONED\", \"No embedded wallet to sign the session grant.\");\n }\n const provider = await wallet.getEthereumProvider();\n const walletClient = createWalletClient({\n account: owner,\n chain: pepuMainnet,\n transport: custom(provider),\n });\n const result = await grantKernelSession({\n authFetch,\n publicClient,\n owner: walletClient,\n scope: scopeRef.current,\n endpoints: endpointsRef.current,\n });\n setPrepared(result);\n setLastValidUntil(result.validUntil);\n setStatus({\n active: true,\n validUntil: result.validUntil,\n kernelAddress: result.kernelAddress,\n ownerAddress: result.ownerAddress,\n sessionKeyAddress: result.sessionKeyAddress,\n actions: 0,\n });\n } catch (e) {\n setError(toPepuError(e, { op: \"session grant\" }));\n } finally {\n grantInFlight.current = false;\n setGranting(false);\n }\n }, [wallet, owner, authFetch, publicClient]);\n\n const act = useCallback(\n async (input?: I): Promise<O> => {\n try {\n const out = await postJson<O>(authFetch, endpointsRef.current.act, input === undefined ? {} : input);\n setError(undefined);\n refetch();\n return out;\n } catch (e) {\n const err = toPepuError(e, { op: \"session act\" });\n setError(err);\n // Only a 409 (SESSION_NONE) means the session is gone; any other failure is a failed action.\n if (err.code === \"SESSION_NONE\") {\n setStatus({ active: false });\n setLastValidUntil(undefined);\n }\n throw err;\n }\n },\n [authFetch, refetch],\n );\n\n const revoke = useCallback(async (): Promise<void> => {\n try {\n await postJson<{ active: false }>(authFetch, endpointsRef.current.revoke);\n setStatus({ active: false });\n setLastValidUntil(undefined);\n setPrepared(undefined);\n setError(undefined);\n } catch (e) {\n const err = toPepuError(e, { op: \"session revoke\" });\n setError(err);\n throw err;\n }\n }, [authFetch]);\n\n // `ready` must not flip to `signed-out` while Privy hydrates.\n const phase = deriveSessionPhase({\n authenticated: privyReady ? authenticated : false,\n hasWallet: owner !== undefined,\n validUntil: status?.active ? status.validUntil : lastValidUntil,\n nowSeconds: now,\n granting,\n hasError: error !== undefined,\n });\n const expiresAt = status?.active ? status.validUntil : lastValidUntil;\n const scope =\n prepared?.scope ??\n (expiresAt !== undefined\n ? describeKernelSessionScope({ calls: o.scope.calls, validUntil: expiresAt })\n : undefined);\n\n const statusLoading = privyReady && authenticated && owner !== undefined && !statusChecked && status === undefined;\n\n return {\n phase,\n statusLoading,\n ...(owner ? { owner } : {}),\n ...(smartAccount ? { smartAccount } : {}),\n ...(scope ? { scope } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(status?.active ? { actions: status.actions } : {}),\n grant,\n act,\n revoke,\n refetch,\n ...(error ? { error } : {}),\n };\n}\n"]}