@pepu-chain/sdk 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +565 -2
- package/dist/aa/kernel.cjs +40 -0
- package/dist/aa/kernel.cjs.map +1 -0
- package/dist/aa/kernel.d.cts +88 -0
- package/dist/aa/kernel.d.ts +88 -0
- package/dist/aa/kernel.js +11 -0
- package/dist/aa/kernel.js.map +1 -0
- package/dist/aa/react-direct.cjs +110 -0
- package/dist/aa/react-direct.cjs.map +1 -0
- package/dist/aa/react-direct.d.cts +42 -0
- package/dist/aa/react-direct.d.ts +42 -0
- package/dist/aa/react-direct.js +107 -0
- package/dist/aa/react-direct.js.map +1 -0
- package/dist/aa/react.cjs +151 -0
- package/dist/aa/react.cjs.map +1 -0
- package/dist/aa/react.d.cts +62 -0
- package/dist/aa/react.d.ts +62 -0
- package/dist/aa/react.js +147 -0
- package/dist/aa/react.js.map +1 -0
- package/dist/aa.cjs +84 -0
- package/dist/aa.cjs.map +1 -0
- package/dist/aa.d.cts +85 -0
- package/dist/aa.d.ts +85 -0
- package/dist/aa.js +11 -0
- package/dist/aa.js.map +1 -0
- package/dist/api-Dz4sCHH_.d.cts +654 -0
- package/dist/api-Dz4sCHH_.d.ts +654 -0
- package/dist/calls-BRPjKgjl.d.cts +70 -0
- package/dist/calls-z_EQOtFb.d.ts +70 -0
- package/dist/chains-DK13zGIp.d.cts +235 -0
- package/dist/chains-DK13zGIp.d.ts +235 -0
- package/dist/chunk-3XUGQODR.js +194 -0
- package/dist/chunk-3XUGQODR.js.map +1 -0
- package/dist/chunk-45KSZH26.cjs +145 -0
- package/dist/chunk-45KSZH26.cjs.map +1 -0
- package/dist/chunk-4GINFJO6.cjs +44 -0
- package/dist/chunk-4GINFJO6.cjs.map +1 -0
- package/dist/chunk-62M2LKQW.js +136 -0
- package/dist/chunk-62M2LKQW.js.map +1 -0
- package/dist/chunk-6DSZ4Z2N.js +498 -0
- package/dist/chunk-6DSZ4Z2N.js.map +1 -0
- package/dist/chunk-7MNJF2OB.cjs +72 -0
- package/dist/chunk-7MNJF2OB.cjs.map +1 -0
- package/dist/chunk-A5LP2UCS.cjs +2729 -0
- package/dist/chunk-A5LP2UCS.cjs.map +1 -0
- package/dist/chunk-AJS4UFQX.cjs +121 -0
- package/dist/chunk-AJS4UFQX.cjs.map +1 -0
- package/dist/chunk-C2XW44FI.cjs +200 -0
- package/dist/chunk-C2XW44FI.cjs.map +1 -0
- package/dist/chunk-C7IC36XS.cjs +13 -0
- package/dist/chunk-C7IC36XS.cjs.map +1 -0
- package/dist/chunk-D52PADVY.js +84 -0
- package/dist/chunk-D52PADVY.js.map +1 -0
- package/dist/chunk-DH6BFNVJ.cjs +272 -0
- package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
- package/dist/chunk-DPCZJLB3.cjs +87 -0
- package/dist/chunk-DPCZJLB3.cjs.map +1 -0
- package/dist/chunk-EHBPIYY4.js +262 -0
- package/dist/chunk-EHBPIYY4.js.map +1 -0
- package/dist/chunk-ESMNAXUI.js +86 -0
- package/dist/chunk-ESMNAXUI.js.map +1 -0
- package/dist/chunk-ET3P6TX6.cjs +49 -0
- package/dist/chunk-ET3P6TX6.cjs.map +1 -0
- package/dist/chunk-FCXSP2YF.js +219 -0
- package/dist/chunk-FCXSP2YF.js.map +1 -0
- package/dist/chunk-IB2FSPMJ.js +66 -0
- package/dist/chunk-IB2FSPMJ.js.map +1 -0
- package/dist/chunk-IG7RSL2Y.cjs +178 -0
- package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
- package/dist/chunk-IY3ALPUJ.js +2716 -0
- package/dist/chunk-IY3ALPUJ.js.map +1 -0
- package/dist/chunk-J3O2ZGG3.cjs +93 -0
- package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
- package/dist/chunk-J6UXXHBE.js +37 -0
- package/dist/chunk-J6UXXHBE.js.map +1 -0
- package/dist/chunk-JLZ4LZ4Z.js +22 -0
- package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
- package/dist/chunk-KIIFL4VM.js +274 -0
- package/dist/chunk-KIIFL4VM.js.map +1 -0
- package/dist/chunk-KVG3AYYR.js +99 -0
- package/dist/chunk-KVG3AYYR.js.map +1 -0
- package/dist/chunk-MBA4CLA5.js +45 -0
- package/dist/chunk-MBA4CLA5.js.map +1 -0
- package/dist/chunk-NE3QKDOB.cjs +24 -0
- package/dist/chunk-NE3QKDOB.cjs.map +1 -0
- package/dist/chunk-NVOPDXTA.cjs +95 -0
- package/dist/chunk-NVOPDXTA.cjs.map +1 -0
- package/dist/chunk-OH3QMAIB.js +11 -0
- package/dist/chunk-OH3QMAIB.js.map +1 -0
- package/dist/chunk-PHM3ZORG.cjs +110 -0
- package/dist/chunk-PHM3ZORG.cjs.map +1 -0
- package/dist/chunk-R5PXQNO3.cjs +209 -0
- package/dist/chunk-R5PXQNO3.cjs.map +1 -0
- package/dist/chunk-SLW7FRTL.cjs +285 -0
- package/dist/chunk-SLW7FRTL.cjs.map +1 -0
- package/dist/chunk-SVWRRALU.cjs +17 -0
- package/dist/chunk-SVWRRALU.cjs.map +1 -0
- package/dist/chunk-T43PQXJD.js +202 -0
- package/dist/chunk-T43PQXJD.js.map +1 -0
- package/dist/chunk-TIEAZYHF.cjs +225 -0
- package/dist/chunk-TIEAZYHF.cjs.map +1 -0
- package/dist/chunk-VBH3JLQ5.js +116 -0
- package/dist/chunk-VBH3JLQ5.js.map +1 -0
- package/dist/chunk-VF3D6KLQ.cjs +94 -0
- package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
- package/dist/chunk-VTQIHMF3.js +82 -0
- package/dist/chunk-VTQIHMF3.js.map +1 -0
- package/dist/chunk-W3JN3YIW.js +15 -0
- package/dist/chunk-W3JN3YIW.js.map +1 -0
- package/dist/chunk-WANILJZQ.cjs +87 -0
- package/dist/chunk-WANILJZQ.cjs.map +1 -0
- package/dist/chunk-XC4IBCI2.js +86 -0
- package/dist/chunk-XC4IBCI2.js.map +1 -0
- package/dist/chunk-YKEWWQEJ.js +165 -0
- package/dist/chunk-YKEWWQEJ.js.map +1 -0
- package/dist/chunk-YQL7NISX.cjs +515 -0
- package/dist/chunk-YQL7NISX.cjs.map +1 -0
- package/dist/chunk-ZB6SVBK4.js +89 -0
- package/dist/chunk-ZB6SVBK4.js.map +1 -0
- package/dist/combo/react.cjs +235 -0
- package/dist/combo/react.cjs.map +1 -0
- package/dist/combo/react.d.cts +148 -0
- package/dist/combo/react.d.ts +148 -0
- package/dist/combo/react.js +230 -0
- package/dist/combo/react.js.map +1 -0
- package/dist/combo.cjs +262 -0
- package/dist/combo.cjs.map +1 -0
- package/dist/combo.d.cts +139 -0
- package/dist/combo.d.ts +139 -0
- package/dist/combo.js +249 -0
- package/dist/combo.js.map +1 -0
- package/dist/config-CHjz7ZjZ.d.cts +57 -0
- package/dist/config-COjhIZTh.d.ts +57 -0
- package/dist/doctor.cjs +354 -0
- package/dist/doctor.cjs.map +1 -0
- package/dist/doctor.d.cts +177 -0
- package/dist/doctor.d.ts +177 -0
- package/dist/doctor.js +345 -0
- package/dist/doctor.js.map +1 -0
- package/dist/erc7677-DOW58QBE.d.cts +111 -0
- package/dist/erc7677-DOW58QBE.d.ts +111 -0
- package/dist/errors-CgX1vNj7.d.cts +100 -0
- package/dist/errors-CgX1vNj7.d.ts +100 -0
- package/dist/index.cjs +802 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2398 -0
- package/dist/index.d.ts +2398 -0
- package/dist/index.js +559 -0
- package/dist/index.js.map +1 -0
- package/dist/paymaster/server.cjs +38 -0
- package/dist/paymaster/server.cjs.map +1 -0
- package/dist/paymaster/server.d.cts +57 -0
- package/dist/paymaster/server.d.ts +57 -0
- package/dist/paymaster/server.js +36 -0
- package/dist/paymaster/server.js.map +1 -0
- package/dist/paymaster.cjs +356 -0
- package/dist/paymaster.cjs.map +1 -0
- package/dist/paymaster.d.cts +1851 -0
- package/dist/paymaster.d.ts +1851 -0
- package/dist/paymaster.js +289 -0
- package/dist/paymaster.js.map +1 -0
- package/dist/privy/react.cjs +48 -0
- package/dist/privy/react.cjs.map +1 -0
- package/dist/privy/react.d.cts +194 -0
- package/dist/privy/react.d.ts +194 -0
- package/dist/privy/react.js +7 -0
- package/dist/privy/react.js.map +1 -0
- package/dist/privy/server.cjs +43 -0
- package/dist/privy/server.cjs.map +1 -0
- package/dist/privy/server.d.cts +192 -0
- package/dist/privy/server.d.ts +192 -0
- package/dist/privy/server.js +6 -0
- package/dist/privy/server.js.map +1 -0
- package/dist/privy/wagmi.d.ts +90 -0
- package/dist/privy/wagmi.js +55 -0
- package/dist/privy/wagmi.js.map +1 -0
- package/dist/privy.cjs +34 -0
- package/dist/privy.cjs.map +1 -0
- package/dist/privy.d.cts +4 -0
- package/dist/privy.d.ts +4 -0
- package/dist/privy.js +5 -0
- package/dist/privy.js.map +1 -0
- package/dist/react.cjs +72 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +66 -0
- package/dist/react.d.ts +66 -0
- package/dist/react.js +68 -0
- package/dist/react.js.map +1 -0
- package/dist/requirements-C-QiJkL9.d.cts +134 -0
- package/dist/requirements-C-QiJkL9.d.ts +134 -0
- package/dist/scope-DBRkN7bR.d.cts +94 -0
- package/dist/scope-DBRkN7bR.d.ts +94 -0
- package/dist/server.cjs +59 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +208 -0
- package/dist/server.d.ts +208 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/session/kernel.cjs +82 -0
- package/dist/session/kernel.cjs.map +1 -0
- package/dist/session/kernel.d.cts +131 -0
- package/dist/session/kernel.d.ts +131 -0
- package/dist/session/kernel.js +13 -0
- package/dist/session/kernel.js.map +1 -0
- package/dist/session/react.cjs +37 -0
- package/dist/session/react.cjs.map +1 -0
- package/dist/session/react.d.cts +119 -0
- package/dist/session/react.d.ts +119 -0
- package/dist/session/react.js +8 -0
- package/dist/session/react.js.map +1 -0
- package/dist/session/server.cjs +267 -0
- package/dist/session/server.cjs.map +1 -0
- package/dist/session/server.d.cts +151 -0
- package/dist/session/server.d.ts +151 -0
- package/dist/session/server.js +252 -0
- package/dist/session/server.js.map +1 -0
- package/dist/session.cjs +74 -0
- package/dist/session.cjs.map +1 -0
- package/dist/session.d.cts +3 -0
- package/dist/session.d.ts +3 -0
- package/dist/session.js +5 -0
- package/dist/session.js.map +1 -0
- package/dist/status-CmOsyPmO.d.cts +295 -0
- package/dist/status-DwkkOrGQ.d.ts +295 -0
- package/dist/store-CjmLgp9g.d.cts +64 -0
- package/dist/store-CjmLgp9g.d.ts +64 -0
- package/dist/types-BEEM7WdG.d.cts +25 -0
- package/dist/types-BEEM7WdG.d.ts +25 -0
- package/dist/types-BilBTDqK.d.cts +27 -0
- package/dist/types-BilBTDqK.d.ts +27 -0
- package/package.json +209 -3
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ENTRY_POINT_V07, createPepuPaymasterClient, estimatePepuUserOpFees, requireBundlerUrl } from './chunk-IB2FSPMJ.js';
|
|
2
|
+
import { normalizeCalls } from './chunk-VBH3JLQ5.js';
|
|
3
|
+
import { describeUserOpFailure } from './chunk-D52PADVY.js';
|
|
4
|
+
import { txUrl } from './chunk-J6UXXHBE.js';
|
|
5
|
+
import { resolvePepuEndpoints } from './chunk-XC4IBCI2.js';
|
|
6
|
+
import { pepuMainnet } from './chunk-VTQIHMF3.js';
|
|
7
|
+
import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator';
|
|
8
|
+
import { constants, createKernelAccount, createKernelAccountClient } from '@zerodev/sdk';
|
|
9
|
+
import { http, createPublicClient } from 'viem';
|
|
10
|
+
|
|
11
|
+
var KERNEL_VERSION = constants.KERNEL_V3_1;
|
|
12
|
+
function zd(client) {
|
|
13
|
+
return client;
|
|
14
|
+
}
|
|
15
|
+
function defaultPublicClient() {
|
|
16
|
+
return createPublicClient({ chain: pepuMainnet, transport: http(resolvePepuEndpoints().rpcUrl) });
|
|
17
|
+
}
|
|
18
|
+
async function toPepuKernelAccount(p) {
|
|
19
|
+
const sudo = await signerToEcdsaValidator(zd(p.publicClient), {
|
|
20
|
+
signer: p.owner,
|
|
21
|
+
entryPoint: ENTRY_POINT_V07,
|
|
22
|
+
kernelVersion: KERNEL_VERSION
|
|
23
|
+
});
|
|
24
|
+
return createKernelAccount(zd(p.publicClient), {
|
|
25
|
+
entryPoint: ENTRY_POINT_V07,
|
|
26
|
+
kernelVersion: KERNEL_VERSION,
|
|
27
|
+
plugins: { sudo, ...p.plugins?.regular ? { regular: p.plugins.regular } : {} },
|
|
28
|
+
...p.index !== void 0 ? { index: p.index } : {}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function toEmptyAccount(address) {
|
|
32
|
+
const refuse = async () => {
|
|
33
|
+
throw new Error("read-only account cannot sign");
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
address,
|
|
37
|
+
type: "local",
|
|
38
|
+
source: "custom",
|
|
39
|
+
publicKey: "0x",
|
|
40
|
+
signMessage: refuse,
|
|
41
|
+
signTransaction: refuse,
|
|
42
|
+
signTypedData: refuse
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async function getKernelAddress(publicClient, owner) {
|
|
46
|
+
const account = await toPepuKernelAccount({ publicClient, owner: toEmptyAccount(owner) });
|
|
47
|
+
return account.address;
|
|
48
|
+
}
|
|
49
|
+
function createPepuSponsoredClient(p) {
|
|
50
|
+
const publicClient = p.publicClient ?? defaultPublicClient();
|
|
51
|
+
const paymaster = createPepuPaymasterClient({
|
|
52
|
+
...p.paymasterUrl !== void 0 ? { paymasterUrl: p.paymasterUrl } : {},
|
|
53
|
+
...p.paymasterToken !== void 0 ? { paymasterToken: p.paymasterToken } : {},
|
|
54
|
+
...p.paymasterContext ? { context: p.paymasterContext } : {}
|
|
55
|
+
});
|
|
56
|
+
return createKernelAccountClient({
|
|
57
|
+
account: p.account,
|
|
58
|
+
chain: pepuMainnet,
|
|
59
|
+
client: zd(publicClient),
|
|
60
|
+
bundlerTransport: http(requireBundlerUrl(p.bundlerUrl)),
|
|
61
|
+
paymaster,
|
|
62
|
+
userOperation: { estimateFeesPerGas: async () => estimatePepuUserOpFees(publicClient) }
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async function sendSponsored(p) {
|
|
66
|
+
const calls = normalizeCalls(p.calls);
|
|
67
|
+
try {
|
|
68
|
+
const account = p.client.account;
|
|
69
|
+
if (!account) throw new Error("The Kernel client has no account.");
|
|
70
|
+
const callData = await account.encodeCalls(calls);
|
|
71
|
+
const userOpHash = await p.client.sendUserOperation({ callData });
|
|
72
|
+
const receipt = await p.client.waitForUserOperationReceipt({ hash: userOpHash, timeout: p.timeoutMs ?? 9e4 });
|
|
73
|
+
const transactionHash = receipt.receipt.transactionHash;
|
|
74
|
+
return {
|
|
75
|
+
userOpHash,
|
|
76
|
+
transactionHash,
|
|
77
|
+
success: receipt.success,
|
|
78
|
+
paymaster: receipt.paymaster ?? null,
|
|
79
|
+
actualGasCostWei: receipt.actualGasCost,
|
|
80
|
+
explorerUrl: txUrl(pepuMainnet, transactionHash)
|
|
81
|
+
};
|
|
82
|
+
} catch (e) {
|
|
83
|
+
throw describeUserOpFailure(e);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { KERNEL_VERSION, createPepuSponsoredClient, getKernelAddress, sendSponsored, toPepuKernelAccount };
|
|
88
|
+
//# sourceMappingURL=chunk-ZB6SVBK4.js.map
|
|
89
|
+
//# sourceMappingURL=chunk-ZB6SVBK4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/aa/kernel.ts"],"names":[],"mappings":"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","file":"chunk-ZB6SVBK4.js","sourcesContent":["/**\n * @pepu-chain/sdk/aa/kernel: Kernel v3.1 smart account plus sponsored-send\n * helpers for the \"direct\" transport (your own bundler and paymaster URLs).\n * Needs the optional peers `@zerodev/sdk` and `@zerodev/ecdsa-validator`.\n *\n * This is the only module in the SDK (with `session/kernel` and `combo`) that\n * imports ZeroDev. Ported from `templates/sponsored-session-app/lib/kernel.ts`\n * (Kernel v3.1 build, 20% fee headroom because Alto lacks\n * `zd_getUserOperationGasPrice`).\n *\n * Session keys: `toPepuKernelAccount` takes an optional `plugins.regular`\n * validator, which is the plug point WP-B6 (`/session/kernel`, `/combo`) uses\n * to add a permission validator on top of the ECDSA root.\n */\nimport { signerToEcdsaValidator } from \"@zerodev/ecdsa-validator\";\nimport { constants, createKernelAccount, createKernelAccountClient } from \"@zerodev/sdk\";\nimport type { Signer } from \"@zerodev/sdk/types\";\nimport { createPublicClient, http } from \"viem\";\nimport type { Address, Hex, LocalAccount, PublicClient, WalletClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { resolvePepuEndpoints } from \"../endpoints.js\";\nimport { txUrl } from \"../explorer.js\";\nimport type { PaymasterContext } from \"../erc7677.js\";\nimport { normalizeCalls } from \"./calls.js\";\nimport { ENTRY_POINT_V07, createPepuPaymasterClient, estimatePepuUserOpFees, requireBundlerUrl } from \"./clients.js\";\nimport { describeUserOpFailure } from \"./describe.js\";\nimport type { Call } from \"./types.js\";\n\nexport type { Call } from \"./types.js\";\nexport { encodeKernelExecute } from \"./calls.js\";\n\n/** Kernel v3.1, the version deployed on PEPU mainnet (factory in the contract registry). */\nexport const KERNEL_VERSION = constants.KERNEL_V3_1;\n\ntype ZeroDevClient = Parameters<typeof createKernelAccount>[0];\ntype KernelAccountParams = Parameters<typeof createKernelAccount>[1];\n\n/**\n * The ZeroDev packages resolve their own copy of viem as a peer. In a monorepo\n * with several viem installs two identical `PublicClient` types are nominally\n * different; this is a type-level bridge only (same object at runtime).\n */\nfunction zd(client: PublicClient): ZeroDevClient {\n return client as unknown as ZeroDevClient;\n}\n\n/** The Kernel account type this module builds. */\nexport type KernelSmartAccount = Awaited<ReturnType<typeof createKernelAccount>>;\n/** The sponsored client type {@link createPepuSponsoredClient} returns. */\nexport type KernelAccountClient = ReturnType<typeof createKernelAccountClient>;\n\n/** Anything that can sign for the Kernel owner. */\nexport type KernelOwner = LocalAccount | Signer | WalletClient;\n\nfunction defaultPublicClient(): PublicClient {\n return createPublicClient({ chain: pepuMainnet, transport: http(resolvePepuEndpoints().rpcUrl) }) as PublicClient;\n}\n\n/**\n * Build a Kernel v3.1 smart account owned by `owner` (ECDSA root validator).\n * The address depends only on the owner and `index`, never on a session.\n * Pass `plugins.regular` to add a permission (session-key) validator on top\n * of the root; that is how `@pepu-chain/sdk/session/kernel` builds on this.\n *\n * @example\n * const account = await toPepuKernelAccount({ publicClient, owner: privateKeyToAccount(key) });\n */\nexport async function toPepuKernelAccount(p: {\n publicClient: PublicClient;\n owner: KernelOwner;\n index?: bigint;\n /**\n * `regular` is a ZeroDev validator plugin, for example the permission\n * validator from `@zerodev/permissions` (see `@pepu-chain/sdk/session/kernel`).\n * Typed as `object` so this entry does not need `@zerodev/permissions` types.\n */\n plugins?: { regular?: object };\n}): Promise<KernelSmartAccount> {\n const sudo = await signerToEcdsaValidator(zd(p.publicClient), {\n signer: p.owner as Signer,\n entryPoint: ENTRY_POINT_V07,\n kernelVersion: KERNEL_VERSION,\n });\n return createKernelAccount(zd(p.publicClient), {\n entryPoint: ENTRY_POINT_V07,\n kernelVersion: KERNEL_VERSION,\n plugins: { sudo, ...(p.plugins?.regular ? { regular: p.plugins.regular } : {}) },\n ...(p.index !== undefined ? { index: p.index } : {}),\n } as KernelAccountParams);\n}\n\nfunction toEmptyAccount(address: Address): LocalAccount {\n const refuse = async (): Promise<never> => {\n throw new Error(\"read-only account cannot sign\");\n };\n return {\n address,\n type: \"local\",\n source: \"custom\",\n publicKey: \"0x\" as Hex,\n signMessage: refuse,\n signTransaction: refuse,\n signTypedData: refuse,\n } as unknown as LocalAccount;\n}\n\n/**\n * The counterfactual Kernel address for an owner, with no signature needed.\n * Lifted from `templates/sponsored-session-app/lib/kernel.ts`.\n *\n * @example\n * const smartAccount = await getKernelAddress(publicClient, ownerAddress);\n */\nexport async function getKernelAddress(publicClient: PublicClient, owner: Address): Promise<Address> {\n const account = await toPepuKernelAccount({ publicClient, owner: toEmptyAccount(owner) });\n return account.address;\n}\n\n/**\n * A Kernel client that sends through YOUR bundler and has gas paid by YOUR\n * paymaster (ERC-7677). Fees come from the chain with 20% headroom.\n *\n * @example\n * const client = createPepuSponsoredClient({ account, paymasterContext: { privyAccessToken } });\n */\nexport function createPepuSponsoredClient(p: {\n account: KernelSmartAccount;\n bundlerUrl?: string;\n paymasterUrl?: string;\n /** Project client token; builds the ERC-7677 URL against the paymaster base when no URL is configured. */\n paymasterToken?: string;\n paymasterContext?: PaymasterContext;\n publicClient?: PublicClient;\n}): KernelAccountClient {\n const publicClient = p.publicClient ?? defaultPublicClient();\n const paymaster = createPepuPaymasterClient({\n ...(p.paymasterUrl !== undefined ? { paymasterUrl: p.paymasterUrl } : {}),\n ...(p.paymasterToken !== undefined ? { paymasterToken: p.paymasterToken } : {}),\n ...(p.paymasterContext ? { context: p.paymasterContext } : {}),\n });\n return createKernelAccountClient({\n account: p.account,\n chain: pepuMainnet,\n client: zd(publicClient),\n bundlerTransport: http(requireBundlerUrl(p.bundlerUrl)),\n paymaster,\n userOperation: { estimateFeesPerGas: async () => estimatePepuUserOpFees(publicClient) },\n } as unknown as Parameters<typeof createKernelAccountClient>[0]);\n}\n\n/** Result of {@link sendSponsored}. */\nexport interface SendSponsoredResult {\n userOpHash: Hex;\n transactionHash: Hex;\n success: boolean;\n paymaster: Address | null;\n actualGasCostWei: bigint;\n explorerUrl: string;\n}\n\n/**\n * Encode `calls`, send one UserOperation, wait for its receipt, and report\n * who paid. Failures are mapped through `describeUserOpFailure` (AAxx and\n * paymaster reasons become typed PepuErrors). Flow ported from\n * `sendSessionTap` in the sponsored-session-app template.\n *\n * @example\n * const r = await sendSponsored({ client, calls: [{ to, abi, functionName: \"tap\" }] });\n * console.log(r.paymaster, r.explorerUrl);\n */\nexport async function sendSponsored(p: {\n client: KernelAccountClient;\n calls: Call[];\n timeoutMs?: number;\n}): Promise<SendSponsoredResult> {\n const calls = normalizeCalls(p.calls);\n try {\n const account = p.client.account;\n if (!account) throw new Error(\"The Kernel client has no account.\");\n const callData = await account.encodeCalls(calls);\n const userOpHash = await p.client.sendUserOperation({ callData });\n const receipt = await p.client.waitForUserOperationReceipt({ hash: userOpHash, timeout: p.timeoutMs ?? 90_000 });\n const transactionHash = receipt.receipt.transactionHash;\n return {\n userOpHash,\n transactionHash,\n success: receipt.success,\n paymaster: receipt.paymaster ?? null,\n actualGasCostWei: receipt.actualGasCost,\n explorerUrl: txUrl(pepuMainnet, transactionHash),\n };\n } catch (e) {\n throw describeUserOpFailure(e);\n }\n}\n"]}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkR5PXQNO3_cjs = require('../chunk-R5PXQNO3.cjs');
|
|
4
|
+
var chunkPHM3ZORG_cjs = require('../chunk-PHM3ZORG.cjs');
|
|
5
|
+
var chunkNVOPDXTA_cjs = require('../chunk-NVOPDXTA.cjs');
|
|
6
|
+
require('../chunk-7MNJF2OB.cjs');
|
|
7
|
+
require('../chunk-AJS4UFQX.cjs');
|
|
8
|
+
require('../chunk-A5LP2UCS.cjs');
|
|
9
|
+
require('../chunk-WANILJZQ.cjs');
|
|
10
|
+
var chunkDH6BFNVJ_cjs = require('../chunk-DH6BFNVJ.cjs');
|
|
11
|
+
require('../chunk-NE3QKDOB.cjs');
|
|
12
|
+
var chunkJ3O2ZGG3_cjs = require('../chunk-J3O2ZGG3.cjs');
|
|
13
|
+
var chunkC7IC36XS_cjs = require('../chunk-C7IC36XS.cjs');
|
|
14
|
+
require('../chunk-4GINFJO6.cjs');
|
|
15
|
+
require('../chunk-VF3D6KLQ.cjs');
|
|
16
|
+
var chunkDPCZJLB3_cjs = require('../chunk-DPCZJLB3.cjs');
|
|
17
|
+
require('../chunk-C2XW44FI.cjs');
|
|
18
|
+
var chunkYQL7NISX_cjs = require('../chunk-YQL7NISX.cjs');
|
|
19
|
+
var reactAuth = require('@privy-io/react-auth');
|
|
20
|
+
var react = require('react');
|
|
21
|
+
var viem = require('viem');
|
|
22
|
+
|
|
23
|
+
var DEFAULT_SESSION_ENDPOINTS = {
|
|
24
|
+
prepare: "/api/session/prepare",
|
|
25
|
+
activate: "/api/session/activate",
|
|
26
|
+
status: "/api/session/status",
|
|
27
|
+
act: "/api/session/act",
|
|
28
|
+
revoke: "/api/session/revoke"
|
|
29
|
+
};
|
|
30
|
+
function deriveSessionPhase(p) {
|
|
31
|
+
if (!p.authenticated) return "signed-out";
|
|
32
|
+
if (!p.hasWallet) return "provisioning";
|
|
33
|
+
if (p.granting) return "granting";
|
|
34
|
+
if (p.validUntil !== void 0) return p.nowSeconds < p.validUntil ? "active" : "expired";
|
|
35
|
+
return p.hasError ? "error" : "ready";
|
|
36
|
+
}
|
|
37
|
+
async function postJson(authFetch, url, body) {
|
|
38
|
+
const res = await authFetch(url, {
|
|
39
|
+
method: "POST",
|
|
40
|
+
...body === void 0 ? {} : { headers: { "content-type": "application/json" }, body: JSON.stringify(body) }
|
|
41
|
+
});
|
|
42
|
+
if (!res.ok) throw await chunkR5PXQNO3_cjs.errorFromResponse(res);
|
|
43
|
+
return await res.json();
|
|
44
|
+
}
|
|
45
|
+
async function grantKernelSession(p) {
|
|
46
|
+
const ep = { ...DEFAULT_SESSION_ENDPOINTS, ...p.endpoints };
|
|
47
|
+
const prepared = await postJson(p.authFetch, ep.prepare);
|
|
48
|
+
const { approval } = await chunkPHM3ZORG_cjs.approveKernelSession({
|
|
49
|
+
publicClient: p.publicClient,
|
|
50
|
+
owner: p.owner,
|
|
51
|
+
sessionKeyAddress: prepared.sessionKeyAddress,
|
|
52
|
+
policies: chunkPHM3ZORG_cjs.buildKernelSessionPolicies({ calls: p.scope.calls, validUntil: prepared.validUntil })
|
|
53
|
+
});
|
|
54
|
+
await postJson(p.authFetch, ep.activate, { approval });
|
|
55
|
+
return prepared;
|
|
56
|
+
}
|
|
57
|
+
var sharedClient;
|
|
58
|
+
function defaultPublicClient() {
|
|
59
|
+
sharedClient ??= chunkC7IC36XS_cjs.getPublicClient(chunkDPCZJLB3_cjs.pepuMainnet);
|
|
60
|
+
return sharedClient;
|
|
61
|
+
}
|
|
62
|
+
function useSponsoredSession(o) {
|
|
63
|
+
const { authenticated, ready: privyReady } = reactAuth.usePrivy();
|
|
64
|
+
const { wallet, address: owner } = chunkDH6BFNVJ_cjs.useEmbeddedWallet();
|
|
65
|
+
const pepuAuthFetch = chunkDH6BFNVJ_cjs.usePepuAuthFetch();
|
|
66
|
+
const customFetch = o.authFetch;
|
|
67
|
+
const authFetch = react.useCallback(
|
|
68
|
+
(url, init) => customFetch ? customFetch(url, init) : pepuAuthFetch(url, init),
|
|
69
|
+
[customFetch, pepuAuthFetch]
|
|
70
|
+
);
|
|
71
|
+
const endpointsRef = react.useRef({ ...DEFAULT_SESSION_ENDPOINTS, ...o.endpoints });
|
|
72
|
+
endpointsRef.current = { ...DEFAULT_SESSION_ENDPOINTS, ...o.endpoints };
|
|
73
|
+
const scopeRef = react.useRef(o.scope);
|
|
74
|
+
scopeRef.current = o.scope;
|
|
75
|
+
const publicClient = o.publicClient ?? defaultPublicClient();
|
|
76
|
+
const [smartAccount, setSmartAccount] = react.useState();
|
|
77
|
+
const [status, setStatus] = react.useState();
|
|
78
|
+
const [statusChecked, setStatusChecked] = react.useState(false);
|
|
79
|
+
const [prepared, setPrepared] = react.useState();
|
|
80
|
+
const [granting, setGranting] = react.useState(false);
|
|
81
|
+
const [error, setError] = react.useState();
|
|
82
|
+
const [now, setNow] = react.useState(() => Math.floor(Date.now() / 1e3));
|
|
83
|
+
const [tick, setTick] = react.useState(0);
|
|
84
|
+
const refetch = react.useCallback(() => setTick((t) => t + 1), []);
|
|
85
|
+
const [lastValidUntil, setLastValidUntil] = react.useState();
|
|
86
|
+
const grantInFlight = react.useRef(false);
|
|
87
|
+
react.useEffect(() => {
|
|
88
|
+
if (!owner) {
|
|
89
|
+
setSmartAccount(void 0);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
let cancelled = false;
|
|
93
|
+
chunkNVOPDXTA_cjs.getKernelAddress(publicClient, owner).then((a) => {
|
|
94
|
+
if (!cancelled) setSmartAccount(a);
|
|
95
|
+
}).catch((e) => {
|
|
96
|
+
if (!cancelled) setError(chunkYQL7NISX_cjs.toPepuError(e, { op: "derive smart account" }));
|
|
97
|
+
});
|
|
98
|
+
return () => {
|
|
99
|
+
cancelled = true;
|
|
100
|
+
};
|
|
101
|
+
}, [owner, publicClient]);
|
|
102
|
+
react.useEffect(() => {
|
|
103
|
+
if (!authenticated || !owner) return;
|
|
104
|
+
let cancelled = false;
|
|
105
|
+
void (async () => {
|
|
106
|
+
try {
|
|
107
|
+
const res = await authFetch(endpointsRef.current.status);
|
|
108
|
+
if (!res.ok) throw await chunkR5PXQNO3_cjs.errorFromResponse(res);
|
|
109
|
+
const body = await res.json();
|
|
110
|
+
if (cancelled) return;
|
|
111
|
+
setStatus(body);
|
|
112
|
+
if (body.active) setLastValidUntil(body.validUntil);
|
|
113
|
+
} catch (e) {
|
|
114
|
+
if (!cancelled) setError(chunkYQL7NISX_cjs.toPepuError(e, { op: "session status" }));
|
|
115
|
+
} finally {
|
|
116
|
+
if (!cancelled) setStatusChecked(true);
|
|
117
|
+
}
|
|
118
|
+
})();
|
|
119
|
+
return () => {
|
|
120
|
+
cancelled = true;
|
|
121
|
+
};
|
|
122
|
+
}, [authenticated, owner, authFetch, tick]);
|
|
123
|
+
react.useEffect(() => {
|
|
124
|
+
const id = setInterval(() => setNow(Math.floor(Date.now() / 1e3)), 1e3);
|
|
125
|
+
return () => clearInterval(id);
|
|
126
|
+
}, []);
|
|
127
|
+
react.useEffect(() => {
|
|
128
|
+
if (!o.pollMs || o.pollMs <= 0) return;
|
|
129
|
+
const id = setInterval(refetch, o.pollMs);
|
|
130
|
+
return () => clearInterval(id);
|
|
131
|
+
}, [o.pollMs, refetch]);
|
|
132
|
+
const grant = react.useCallback(async () => {
|
|
133
|
+
if (grantInFlight.current) return;
|
|
134
|
+
grantInFlight.current = true;
|
|
135
|
+
setGranting(true);
|
|
136
|
+
setError(void 0);
|
|
137
|
+
try {
|
|
138
|
+
if (!wallet || !owner) {
|
|
139
|
+
throw new chunkYQL7NISX_cjs.PepuAuthError("WALLET_NOT_PROVISIONED", "No embedded wallet to sign the session grant.");
|
|
140
|
+
}
|
|
141
|
+
const provider = await wallet.getEthereumProvider();
|
|
142
|
+
const walletClient = viem.createWalletClient({
|
|
143
|
+
account: owner,
|
|
144
|
+
chain: chunkDPCZJLB3_cjs.pepuMainnet,
|
|
145
|
+
transport: viem.custom(provider)
|
|
146
|
+
});
|
|
147
|
+
const result = await grantKernelSession({
|
|
148
|
+
authFetch,
|
|
149
|
+
publicClient,
|
|
150
|
+
owner: walletClient,
|
|
151
|
+
scope: scopeRef.current,
|
|
152
|
+
endpoints: endpointsRef.current
|
|
153
|
+
});
|
|
154
|
+
setPrepared(result);
|
|
155
|
+
setLastValidUntil(result.validUntil);
|
|
156
|
+
setStatus({
|
|
157
|
+
active: true,
|
|
158
|
+
validUntil: result.validUntil,
|
|
159
|
+
kernelAddress: result.kernelAddress,
|
|
160
|
+
ownerAddress: result.ownerAddress,
|
|
161
|
+
sessionKeyAddress: result.sessionKeyAddress,
|
|
162
|
+
actions: 0
|
|
163
|
+
});
|
|
164
|
+
} catch (e) {
|
|
165
|
+
setError(chunkYQL7NISX_cjs.toPepuError(e, { op: "session grant" }));
|
|
166
|
+
} finally {
|
|
167
|
+
grantInFlight.current = false;
|
|
168
|
+
setGranting(false);
|
|
169
|
+
}
|
|
170
|
+
}, [wallet, owner, authFetch, publicClient]);
|
|
171
|
+
const act = react.useCallback(
|
|
172
|
+
async (input) => {
|
|
173
|
+
try {
|
|
174
|
+
const out = await postJson(authFetch, endpointsRef.current.act, input === void 0 ? {} : input);
|
|
175
|
+
setError(void 0);
|
|
176
|
+
refetch();
|
|
177
|
+
return out;
|
|
178
|
+
} catch (e) {
|
|
179
|
+
const err = chunkYQL7NISX_cjs.toPepuError(e, { op: "session act" });
|
|
180
|
+
setError(err);
|
|
181
|
+
if (err.code === "SESSION_NONE") {
|
|
182
|
+
setStatus({ active: false });
|
|
183
|
+
setLastValidUntil(void 0);
|
|
184
|
+
}
|
|
185
|
+
throw err;
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
[authFetch, refetch]
|
|
189
|
+
);
|
|
190
|
+
const revoke = react.useCallback(async () => {
|
|
191
|
+
try {
|
|
192
|
+
await postJson(authFetch, endpointsRef.current.revoke);
|
|
193
|
+
setStatus({ active: false });
|
|
194
|
+
setLastValidUntil(void 0);
|
|
195
|
+
setPrepared(void 0);
|
|
196
|
+
setError(void 0);
|
|
197
|
+
} catch (e) {
|
|
198
|
+
const err = chunkYQL7NISX_cjs.toPepuError(e, { op: "session revoke" });
|
|
199
|
+
setError(err);
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
}, [authFetch]);
|
|
203
|
+
const phase = deriveSessionPhase({
|
|
204
|
+
authenticated: privyReady ? authenticated : false,
|
|
205
|
+
hasWallet: owner !== void 0,
|
|
206
|
+
validUntil: status?.active ? status.validUntil : lastValidUntil,
|
|
207
|
+
nowSeconds: now,
|
|
208
|
+
granting,
|
|
209
|
+
hasError: error !== void 0
|
|
210
|
+
});
|
|
211
|
+
const expiresAt = status?.active ? status.validUntil : lastValidUntil;
|
|
212
|
+
const scope = prepared?.scope ?? (expiresAt !== void 0 ? chunkJ3O2ZGG3_cjs.describeKernelSessionScope({ calls: o.scope.calls, validUntil: expiresAt }) : void 0);
|
|
213
|
+
const statusLoading = privyReady && authenticated && owner !== void 0 && !statusChecked && status === void 0;
|
|
214
|
+
return {
|
|
215
|
+
phase,
|
|
216
|
+
statusLoading,
|
|
217
|
+
...owner ? { owner } : {},
|
|
218
|
+
...smartAccount ? { smartAccount } : {},
|
|
219
|
+
...scope ? { scope } : {},
|
|
220
|
+
...expiresAt !== void 0 ? { expiresAt } : {},
|
|
221
|
+
...status?.active ? { actions: status.actions } : {},
|
|
222
|
+
grant,
|
|
223
|
+
act,
|
|
224
|
+
revoke,
|
|
225
|
+
refetch,
|
|
226
|
+
...error ? { error } : {}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
exports.DEFAULT_SESSION_ENDPOINTS = DEFAULT_SESSION_ENDPOINTS;
|
|
231
|
+
exports.deriveSessionPhase = deriveSessionPhase;
|
|
232
|
+
exports.grantKernelSession = grantKernelSession;
|
|
233
|
+
exports.useSponsoredSession = useSponsoredSession;
|
|
234
|
+
//# sourceMappingURL=react.cjs.map
|
|
235
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Address, PublicClient } from 'viem';
|
|
2
|
+
import { P as PepuError } from '../errors-CgX1vNj7.cjs';
|
|
3
|
+
import { AuthFetch } from '../session/react.cjs';
|
|
4
|
+
import { KernelOwner } from '../aa/kernel.cjs';
|
|
5
|
+
import { a as KernelSessionScope, K as KernelSessionCall } from '../scope-DBRkN7bR.cjs';
|
|
6
|
+
export { S as SponsoredActResult } from '../types-BEEM7WdG.cjs';
|
|
7
|
+
import '@zerodev/sdk/types';
|
|
8
|
+
import '@zerodev/sdk';
|
|
9
|
+
import '../erc7677-DOW58QBE.cjs';
|
|
10
|
+
import '../types-BilBTDqK.cjs';
|
|
11
|
+
import '../calls-BRPjKgjl.cjs';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* `@pepu-chain/sdk/combo/react` (browser): hooks for the combined flow. Google
|
|
15
|
+
* sign-in (Privy), ONE owner signature for an on-chain session, then actions
|
|
16
|
+
* with no popup and no gas. Pairs with `createSponsoredSessionRoutes` from
|
|
17
|
+
* `@pepu-chain/sdk/combo`.
|
|
18
|
+
*
|
|
19
|
+
* Extracted from templates/sponsored-session-app/components/session-flow.tsx.
|
|
20
|
+
* The browser's only signing job is the grant; everything after it is a request
|
|
21
|
+
* to your own server, authenticated by the Privy access token.
|
|
22
|
+
*
|
|
23
|
+
* Needs `react`, `@privy-io/react-auth` and the `@zerodev/*` peers.
|
|
24
|
+
*/
|
|
25
|
+
/** The routes {@link useSponsoredSession} calls. */
|
|
26
|
+
interface SponsoredSessionEndpoints {
|
|
27
|
+
prepare: string;
|
|
28
|
+
activate: string;
|
|
29
|
+
status: string;
|
|
30
|
+
act: string;
|
|
31
|
+
revoke: string;
|
|
32
|
+
}
|
|
33
|
+
/** Defaults match the `app/api/session/<name>/route.ts` convention. */
|
|
34
|
+
declare const DEFAULT_SESSION_ENDPOINTS: SponsoredSessionEndpoints;
|
|
35
|
+
/** Where the session flow is, for rendering. */
|
|
36
|
+
type SponsoredSessionPhase = "signed-out" | "provisioning" | "ready" | "granting" | "active" | "expired" | "error";
|
|
37
|
+
/**
|
|
38
|
+
* Derive the phase from plain inputs. Pure.
|
|
39
|
+
*
|
|
40
|
+
* - not signed in: `signed-out`; signed in without an embedded wallet: `provisioning`
|
|
41
|
+
* - a grant in flight: `granting`
|
|
42
|
+
* - an expiry that has passed: `expired`; one still ahead: `active`
|
|
43
|
+
* - an error with nothing active: `error`; otherwise `ready`
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* deriveSessionPhase({ authenticated: true, hasWallet: true, validUntil: 100, nowSeconds: 200 }); // "expired"
|
|
47
|
+
*/
|
|
48
|
+
declare function deriveSessionPhase(p: {
|
|
49
|
+
authenticated: boolean;
|
|
50
|
+
hasWallet: boolean;
|
|
51
|
+
/** The last expiry the server reported for an active session, if any. */
|
|
52
|
+
validUntil?: number | undefined;
|
|
53
|
+
nowSeconds: number;
|
|
54
|
+
granting?: boolean;
|
|
55
|
+
hasError?: boolean;
|
|
56
|
+
}): SponsoredSessionPhase;
|
|
57
|
+
/** What the server's `prepare` route returns. */
|
|
58
|
+
interface PreparedSession {
|
|
59
|
+
ownerAddress: Address;
|
|
60
|
+
kernelAddress: Address;
|
|
61
|
+
sessionKeyAddress: Address;
|
|
62
|
+
validUntil: number;
|
|
63
|
+
minutes: number;
|
|
64
|
+
scope: KernelSessionScope;
|
|
65
|
+
}
|
|
66
|
+
/** What the server's `status` route returns. */
|
|
67
|
+
type SponsoredSessionStatus = {
|
|
68
|
+
active: false;
|
|
69
|
+
} | {
|
|
70
|
+
active: true;
|
|
71
|
+
validUntil: number;
|
|
72
|
+
kernelAddress: Address;
|
|
73
|
+
ownerAddress: Address;
|
|
74
|
+
sessionKeyAddress: Address;
|
|
75
|
+
actions: number;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* The grant, outside React: ask the server to `prepare` a session key, have
|
|
79
|
+
* `owner` sign the ONE EIP-712 approval (no gas), then `activate`. Rebuilds
|
|
80
|
+
* the policies from `scope` and the server's expiry; the server checks the
|
|
81
|
+
* resulting permission id matches what it issued, so a different scope is
|
|
82
|
+
* rejected with `SESSION_APPROVAL_MISMATCH`.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* const prepared = await grantKernelSession({ authFetch, publicClient, owner: walletClient, scope });
|
|
86
|
+
*/
|
|
87
|
+
declare function grantKernelSession(p: {
|
|
88
|
+
authFetch: AuthFetch;
|
|
89
|
+
publicClient: PublicClient;
|
|
90
|
+
owner: KernelOwner;
|
|
91
|
+
scope: {
|
|
92
|
+
calls: readonly KernelSessionCall[];
|
|
93
|
+
};
|
|
94
|
+
endpoints?: Partial<SponsoredSessionEndpoints>;
|
|
95
|
+
}): Promise<PreparedSession>;
|
|
96
|
+
/** Options for {@link useSponsoredSession}. */
|
|
97
|
+
interface UseSponsoredSessionOptions {
|
|
98
|
+
/** The same scope the server uses. The browser rebuilds the policies from it. */
|
|
99
|
+
scope: {
|
|
100
|
+
calls: readonly KernelSessionCall[];
|
|
101
|
+
};
|
|
102
|
+
endpoints?: Partial<SponsoredSessionEndpoints>;
|
|
103
|
+
/** Default `usePepuAuthFetch()` (Privy bearer token). */
|
|
104
|
+
authFetch?: AuthFetch;
|
|
105
|
+
/** Default: a viem client on the PEPU RPC. */
|
|
106
|
+
publicClient?: PublicClient;
|
|
107
|
+
/** Re-poll the status route this often. Default 0 (only on mount and after actions). */
|
|
108
|
+
pollMs?: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The whole session flow for a component.
|
|
112
|
+
*
|
|
113
|
+
* - `grant()`: prepare, ONE owner signature through the Privy embedded wallet
|
|
114
|
+
* (no gas), activate.
|
|
115
|
+
* - `act(input)`: POST the act route. No popup, no gas.
|
|
116
|
+
* - `revoke()`: deletes the server-side key right away. The on-chain grant
|
|
117
|
+
* lapses at its expiry; only the deleted key could ever use it.
|
|
118
|
+
* - `smartAccount` is the Kernel address that sends and holds assets (a read,
|
|
119
|
+
* known before any session exists); `owner` is the embedded wallet that signs.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* const { phase, grant, act, revoke, smartAccount, expiresAt, error } = useSponsoredSession<{}, { transactionHash: string }>({
|
|
123
|
+
* scope: { calls: [{ target: tapScore, abi: tapScoreAbi, functionName: "tap" }] },
|
|
124
|
+
* });
|
|
125
|
+
* if (phase === "ready") return <button onClick={grant}>Start session</button>;
|
|
126
|
+
*/
|
|
127
|
+
declare function useSponsoredSession<I = undefined, O = unknown>(o: UseSponsoredSessionOptions): {
|
|
128
|
+
phase: SponsoredSessionPhase;
|
|
129
|
+
/**
|
|
130
|
+
* True while a signed-in user with a wallet has not yet had the first status
|
|
131
|
+
* response (or failure). While true, `phase` is `ready` only because nothing
|
|
132
|
+
* is known yet: render a spinner instead of the "start a session" card.
|
|
133
|
+
*/
|
|
134
|
+
statusLoading: boolean;
|
|
135
|
+
owner?: Address;
|
|
136
|
+
smartAccount?: Address;
|
|
137
|
+
scope?: KernelSessionScope;
|
|
138
|
+
expiresAt?: number;
|
|
139
|
+
/** Successful actions in this session, as counted by the server. */
|
|
140
|
+
actions?: number;
|
|
141
|
+
grant(): Promise<void>;
|
|
142
|
+
act(input?: I): Promise<O>;
|
|
143
|
+
revoke(): Promise<void>;
|
|
144
|
+
refetch(): void;
|
|
145
|
+
error?: PepuError;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export { DEFAULT_SESSION_ENDPOINTS, type PreparedSession, type SponsoredSessionEndpoints, type SponsoredSessionPhase, type SponsoredSessionStatus, type UseSponsoredSessionOptions, deriveSessionPhase, grantKernelSession, useSponsoredSession };
|