@pepu-chain/sdk 0.2.1 → 0.2.2

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 (73) hide show
  1. package/README.md +1 -2
  2. package/dist/aa/kernel.cjs +10 -9
  3. package/dist/aa/kernel.js +5 -4
  4. package/dist/aa/react-direct.cjs +10 -9
  5. package/dist/aa/react-direct.cjs.map +1 -1
  6. package/dist/aa/react-direct.js +5 -4
  7. package/dist/aa/react-direct.js.map +1 -1
  8. package/dist/aa/react.cjs +5 -4
  9. package/dist/aa/react.cjs.map +1 -1
  10. package/dist/aa/react.js +3 -2
  11. package/dist/aa/react.js.map +1 -1
  12. package/dist/aa.cjs +18 -17
  13. package/dist/aa.js +5 -4
  14. package/dist/chunk-4GEC7GUU.cjs +283 -0
  15. package/dist/chunk-4GEC7GUU.cjs.map +1 -0
  16. package/dist/{chunk-PHM3ZORG.cjs → chunk-4L4CHIXE.cjs} +9 -9
  17. package/dist/{chunk-PHM3ZORG.cjs.map → chunk-4L4CHIXE.cjs.map} +1 -1
  18. package/dist/{chunk-A5LP2UCS.cjs → chunk-65Y5UCQ7.cjs} +2 -276
  19. package/dist/chunk-65Y5UCQ7.cjs.map +1 -0
  20. package/dist/{chunk-7MNJF2OB.cjs → chunk-DNWWZWUW.cjs} +4 -4
  21. package/dist/{chunk-7MNJF2OB.cjs.map → chunk-DNWWZWUW.cjs.map} +1 -1
  22. package/dist/{chunk-D52PADVY.js → chunk-GFKIM7HT.js} +25 -2
  23. package/dist/chunk-GFKIM7HT.js.map +1 -0
  24. package/dist/{chunk-IY3ALPUJ.js → chunk-GIZNH65Q.js} +5 -273
  25. package/dist/chunk-GIZNH65Q.js.map +1 -0
  26. package/dist/{chunk-WANILJZQ.cjs → chunk-HTCX46RJ.cjs} +25 -2
  27. package/dist/chunk-HTCX46RJ.cjs.map +1 -0
  28. package/dist/{chunk-KVG3AYYR.js → chunk-NHPWXIA2.js} +4 -4
  29. package/dist/{chunk-KVG3AYYR.js.map → chunk-NHPWXIA2.js.map} +1 -1
  30. package/dist/{chunk-ZB6SVBK4.js → chunk-QIDMFFAQ.js} +4 -4
  31. package/dist/{chunk-ZB6SVBK4.js.map → chunk-QIDMFFAQ.js.map} +1 -1
  32. package/dist/{chunk-IB2FSPMJ.js → chunk-QZKUPCUD.js} +3 -3
  33. package/dist/{chunk-IB2FSPMJ.js.map → chunk-QZKUPCUD.js.map} +1 -1
  34. package/dist/chunk-RSPAN44L.js +276 -0
  35. package/dist/chunk-RSPAN44L.js.map +1 -0
  36. package/dist/{chunk-NVOPDXTA.cjs → chunk-UQH4ZAXD.cjs} +10 -10
  37. package/dist/{chunk-NVOPDXTA.cjs.map → chunk-UQH4ZAXD.cjs.map} +1 -1
  38. package/dist/{chunk-BGALSKAF.cjs → chunk-VYMAZVIK.cjs} +4 -4
  39. package/dist/{chunk-BGALSKAF.cjs.map → chunk-VYMAZVIK.cjs.map} +1 -1
  40. package/dist/{chunk-F2R473FR.js → chunk-XR5ONV2Y.js} +3 -3
  41. package/dist/{chunk-F2R473FR.js.map → chunk-XR5ONV2Y.js.map} +1 -1
  42. package/dist/combo/react.cjs +61 -13
  43. package/dist/combo/react.cjs.map +1 -1
  44. package/dist/combo/react.d.cts +14 -2
  45. package/dist/combo/react.d.ts +14 -2
  46. package/dist/combo/react.guard.js +1 -1
  47. package/dist/combo/react.js +58 -11
  48. package/dist/combo/react.js.map +1 -1
  49. package/dist/combo.cjs +41 -26
  50. package/dist/combo.cjs.map +1 -1
  51. package/dist/combo.d.cts +11 -0
  52. package/dist/combo.d.ts +11 -0
  53. package/dist/combo.js +31 -16
  54. package/dist/combo.js.map +1 -1
  55. package/dist/index.cjs +10 -9
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.js +3 -2
  58. package/dist/index.js.map +1 -1
  59. package/dist/paymaster.cjs +37 -36
  60. package/dist/paymaster.cjs.map +1 -1
  61. package/dist/paymaster.js +3 -2
  62. package/dist/paymaster.js.map +1 -1
  63. package/dist/react.cjs +4 -3
  64. package/dist/react.cjs.map +1 -1
  65. package/dist/react.js +3 -2
  66. package/dist/react.js.map +1 -1
  67. package/dist/session/kernel.cjs +18 -17
  68. package/dist/session/kernel.js +6 -5
  69. package/package.json +1 -1
  70. package/dist/chunk-A5LP2UCS.cjs.map +0 -1
  71. package/dist/chunk-D52PADVY.js.map +0 -1
  72. package/dist/chunk-IY3ALPUJ.js.map +0 -1
  73. package/dist/chunk-WANILJZQ.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/combo/react.ts"],"names":["errorFromResponse","approveKernelSession","buildKernelSessionPolicies","getPublicClient","pepuMainnet","usePrivy","useEmbeddedWallet","usePepuAuthFetch","useCallback","useRef","useState","useEffect","getKernelAddress","toPepuError","PepuAuthError","createWalletClient","custom","describeKernelSessionScope"],"mappings":"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","file":"react.cjs","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"]}
1
+ {"version":3,"sources":["../../src/combo/react.ts"],"names":["errorFromResponse","approveKernelSession","buildKernelSessionPolicies","getPublicClient","pepuMainnet","usePrivy","useEmbeddedWallet","usePepuAuthFetch","useCallback","useRef","useState","useEffect","getKernelAddress","toPepuError","PepuAuthError","createWalletClient","custom","describeKernelSessionScope"],"mappings":"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","file":"react.cjs","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 /** `provisioning`: signed in, but the server cannot see the new embedded wallet yet. Transient: retry. */\n | { active: false; provisioning?: true }\n | {\n active: true;\n validUntil: number;\n kernelAddress: Address;\n ownerAddress: Address;\n sessionKeyAddress: Address;\n actions: number;\n };\n\n/** Waits between retries while the server cannot see a just-created embedded wallet (total about 6.5 s). */\nexport const PROVISIONING_RETRY_DELAYS_MS: readonly number[] = [500, 1000, 2000, 3000];\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction isProvisioning(e: unknown): boolean {\n return (e as { code?: unknown } | null)?.code === \"WALLET_NOT_PROVISIONED\";\n}\n\n/**\n * Run `fn`, retrying with backoff while it fails with `WALLET_NOT_PROVISIONED`. A new user's embedded wallet exists in\n * the browser a moment before Privy's server lists it; that gap is not an error the user should ever see.\n */\nasync function whileProvisioning<T>(fn: () => Promise<T>, delays: readonly number[]): Promise<T> {\n for (let i = 0; ; i++) {\n try {\n return await fn();\n } catch (e) {\n const delay = delays[i];\n if (!isProvisioning(e) || delay === undefined) throw e;\n await sleep(delay);\n }\n }\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 /** Waits between retries of `prepare` while the server cannot see a new wallet yet. Default {@link PROVISIONING_RETRY_DELAYS_MS}. */\n provisioningRetryDelaysMs?: readonly number[];\n}): Promise<PreparedSession> {\n const ep = { ...DEFAULT_SESSION_ENDPOINTS, ...p.endpoints };\n const prepared = await whileProvisioning(\n () => postJson<PreparedSession>(p.authFetch, ep.prepare),\n p.provisioningRetryDelaysMs ?? PROVISIONING_RETRY_DELAYS_MS,\n );\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 * Waits between status re-checks while the server cannot see a just-created wallet. During them `statusLoading`\n * stays true and no error is shown. Default {@link PROVISIONING_RETRY_DELAYS_MS} extended to a 5 s tail (about 30 s).\n */\n provisioningRetryDelaysMs?: readonly number[];\n}\n\n/** Status re-checks while a new wallet is not visible to the server yet: 0.5, 1, 2, 3 s, then 5 s x 5 (about 30 s). */\nconst STATUS_PROVISIONING_DELAYS_MS: readonly number[] = [...PROVISIONING_RETRY_DELAYS_MS, 5000, 5000, 5000, 5000, 5000];\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 const provisioningDelays = o.provisioningRetryDelaysMs ?? STATUS_PROVISIONING_DELAYS_MS;\n const delaysRef = useRef(provisioningDelays);\n delaysRef.current = provisioningDelays;\n const provisioningAttempts = useRef(0);\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 let timer: ReturnType<typeof setTimeout> | undefined;\n // The server cannot see the new embedded wallet yet: stay in the loading state and ask again, quietly.\n const retryLater = (): boolean => {\n const delay = delaysRef.current[provisioningAttempts.current];\n if (delay === undefined) return false;\n provisioningAttempts.current += 1;\n timer = setTimeout(() => {\n if (!cancelled) refetch();\n }, delay);\n return true;\n };\n void (async () => {\n let waiting = false;\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 if (!body.active && body.provisioning) {\n waiting = retryLater();\n if (!waiting) setStatus({ active: false });\n return;\n }\n provisioningAttempts.current = 0;\n setStatus(body);\n setError(undefined);\n if (body.active) setLastValidUntil(body.validUntil);\n } catch (e) {\n if (cancelled) return;\n if (isProvisioning(e) && (waiting = retryLater())) return;\n setError(toPepuError(e, { op: \"session status\" }));\n } finally {\n if (!cancelled && !waiting) setStatusChecked(true);\n }\n })();\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [authenticated, owner, authFetch, tick, refetch]);\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 provisioningRetryDelaysMs: delaysRef.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"]}
@@ -64,8 +64,11 @@ interface PreparedSession {
64
64
  scope: KernelSessionScope;
65
65
  }
66
66
  /** What the server's `status` route returns. */
67
- type SponsoredSessionStatus = {
67
+ type SponsoredSessionStatus =
68
+ /** `provisioning`: signed in, but the server cannot see the new embedded wallet yet. Transient: retry. */
69
+ {
68
70
  active: false;
71
+ provisioning?: true;
69
72
  } | {
70
73
  active: true;
71
74
  validUntil: number;
@@ -74,6 +77,8 @@ type SponsoredSessionStatus = {
74
77
  sessionKeyAddress: Address;
75
78
  actions: number;
76
79
  };
80
+ /** Waits between retries while the server cannot see a just-created embedded wallet (total about 6.5 s). */
81
+ declare const PROVISIONING_RETRY_DELAYS_MS: readonly number[];
77
82
  /**
78
83
  * The grant, outside React: ask the server to `prepare` a session key, have
79
84
  * `owner` sign the ONE EIP-712 approval (no gas), then `activate`. Rebuilds
@@ -92,6 +97,8 @@ declare function grantKernelSession(p: {
92
97
  calls: readonly KernelSessionCall[];
93
98
  };
94
99
  endpoints?: Partial<SponsoredSessionEndpoints>;
100
+ /** Waits between retries of `prepare` while the server cannot see a new wallet yet. Default {@link PROVISIONING_RETRY_DELAYS_MS}. */
101
+ provisioningRetryDelaysMs?: readonly number[];
95
102
  }): Promise<PreparedSession>;
96
103
  /** Options for {@link useSponsoredSession}. */
97
104
  interface UseSponsoredSessionOptions {
@@ -106,6 +113,11 @@ interface UseSponsoredSessionOptions {
106
113
  publicClient?: PublicClient;
107
114
  /** Re-poll the status route this often. Default 0 (only on mount and after actions). */
108
115
  pollMs?: number;
116
+ /**
117
+ * Waits between status re-checks while the server cannot see a just-created wallet. During them `statusLoading`
118
+ * stays true and no error is shown. Default {@link PROVISIONING_RETRY_DELAYS_MS} extended to a 5 s tail (about 30 s).
119
+ */
120
+ provisioningRetryDelaysMs?: readonly number[];
109
121
  }
110
122
  /**
111
123
  * The whole session flow for a component.
@@ -145,4 +157,4 @@ declare function useSponsoredSession<I = undefined, O = unknown>(o: UseSponsored
145
157
  error?: PepuError;
146
158
  };
147
159
 
148
- export { DEFAULT_SESSION_ENDPOINTS, type PreparedSession, type SponsoredSessionEndpoints, type SponsoredSessionPhase, type SponsoredSessionStatus, type UseSponsoredSessionOptions, deriveSessionPhase, grantKernelSession, useSponsoredSession };
160
+ export { DEFAULT_SESSION_ENDPOINTS, PROVISIONING_RETRY_DELAYS_MS, type PreparedSession, type SponsoredSessionEndpoints, type SponsoredSessionPhase, type SponsoredSessionStatus, type UseSponsoredSessionOptions, deriveSessionPhase, grantKernelSession, useSponsoredSession };
@@ -64,8 +64,11 @@ interface PreparedSession {
64
64
  scope: KernelSessionScope;
65
65
  }
66
66
  /** What the server's `status` route returns. */
67
- type SponsoredSessionStatus = {
67
+ type SponsoredSessionStatus =
68
+ /** `provisioning`: signed in, but the server cannot see the new embedded wallet yet. Transient: retry. */
69
+ {
68
70
  active: false;
71
+ provisioning?: true;
69
72
  } | {
70
73
  active: true;
71
74
  validUntil: number;
@@ -74,6 +77,8 @@ type SponsoredSessionStatus = {
74
77
  sessionKeyAddress: Address;
75
78
  actions: number;
76
79
  };
80
+ /** Waits between retries while the server cannot see a just-created embedded wallet (total about 6.5 s). */
81
+ declare const PROVISIONING_RETRY_DELAYS_MS: readonly number[];
77
82
  /**
78
83
  * The grant, outside React: ask the server to `prepare` a session key, have
79
84
  * `owner` sign the ONE EIP-712 approval (no gas), then `activate`. Rebuilds
@@ -92,6 +97,8 @@ declare function grantKernelSession(p: {
92
97
  calls: readonly KernelSessionCall[];
93
98
  };
94
99
  endpoints?: Partial<SponsoredSessionEndpoints>;
100
+ /** Waits between retries of `prepare` while the server cannot see a new wallet yet. Default {@link PROVISIONING_RETRY_DELAYS_MS}. */
101
+ provisioningRetryDelaysMs?: readonly number[];
95
102
  }): Promise<PreparedSession>;
96
103
  /** Options for {@link useSponsoredSession}. */
97
104
  interface UseSponsoredSessionOptions {
@@ -106,6 +113,11 @@ interface UseSponsoredSessionOptions {
106
113
  publicClient?: PublicClient;
107
114
  /** Re-poll the status route this often. Default 0 (only on mount and after actions). */
108
115
  pollMs?: number;
116
+ /**
117
+ * Waits between status re-checks while the server cannot see a just-created wallet. During them `statusLoading`
118
+ * stays true and no error is shown. Default {@link PROVISIONING_RETRY_DELAYS_MS} extended to a 5 s tail (about 30 s).
119
+ */
120
+ provisioningRetryDelaysMs?: readonly number[];
109
121
  }
110
122
  /**
111
123
  * The whole session flow for a component.
@@ -145,4 +157,4 @@ declare function useSponsoredSession<I = undefined, O = unknown>(o: UseSponsored
145
157
  error?: PepuError;
146
158
  };
147
159
 
148
- export { DEFAULT_SESSION_ENDPOINTS, type PreparedSession, type SponsoredSessionEndpoints, type SponsoredSessionPhase, type SponsoredSessionStatus, type UseSponsoredSessionOptions, deriveSessionPhase, grantKernelSession, useSponsoredSession };
160
+ export { DEFAULT_SESSION_ENDPOINTS, PROVISIONING_RETRY_DELAYS_MS, type PreparedSession, type SponsoredSessionEndpoints, type SponsoredSessionPhase, type SponsoredSessionStatus, type UseSponsoredSessionOptions, deriveSessionPhase, grantKernelSession, useSponsoredSession };
@@ -12,4 +12,4 @@ for (const peer of peers) {
12
12
  }
13
13
  }
14
14
  const mod = await import("./react.js");
15
- export const { DEFAULT_SESSION_ENDPOINTS, deriveSessionPhase, grantKernelSession, useSponsoredSession } = mod;
15
+ export const { DEFAULT_SESSION_ENDPOINTS, PROVISIONING_RETRY_DELAYS_MS, deriveSessionPhase, grantKernelSession, useSponsoredSession } = mod;
@@ -1,10 +1,11 @@
1
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';
2
+ import { approveKernelSession, buildKernelSessionPolicies } from '../chunk-NHPWXIA2.js';
3
+ import { getKernelAddress } from '../chunk-QIDMFFAQ.js';
4
+ import '../chunk-QZKUPCUD.js';
5
5
  import '../chunk-VBH3JLQ5.js';
6
- import '../chunk-IY3ALPUJ.js';
7
- import '../chunk-D52PADVY.js';
6
+ import '../chunk-RSPAN44L.js';
7
+ import '../chunk-GFKIM7HT.js';
8
+ import '../chunk-GIZNH65Q.js';
8
9
  import { useEmbeddedWallet, usePepuAuthFetch } from '../chunk-EHBPIYY4.js';
9
10
  import '../chunk-JLZ4LZ4Z.js';
10
11
  import { describeKernelSessionScope } from '../chunk-ESMNAXUI.js';
@@ -32,6 +33,22 @@ function deriveSessionPhase(p) {
32
33
  if (p.validUntil !== void 0) return p.nowSeconds < p.validUntil ? "active" : "expired";
33
34
  return p.hasError ? "error" : "ready";
34
35
  }
36
+ var PROVISIONING_RETRY_DELAYS_MS = [500, 1e3, 2e3, 3e3];
37
+ var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
38
+ function isProvisioning(e) {
39
+ return e?.code === "WALLET_NOT_PROVISIONED";
40
+ }
41
+ async function whileProvisioning(fn, delays) {
42
+ for (let i = 0; ; i++) {
43
+ try {
44
+ return await fn();
45
+ } catch (e) {
46
+ const delay = delays[i];
47
+ if (!isProvisioning(e) || delay === void 0) throw e;
48
+ await sleep(delay);
49
+ }
50
+ }
51
+ }
35
52
  async function postJson(authFetch, url, body) {
36
53
  const res = await authFetch(url, {
37
54
  method: "POST",
@@ -42,7 +59,10 @@ async function postJson(authFetch, url, body) {
42
59
  }
43
60
  async function grantKernelSession(p) {
44
61
  const ep = { ...DEFAULT_SESSION_ENDPOINTS, ...p.endpoints };
45
- const prepared = await postJson(p.authFetch, ep.prepare);
62
+ const prepared = await whileProvisioning(
63
+ () => postJson(p.authFetch, ep.prepare),
64
+ p.provisioningRetryDelaysMs ?? PROVISIONING_RETRY_DELAYS_MS
65
+ );
46
66
  const { approval } = await approveKernelSession({
47
67
  publicClient: p.publicClient,
48
68
  owner: p.owner,
@@ -52,6 +72,7 @@ async function grantKernelSession(p) {
52
72
  await postJson(p.authFetch, ep.activate, { approval });
53
73
  return prepared;
54
74
  }
75
+ var STATUS_PROVISIONING_DELAYS_MS = [...PROVISIONING_RETRY_DELAYS_MS, 5e3, 5e3, 5e3, 5e3, 5e3];
55
76
  var sharedClient;
56
77
  function defaultPublicClient() {
57
78
  sharedClient ??= getPublicClient(pepuMainnet);
@@ -82,6 +103,10 @@ function useSponsoredSession(o) {
82
103
  const refetch = useCallback(() => setTick((t) => t + 1), []);
83
104
  const [lastValidUntil, setLastValidUntil] = useState();
84
105
  const grantInFlight = useRef(false);
106
+ const provisioningDelays = o.provisioningRetryDelaysMs ?? STATUS_PROVISIONING_DELAYS_MS;
107
+ const delaysRef = useRef(provisioningDelays);
108
+ delaysRef.current = provisioningDelays;
109
+ const provisioningAttempts = useRef(0);
85
110
  useEffect(() => {
86
111
  if (!owner) {
87
112
  setSmartAccount(void 0);
@@ -100,24 +125,45 @@ function useSponsoredSession(o) {
100
125
  useEffect(() => {
101
126
  if (!authenticated || !owner) return;
102
127
  let cancelled = false;
128
+ let timer;
129
+ const retryLater = () => {
130
+ const delay = delaysRef.current[provisioningAttempts.current];
131
+ if (delay === void 0) return false;
132
+ provisioningAttempts.current += 1;
133
+ timer = setTimeout(() => {
134
+ if (!cancelled) refetch();
135
+ }, delay);
136
+ return true;
137
+ };
103
138
  void (async () => {
139
+ let waiting = false;
104
140
  try {
105
141
  const res = await authFetch(endpointsRef.current.status);
106
142
  if (!res.ok) throw await errorFromResponse(res);
107
143
  const body = await res.json();
108
144
  if (cancelled) return;
145
+ if (!body.active && body.provisioning) {
146
+ waiting = retryLater();
147
+ if (!waiting) setStatus({ active: false });
148
+ return;
149
+ }
150
+ provisioningAttempts.current = 0;
109
151
  setStatus(body);
152
+ setError(void 0);
110
153
  if (body.active) setLastValidUntil(body.validUntil);
111
154
  } catch (e) {
112
- if (!cancelled) setError(toPepuError(e, { op: "session status" }));
155
+ if (cancelled) return;
156
+ if (isProvisioning(e) && (waiting = retryLater())) return;
157
+ setError(toPepuError(e, { op: "session status" }));
113
158
  } finally {
114
- if (!cancelled) setStatusChecked(true);
159
+ if (!cancelled && !waiting) setStatusChecked(true);
115
160
  }
116
161
  })();
117
162
  return () => {
118
163
  cancelled = true;
164
+ if (timer) clearTimeout(timer);
119
165
  };
120
- }, [authenticated, owner, authFetch, tick]);
166
+ }, [authenticated, owner, authFetch, tick, refetch]);
121
167
  useEffect(() => {
122
168
  const id = setInterval(() => setNow(Math.floor(Date.now() / 1e3)), 1e3);
123
169
  return () => clearInterval(id);
@@ -147,7 +193,8 @@ function useSponsoredSession(o) {
147
193
  publicClient,
148
194
  owner: walletClient,
149
195
  scope: scopeRef.current,
150
- endpoints: endpointsRef.current
196
+ endpoints: endpointsRef.current,
197
+ provisioningRetryDelaysMs: delaysRef.current
151
198
  });
152
199
  setPrepared(result);
153
200
  setLastValidUntil(result.validUntil);
@@ -225,6 +272,6 @@ function useSponsoredSession(o) {
225
272
  };
226
273
  }
227
274
 
228
- export { DEFAULT_SESSION_ENDPOINTS, deriveSessionPhase, grantKernelSession, useSponsoredSession };
275
+ export { DEFAULT_SESSION_ENDPOINTS, PROVISIONING_RETRY_DELAYS_MS, deriveSessionPhase, grantKernelSession, useSponsoredSession };
229
276
  //# sourceMappingURL=react.js.map
230
277
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/combo/react.ts"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"sources":["../../src/combo/react.ts"],"names":[],"mappings":"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","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 /** `provisioning`: signed in, but the server cannot see the new embedded wallet yet. Transient: retry. */\n | { active: false; provisioning?: true }\n | {\n active: true;\n validUntil: number;\n kernelAddress: Address;\n ownerAddress: Address;\n sessionKeyAddress: Address;\n actions: number;\n };\n\n/** Waits between retries while the server cannot see a just-created embedded wallet (total about 6.5 s). */\nexport const PROVISIONING_RETRY_DELAYS_MS: readonly number[] = [500, 1000, 2000, 3000];\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction isProvisioning(e: unknown): boolean {\n return (e as { code?: unknown } | null)?.code === \"WALLET_NOT_PROVISIONED\";\n}\n\n/**\n * Run `fn`, retrying with backoff while it fails with `WALLET_NOT_PROVISIONED`. A new user's embedded wallet exists in\n * the browser a moment before Privy's server lists it; that gap is not an error the user should ever see.\n */\nasync function whileProvisioning<T>(fn: () => Promise<T>, delays: readonly number[]): Promise<T> {\n for (let i = 0; ; i++) {\n try {\n return await fn();\n } catch (e) {\n const delay = delays[i];\n if (!isProvisioning(e) || delay === undefined) throw e;\n await sleep(delay);\n }\n }\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 /** Waits between retries of `prepare` while the server cannot see a new wallet yet. Default {@link PROVISIONING_RETRY_DELAYS_MS}. */\n provisioningRetryDelaysMs?: readonly number[];\n}): Promise<PreparedSession> {\n const ep = { ...DEFAULT_SESSION_ENDPOINTS, ...p.endpoints };\n const prepared = await whileProvisioning(\n () => postJson<PreparedSession>(p.authFetch, ep.prepare),\n p.provisioningRetryDelaysMs ?? PROVISIONING_RETRY_DELAYS_MS,\n );\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 * Waits between status re-checks while the server cannot see a just-created wallet. During them `statusLoading`\n * stays true and no error is shown. Default {@link PROVISIONING_RETRY_DELAYS_MS} extended to a 5 s tail (about 30 s).\n */\n provisioningRetryDelaysMs?: readonly number[];\n}\n\n/** Status re-checks while a new wallet is not visible to the server yet: 0.5, 1, 2, 3 s, then 5 s x 5 (about 30 s). */\nconst STATUS_PROVISIONING_DELAYS_MS: readonly number[] = [...PROVISIONING_RETRY_DELAYS_MS, 5000, 5000, 5000, 5000, 5000];\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 const provisioningDelays = o.provisioningRetryDelaysMs ?? STATUS_PROVISIONING_DELAYS_MS;\n const delaysRef = useRef(provisioningDelays);\n delaysRef.current = provisioningDelays;\n const provisioningAttempts = useRef(0);\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 let timer: ReturnType<typeof setTimeout> | undefined;\n // The server cannot see the new embedded wallet yet: stay in the loading state and ask again, quietly.\n const retryLater = (): boolean => {\n const delay = delaysRef.current[provisioningAttempts.current];\n if (delay === undefined) return false;\n provisioningAttempts.current += 1;\n timer = setTimeout(() => {\n if (!cancelled) refetch();\n }, delay);\n return true;\n };\n void (async () => {\n let waiting = false;\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 if (!body.active && body.provisioning) {\n waiting = retryLater();\n if (!waiting) setStatus({ active: false });\n return;\n }\n provisioningAttempts.current = 0;\n setStatus(body);\n setError(undefined);\n if (body.active) setLastValidUntil(body.validUntil);\n } catch (e) {\n if (cancelled) return;\n if (isProvisioning(e) && (waiting = retryLater())) return;\n setError(toPepuError(e, { op: \"session status\" }));\n } finally {\n if (!cancelled && !waiting) setStatusChecked(true);\n }\n })();\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [authenticated, owner, authFetch, tick, refetch]);\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 provisioningRetryDelaysMs: delaysRef.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"]}