@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.
- package/README.md +1 -2
- package/dist/aa/kernel.cjs +10 -9
- package/dist/aa/kernel.js +5 -4
- package/dist/aa/react-direct.cjs +10 -9
- package/dist/aa/react-direct.cjs.map +1 -1
- package/dist/aa/react-direct.js +5 -4
- package/dist/aa/react-direct.js.map +1 -1
- package/dist/aa/react.cjs +5 -4
- package/dist/aa/react.cjs.map +1 -1
- package/dist/aa/react.js +3 -2
- package/dist/aa/react.js.map +1 -1
- package/dist/aa.cjs +18 -17
- package/dist/aa.js +5 -4
- package/dist/chunk-4GEC7GUU.cjs +283 -0
- package/dist/chunk-4GEC7GUU.cjs.map +1 -0
- package/dist/{chunk-PHM3ZORG.cjs → chunk-4L4CHIXE.cjs} +9 -9
- package/dist/{chunk-PHM3ZORG.cjs.map → chunk-4L4CHIXE.cjs.map} +1 -1
- package/dist/{chunk-A5LP2UCS.cjs → chunk-65Y5UCQ7.cjs} +2 -276
- package/dist/chunk-65Y5UCQ7.cjs.map +1 -0
- package/dist/{chunk-7MNJF2OB.cjs → chunk-DNWWZWUW.cjs} +4 -4
- package/dist/{chunk-7MNJF2OB.cjs.map → chunk-DNWWZWUW.cjs.map} +1 -1
- package/dist/{chunk-D52PADVY.js → chunk-GFKIM7HT.js} +25 -2
- package/dist/chunk-GFKIM7HT.js.map +1 -0
- package/dist/{chunk-IY3ALPUJ.js → chunk-GIZNH65Q.js} +5 -273
- package/dist/chunk-GIZNH65Q.js.map +1 -0
- package/dist/{chunk-WANILJZQ.cjs → chunk-HTCX46RJ.cjs} +25 -2
- package/dist/chunk-HTCX46RJ.cjs.map +1 -0
- package/dist/{chunk-KVG3AYYR.js → chunk-NHPWXIA2.js} +4 -4
- package/dist/{chunk-KVG3AYYR.js.map → chunk-NHPWXIA2.js.map} +1 -1
- package/dist/{chunk-ZB6SVBK4.js → chunk-QIDMFFAQ.js} +4 -4
- package/dist/{chunk-ZB6SVBK4.js.map → chunk-QIDMFFAQ.js.map} +1 -1
- package/dist/{chunk-IB2FSPMJ.js → chunk-QZKUPCUD.js} +3 -3
- package/dist/{chunk-IB2FSPMJ.js.map → chunk-QZKUPCUD.js.map} +1 -1
- package/dist/chunk-RSPAN44L.js +276 -0
- package/dist/chunk-RSPAN44L.js.map +1 -0
- package/dist/{chunk-NVOPDXTA.cjs → chunk-UQH4ZAXD.cjs} +10 -10
- package/dist/{chunk-NVOPDXTA.cjs.map → chunk-UQH4ZAXD.cjs.map} +1 -1
- package/dist/{chunk-BGALSKAF.cjs → chunk-VYMAZVIK.cjs} +4 -4
- package/dist/{chunk-BGALSKAF.cjs.map → chunk-VYMAZVIK.cjs.map} +1 -1
- package/dist/{chunk-F2R473FR.js → chunk-XR5ONV2Y.js} +3 -3
- package/dist/{chunk-F2R473FR.js.map → chunk-XR5ONV2Y.js.map} +1 -1
- package/dist/combo/react.cjs +61 -13
- package/dist/combo/react.cjs.map +1 -1
- package/dist/combo/react.d.cts +14 -2
- package/dist/combo/react.d.ts +14 -2
- package/dist/combo/react.guard.js +1 -1
- package/dist/combo/react.js +58 -11
- package/dist/combo/react.js.map +1 -1
- package/dist/combo.cjs +41 -26
- package/dist/combo.cjs.map +1 -1
- package/dist/combo.d.cts +11 -0
- package/dist/combo.d.ts +11 -0
- package/dist/combo.js +31 -16
- package/dist/combo.js.map +1 -1
- package/dist/index.cjs +10 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/paymaster.cjs +37 -36
- package/dist/paymaster.cjs.map +1 -1
- package/dist/paymaster.js +3 -2
- package/dist/paymaster.js.map +1 -1
- package/dist/react.cjs +4 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +3 -2
- package/dist/react.js.map +1 -1
- package/dist/session/kernel.cjs +18 -17
- package/dist/session/kernel.js +6 -5
- package/package.json +1 -1
- package/dist/chunk-A5LP2UCS.cjs.map +0 -1
- package/dist/chunk-D52PADVY.js.map +0 -1
- package/dist/chunk-IY3ALPUJ.js.map +0 -1
- package/dist/chunk-WANILJZQ.cjs.map +0 -1
package/dist/combo/react.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/combo/react.d.cts
CHANGED
|
@@ -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 };
|
package/dist/combo/react.d.ts
CHANGED
|
@@ -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;
|
package/dist/combo/react.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { errorFromResponse } from '../chunk-T43PQXJD.js';
|
|
2
|
-
import { approveKernelSession, buildKernelSessionPolicies } from '../chunk-
|
|
3
|
-
import { getKernelAddress } from '../chunk-
|
|
4
|
-
import '../chunk-
|
|
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-
|
|
7
|
-
import '../chunk-
|
|
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
|
|
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 (
|
|
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
|
package/dist/combo/react.js.map
CHANGED
|
@@ -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"]}
|