@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
package/dist/combo.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { buildKernelSessionPolicies, isLive, loadKernelSessionAccount, generateSessionKey, expectedPermissionId } from './chunk-KVG3AYYR.js';
|
|
2
|
+
export { createMemoryStore, isLive } from './chunk-KVG3AYYR.js';
|
|
3
|
+
import { createPepuSponsoredClient, sendSponsored, getKernelAddress } from './chunk-ZB6SVBK4.js';
|
|
4
|
+
import './chunk-IB2FSPMJ.js';
|
|
5
|
+
import { normalizeCalls } from './chunk-VBH3JLQ5.js';
|
|
6
|
+
import './chunk-IY3ALPUJ.js';
|
|
7
|
+
import { buildPaymasterContext } from './chunk-MBA4CLA5.js';
|
|
8
|
+
import './chunk-D52PADVY.js';
|
|
9
|
+
import './chunk-FCXSP2YF.js';
|
|
10
|
+
import { isCallInScope, describeKernelSessionScope, checkApproval } from './chunk-ESMNAXUI.js';
|
|
11
|
+
import './chunk-J6UXXHBE.js';
|
|
12
|
+
import { resolvePepuEndpoints } from './chunk-XC4IBCI2.js';
|
|
13
|
+
import { pepuMainnet } from './chunk-VTQIHMF3.js';
|
|
14
|
+
import { requireUser, createPrivyServer } from './chunk-62M2LKQW.js';
|
|
15
|
+
import { assertServerOnly } from './chunk-W3JN3YIW.js';
|
|
16
|
+
import './chunk-3XUGQODR.js';
|
|
17
|
+
import { sessionExpiry, resolveSessionMinutes } from './chunk-YKEWWQEJ.js';
|
|
18
|
+
export { resolveSessionMinutes } from './chunk-YKEWWQEJ.js';
|
|
19
|
+
import { PepuPolicyError, toErrorResponse, PepuConfigError, toPepuError, PepuError, PepuChainError, PepuSessionError, PepuAuthError } from './chunk-6DSZ4Z2N.js';
|
|
20
|
+
import { createPublicClient, http } from 'viem';
|
|
21
|
+
|
|
22
|
+
assertServerOnly("@pepu-chain/sdk/combo");
|
|
23
|
+
function json(body, status = 200) {
|
|
24
|
+
return new Response(JSON.stringify(body), { status, headers: { "content-type": "application/json" } });
|
|
25
|
+
}
|
|
26
|
+
function upstream(e, op) {
|
|
27
|
+
const err = toPepuError(e, { op });
|
|
28
|
+
if (err.code === "UNKNOWN" && !(e instanceof PepuError)) {
|
|
29
|
+
return new PepuChainError("UNKNOWN", err.message, { status: 502, cause: e });
|
|
30
|
+
}
|
|
31
|
+
return err;
|
|
32
|
+
}
|
|
33
|
+
async function guard(op, fn) {
|
|
34
|
+
try {
|
|
35
|
+
return await fn();
|
|
36
|
+
} catch (e) {
|
|
37
|
+
return toErrorResponse(upstream(e, op));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function bearerToken(request) {
|
|
41
|
+
return (request.headers.get("authorization") ?? "").replace(/^Bearer\s+/i, "").trim();
|
|
42
|
+
}
|
|
43
|
+
var nowSeconds = () => Math.floor(Date.now() / 1e3);
|
|
44
|
+
function defaultPublicClient() {
|
|
45
|
+
return createPublicClient({ chain: pepuMainnet, transport: http(resolvePepuEndpoints().rpcUrl) });
|
|
46
|
+
}
|
|
47
|
+
function createSponsoredSessionRoutes(o) {
|
|
48
|
+
const unconfigured = o.scope.calls.some((c) => !c.target || String(c.target).trim() === "");
|
|
49
|
+
if (unconfigured) {
|
|
50
|
+
const unset = async () => toErrorResponse(
|
|
51
|
+
new PepuConfigError(
|
|
52
|
+
"CONFIG_MISSING_ENV",
|
|
53
|
+
`${o.scope.targetEnv ?? "A session target contract address"} is not set to a valid address. See .env.example.`,
|
|
54
|
+
{ hint: "Set it and restart the server." }
|
|
55
|
+
)
|
|
56
|
+
);
|
|
57
|
+
return {
|
|
58
|
+
prepare: { POST: unset },
|
|
59
|
+
activate: { POST: unset },
|
|
60
|
+
status: { GET: unset },
|
|
61
|
+
act: { POST: unset },
|
|
62
|
+
revoke: { POST: unset }
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
buildKernelSessionPolicies({ calls: o.scope.calls, validUntil: 1 });
|
|
66
|
+
let publicClient = o.publicClient;
|
|
67
|
+
const client = () => publicClient ??= defaultPublicClient();
|
|
68
|
+
const authenticate = async (request) => {
|
|
69
|
+
if (o.authenticate) {
|
|
70
|
+
const user = await o.authenticate(request);
|
|
71
|
+
if (!user) throw new PepuAuthError("AUTH_INVALID_TOKEN", "Missing or invalid Privy access token.");
|
|
72
|
+
return user;
|
|
73
|
+
}
|
|
74
|
+
const auth = await requireUser(request, { privy: o.privy ?? createPrivyServer() });
|
|
75
|
+
if (!auth.ok) return auth.response;
|
|
76
|
+
if (!auth.user.address) {
|
|
77
|
+
throw new PepuAuthError("WALLET_NOT_PROVISIONED", "No embedded wallet yet. Create it first (ensure-wallet route).", {
|
|
78
|
+
status: 409
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return { userId: auth.user.userId, ownerAddress: auth.user.address };
|
|
82
|
+
};
|
|
83
|
+
const minutes = () => o.minutes ?? resolveSessionMinutes(process.env.SESSION_DURATION_MINUTES);
|
|
84
|
+
const policiesFor = (validUntil) => buildKernelSessionPolicies({ calls: o.scope.calls, validUntil });
|
|
85
|
+
return {
|
|
86
|
+
prepare: {
|
|
87
|
+
POST: (request) => guard("combo prepare", async () => {
|
|
88
|
+
const user = await authenticate(request);
|
|
89
|
+
if (user instanceof Response) return user;
|
|
90
|
+
const { userId, ownerAddress } = user;
|
|
91
|
+
const mins = minutes();
|
|
92
|
+
const validUntil = sessionExpiry(nowSeconds(), mins);
|
|
93
|
+
const key = generateSessionKey();
|
|
94
|
+
const policies = policiesFor(validUntil);
|
|
95
|
+
const [kernelAddress, permissionId] = await Promise.all([
|
|
96
|
+
getKernelAddress(client(), ownerAddress),
|
|
97
|
+
expectedPermissionId({ publicClient: client(), sessionKeyAddress: key.address, policies })
|
|
98
|
+
]);
|
|
99
|
+
const record = {
|
|
100
|
+
userId,
|
|
101
|
+
ownerAddress,
|
|
102
|
+
kernelAddress,
|
|
103
|
+
sessionPrivateKey: key.privateKey,
|
|
104
|
+
sessionKeyAddress: key.address,
|
|
105
|
+
permissionId,
|
|
106
|
+
validUntil,
|
|
107
|
+
approval: null,
|
|
108
|
+
actions: 0
|
|
109
|
+
};
|
|
110
|
+
await o.store.set(record);
|
|
111
|
+
return json({
|
|
112
|
+
ownerAddress,
|
|
113
|
+
kernelAddress,
|
|
114
|
+
sessionKeyAddress: key.address,
|
|
115
|
+
validUntil,
|
|
116
|
+
minutes: mins,
|
|
117
|
+
scope: describeKernelSessionScope({ calls: o.scope.calls, validUntil })
|
|
118
|
+
});
|
|
119
|
+
})
|
|
120
|
+
},
|
|
121
|
+
activate: {
|
|
122
|
+
POST: (request) => guard("combo activate", async () => {
|
|
123
|
+
const user = await authenticate(request);
|
|
124
|
+
if (user instanceof Response) return user;
|
|
125
|
+
const body = await request.json().catch(() => null);
|
|
126
|
+
if (typeof body?.approval !== "string") {
|
|
127
|
+
throw new PepuPolicyError("UNKNOWN", "Missing approval.", { status: 400, hint: "Send { approval }." });
|
|
128
|
+
}
|
|
129
|
+
const record = await o.store.get(user.userId);
|
|
130
|
+
if (!record || record.approval !== null) {
|
|
131
|
+
throw new PepuSessionError("SESSION_NONE", "No pending session. Start again.");
|
|
132
|
+
}
|
|
133
|
+
if (nowSeconds() >= record.validUntil) {
|
|
134
|
+
await o.store.delete(record.userId);
|
|
135
|
+
throw new PepuSessionError("SESSION_EXPIRED", "The session offer expired. Start again.");
|
|
136
|
+
}
|
|
137
|
+
const check = checkApproval(body.approval, {
|
|
138
|
+
kernelAddress: record.kernelAddress,
|
|
139
|
+
permissionId: record.permissionId
|
|
140
|
+
});
|
|
141
|
+
if (!check.ok) throw new PepuSessionError("SESSION_APPROVAL_MISMATCH", check.reason, { status: 400 });
|
|
142
|
+
await o.store.set({ ...record, approval: body.approval });
|
|
143
|
+
return json({ active: true, validUntil: record.validUntil });
|
|
144
|
+
})
|
|
145
|
+
},
|
|
146
|
+
status: {
|
|
147
|
+
GET: (request) => guard("combo status", async () => {
|
|
148
|
+
const user = await authenticate(request);
|
|
149
|
+
if (user instanceof Response) return user;
|
|
150
|
+
const record = await o.store.get(user.userId);
|
|
151
|
+
if (!record || !isLive(record, nowSeconds())) return json({ active: false });
|
|
152
|
+
return json({
|
|
153
|
+
active: true,
|
|
154
|
+
validUntil: record.validUntil,
|
|
155
|
+
kernelAddress: record.kernelAddress,
|
|
156
|
+
ownerAddress: record.ownerAddress,
|
|
157
|
+
sessionKeyAddress: record.sessionKeyAddress,
|
|
158
|
+
actions: record.actions
|
|
159
|
+
});
|
|
160
|
+
})
|
|
161
|
+
},
|
|
162
|
+
act: {
|
|
163
|
+
POST: (request) => guard("combo act", async () => {
|
|
164
|
+
const user = await authenticate(request);
|
|
165
|
+
if (user instanceof Response) return user;
|
|
166
|
+
const record = await o.store.get(user.userId);
|
|
167
|
+
if (!record || !record.approval || !isLive(record, nowSeconds())) {
|
|
168
|
+
throw new PepuSessionError("SESSION_NONE", "No active session. Start one first.");
|
|
169
|
+
}
|
|
170
|
+
let input;
|
|
171
|
+
try {
|
|
172
|
+
input = o.act.parse(await request.json().catch(() => ({})));
|
|
173
|
+
} catch (e) {
|
|
174
|
+
throw new PepuPolicyError("UNKNOWN", e instanceof Error ? e.message : "Invalid request body.", {
|
|
175
|
+
status: 400,
|
|
176
|
+
hint: "Fix the request body.",
|
|
177
|
+
cause: e
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const calls = o.act.buildCalls(input, {
|
|
181
|
+
kernelAddress: record.kernelAddress,
|
|
182
|
+
ownerAddress: record.ownerAddress
|
|
183
|
+
});
|
|
184
|
+
assertCallsInScope(describeKernelSessionScope({ calls: o.scope.calls, validUntil: record.validUntil }), calls);
|
|
185
|
+
if (!await o.store.tryLock(user.userId)) {
|
|
186
|
+
throw new PepuChainError("UNKNOWN", "An action is already in flight.", {
|
|
187
|
+
status: 429,
|
|
188
|
+
retryable: true,
|
|
189
|
+
hint: "Wait for the current action to finish."
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const privyToken = o.forwardPrivyToken === false ? "" : bearerToken(request);
|
|
193
|
+
try {
|
|
194
|
+
const account = await loadKernelSessionAccount({
|
|
195
|
+
publicClient: client(),
|
|
196
|
+
approval: record.approval,
|
|
197
|
+
sessionPrivateKey: record.sessionPrivateKey
|
|
198
|
+
});
|
|
199
|
+
const kernel = createPepuSponsoredClient({
|
|
200
|
+
account,
|
|
201
|
+
publicClient: client(),
|
|
202
|
+
...o.endpoints?.bundlerUrl !== void 0 ? { bundlerUrl: o.endpoints.bundlerUrl } : {},
|
|
203
|
+
...o.endpoints?.paymasterUrl !== void 0 ? { paymasterUrl: o.endpoints.paymasterUrl } : {},
|
|
204
|
+
...o.endpoints?.paymasterToken !== void 0 ? { paymasterToken: o.endpoints.paymasterToken } : {},
|
|
205
|
+
...privyToken ? { paymasterContext: buildPaymasterContext({ privyAccessToken: privyToken }) } : {}
|
|
206
|
+
});
|
|
207
|
+
const result = await sendSponsored({ client: kernel, calls });
|
|
208
|
+
const actions = record.actions + (result.success ? 1 : 0);
|
|
209
|
+
if (result.success) await o.store.set({ ...record, actions });
|
|
210
|
+
const out = {
|
|
211
|
+
userOpHash: result.userOpHash,
|
|
212
|
+
transactionHash: result.transactionHash,
|
|
213
|
+
kernelAddress: record.kernelAddress,
|
|
214
|
+
success: result.success,
|
|
215
|
+
paymaster: result.paymaster,
|
|
216
|
+
actualGasCostWei: result.actualGasCostWei.toString(),
|
|
217
|
+
explorerUrl: result.explorerUrl,
|
|
218
|
+
actions
|
|
219
|
+
};
|
|
220
|
+
return json(out);
|
|
221
|
+
} finally {
|
|
222
|
+
await o.store.unlock(user.userId);
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
},
|
|
226
|
+
revoke: {
|
|
227
|
+
POST: (request) => guard("combo revoke", async () => {
|
|
228
|
+
const user = await authenticate(request);
|
|
229
|
+
if (user instanceof Response) return user;
|
|
230
|
+
await o.store.delete(user.userId);
|
|
231
|
+
return json({ active: false });
|
|
232
|
+
})
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function assertCallsInScope(scope, calls) {
|
|
237
|
+
for (const c of normalizeCalls(calls)) {
|
|
238
|
+
if (!isCallInScope(scope, c)) {
|
|
239
|
+
throw new PepuPolicyError("POLICY_UNSCOPED", "A call is outside the session scope.", {
|
|
240
|
+
status: 403,
|
|
241
|
+
hint: "Only the contracts and functions the user approved can be called."
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export { assertCallsInScope, createSponsoredSessionRoutes };
|
|
248
|
+
//# sourceMappingURL=combo.js.map
|
|
249
|
+
//# sourceMappingURL=combo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/combo/server.ts"],"names":[],"mappings":"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","file":"combo.js","sourcesContent":["import type { PrivyClient } from \"@privy-io/node\";\nimport { createPublicClient, http } from \"viem\";\nimport type { Address, PublicClient } from \"viem\";\nimport type { SponsoredActResult } from \"./types.js\";\nimport { createPepuSponsoredClient, sendSponsored } from \"../aa/kernel.js\";\nimport { normalizeCalls } from \"../aa/calls.js\";\nimport type { Call } from \"../aa/types.js\";\nimport { pepuMainnet } from \"../chains.js\";\nimport { resolvePepuEndpoints } from \"../endpoints.js\";\nimport { buildPaymasterContext } from \"../erc7677.js\";\nimport {\n PepuAuthError,\n PepuChainError,\n PepuConfigError,\n PepuError,\n PepuPolicyError,\n PepuSessionError,\n toErrorResponse,\n toPepuError,\n} from \"../errors.js\";\nimport { assertServerOnly } from \"../internal/assert-server.js\";\nimport { createPrivyServer, requireUser } from \"../privy/server.js\";\nimport { resolveSessionMinutes, sessionExpiry } from \"../session/policy.js\";\nimport {\n buildKernelSessionPolicies,\n checkApproval,\n describeKernelSessionScope,\n expectedPermissionId,\n generateSessionKey,\n getKernelAddress,\n isCallInScope,\n loadKernelSessionAccount,\n} from \"../session/kernel.js\";\nimport type { KernelSessionCall, KernelSessionScope } from \"../session/kernel.js\";\nimport { isLive } from \"../session/store.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\n\nassertServerOnly(\"@pepu-chain/sdk/combo\");\n\n/**\n * `@pepu-chain/sdk/combo` (server): the combined flow. Google sign-in (Privy),\n * a ONE-TIME on-chain session, and sponsored gas. Route factories for the\n * Kernel session lifecycle: prepare, activate, status, act, revoke.\n *\n * Extracted from templates/sponsored-session-app/app/api/session/* and\n * lib/{kernel,session-auth}.ts.\n *\n * Trust model: the chain, not these routes, enforces scope. The owner's single\n * EIP-712 signature enables a permission whose call policy (targets,\n * selectors, zero value) and timestamp policy the Kernel account verifies on\n * every UserOperation. The checks here only fail fast.\n *\n * Optional peers: `@privy-io/node`, `@zerodev/*`.\n */\n\nexport { createMemoryStore, isLive } from \"../session/store.js\";\nexport type { SessionRecord, SessionStore } from \"../session/store.js\";\nexport type { KernelSessionCall, KernelSessionScope } from \"../session/kernel.js\";\nexport type { SponsoredActResult } from \"./types.js\";\n/** Session length from `SESSION_DURATION_MINUTES` (default 15, clamped to 1..1440), the same rule the routes use. */\nexport { resolveSessionMinutes } from \"../session/policy.js\";\n\n/** The authenticated caller of a combo route. */\nexport interface ComboUser {\n userId: string;\n /** The user's Privy embedded wallet: the owner of their Kernel account. From Privy, never the request. */\n ownerAddress: Address;\n}\n\n/** Authenticate a request. Throw a `PepuError` (or return `null`) when it is not valid. */\nexport type ComboAuthenticate = (request: Request) => Promise<ComboUser | null>;\n\n/** Options for {@link createSponsoredSessionRoutes}. */\nexport interface SponsoredSessionRoutesOptions<I> {\n /** What the session may call. Enforced on-chain by the call policy. */\n scope: {\n calls: readonly KernelSessionCall[];\n /** Env variable named in the `CONFIG_MISSING_ENV` message when a call target is empty (unset). */\n targetEnv?: string;\n };\n /**\n * Where session records (including the session private key) live. Use\n * `createMemoryStore()` for development only: production needs a persistent\n * store with the key encrypted at rest.\n */\n store: SessionStore;\n /**\n * Bundler and paymaster. The bundler defaults to env `PEPU_BUNDLER_URL`, then the hosted bundler. The paymaster\n * needs a complete ERC-7677 URL (env `PEPU_PAYMASTER_URL`, or `paymasterUrl`) or a project `paymasterToken`\n * (built against the hosted paymaster base).\n */\n endpoints?: { bundlerUrl?: string; paymasterUrl?: string; paymasterToken?: string };\n /**\n * Forward the caller's Privy access token (the request's `Authorization: Bearer`) to the paymaster as ERC-7677\n * `context.privyAccessToken`. The v2 FREE TIER requires it; a project paying from its own deposit does not.\n * Default `true`. Set `false` if your paymaster URL is not a PEPU policy service you trust with the token.\n */\n forwardPrivyToken?: boolean;\n /** Session length. Default env `SESSION_DURATION_MINUTES`, then 15; clamped to 1..1440. */\n minutes?: number;\n /** The one action users take with their session. */\n act: {\n /** Validate the client body. Throw to reject with 400. */\n parse(body: unknown): I;\n /** The calls to send. Each is re-checked against `scope` before sponsoring. */\n buildCalls(input: I, ctx: { kernelAddress: Address; ownerAddress: Address }): Call[];\n };\n /** Privy client for the default authentication. Default `createPrivyServer()`. */\n privy?: PrivyClient;\n /**\n * Custom authentication. Default: B1's `requireUser` (verifies the Privy\n * bearer token and reads the user's embedded wallet from Privy).\n */\n authenticate?: ComboAuthenticate;\n /** Chain reads. Default: viem on the PEPU RPC (`PEPU_RPC_URL` aware). */\n publicClient?: PublicClient;\n}\n\n/** The five route handlers returned by {@link createSponsoredSessionRoutes}. */\nexport interface SponsoredSessionRoutes {\n prepare: { POST(request: Request): Promise<Response> };\n activate: { POST(request: Request): Promise<Response> };\n status: { GET(request: Request): Promise<Response> };\n act: { POST(request: Request): Promise<Response> };\n revoke: { POST(request: Request): Promise<Response> };\n}\n\nfunction json(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), { status, headers: { \"content-type\": \"application/json\" } });\n}\n\n/** Anything unclassified that reaches a route is an upstream failure, not our 500. */\nfunction upstream(e: unknown, op: string): PepuError {\n const err = toPepuError(e, { op });\n if (err.code === \"UNKNOWN\" && !(e instanceof PepuError)) {\n return new PepuChainError(\"UNKNOWN\", err.message, { status: 502, cause: e });\n }\n return err;\n}\n\nasync function guard(op: string, fn: () => Promise<Response>): Promise<Response> {\n try {\n return await fn();\n } catch (e) {\n return toErrorResponse(upstream(e, op));\n }\n}\n\n/** The bearer token on a request, or `\"\"`. */\nfunction bearerToken(request: Request): string {\n return (request.headers.get(\"authorization\") ?? \"\").replace(/^Bearer\\s+/i, \"\").trim();\n}\n\nconst nowSeconds = (): number => Math.floor(Date.now() / 1000);\n\nfunction defaultPublicClient(): PublicClient {\n return createPublicClient({ chain: pepuMainnet, transport: http(resolvePepuEndpoints().rpcUrl) }) as PublicClient;\n}\n\n/**\n * Route handlers for the Kernel session lifecycle.\n *\n * - `prepare.POST`: the server creates a fresh session key and decides the\n * expiry. The private key stays on the server; the response carries only the\n * key's address, the expiry and the scope, so the browser can ask the owner\n * for the ONE signature that grants exactly that. Calling it again replaces\n * any pending or active session (the old key is dropped).\n * - `activate.POST` `{ approval }`: checks the approval is for this user's\n * smart account and for exactly the key, scope and expiry issued in\n * `prepare`, then stores it. 409 `SESSION_NONE` when nothing is pending,\n * 410 `SESSION_EXPIRED` for an expired offer, 400 `SESSION_APPROVAL_MISMATCH`.\n * - `status.GET`: `{ active: false }` or `{ active: true, validUntil, ... }`.\n * Never returns the session key or approval.\n * - `act.POST`: signs ONE sponsored UserOperation with the session key. 409\n * `SESSION_NONE` without a live session, 429 while another action runs.\n * - `revoke.POST`: deletes the session key and approval from the server, so\n * the app can no longer act, immediately. It does NOT uninstall the\n * permission on-chain: that grant stays valid until its expiry, but only the\n * deleted key can use it and only within the scope. An on-chain uninstall is\n * an owner-signed call to the user's own account, which a paymaster\n * destination allowlist rightly does not sponsor.\n *\n * Gas: the paymaster policy service reserves worst-case cost per operation:\n * about 20.5 PEPU for a session's first operation and about 6.9 PEPU for later\n * ones (`SESSION_GAS_RESERVATION_PEPU`). Size spend caps above that. Fees come\n * from the chain with 20% headroom.\n *\n * @example\n * // lib/session-routes.ts\n * export const routes = createSponsoredSessionRoutes({\n * scope: { calls: [{ target: tapScore, abi: tapScoreAbi, functionName: \"tap\" }] },\n * store: createMemoryStore(), // DEV ONLY\n * act: {\n * parse: () => ({}),\n * buildCalls: () => [{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }],\n * },\n * });\n * // app/api/session/prepare/route.ts: export const { POST } = routes.prepare;\n */\nexport function createSponsoredSessionRoutes<I>(o: SponsoredSessionRoutesOptions<I>): SponsoredSessionRoutes {\n // A call whose target is empty or undefined (an unset env variable) is \"not configured yet\":\n // every route then answers CONFIG_MISSING_ENV at request time. A malformed non-empty scope\n // still fails at startup, not on the first request.\n const unconfigured = o.scope.calls.some((c) => !c.target || String(c.target).trim() === \"\");\n if (unconfigured) {\n const unset = async (): Promise<Response> =>\n toErrorResponse(\n new PepuConfigError(\n \"CONFIG_MISSING_ENV\",\n `${o.scope.targetEnv ?? \"A session target contract address\"} is not set to a valid address. See .env.example.`,\n { hint: \"Set it and restart the server.\" },\n ),\n );\n return {\n prepare: { POST: unset },\n activate: { POST: unset },\n status: { GET: unset },\n act: { POST: unset },\n revoke: { POST: unset },\n };\n }\n buildKernelSessionPolicies({ calls: o.scope.calls, validUntil: 1 });\n let publicClient = o.publicClient;\n const client = (): PublicClient => (publicClient ??= defaultPublicClient());\n\n const authenticate = async (request: Request): Promise<ComboUser | Response> => {\n if (o.authenticate) {\n const user = await o.authenticate(request);\n if (!user) throw new PepuAuthError(\"AUTH_INVALID_TOKEN\", \"Missing or invalid Privy access token.\");\n return user;\n }\n const auth = await requireUser(request, { privy: o.privy ?? createPrivyServer() });\n if (!auth.ok) return auth.response;\n if (!auth.user.address) {\n throw new PepuAuthError(\"WALLET_NOT_PROVISIONED\", \"No embedded wallet yet. Create it first (ensure-wallet route).\", {\n status: 409,\n });\n }\n return { userId: auth.user.userId, ownerAddress: auth.user.address };\n };\n\n const minutes = (): number => o.minutes ?? resolveSessionMinutes(process.env.SESSION_DURATION_MINUTES);\n const policiesFor = (validUntil: number) => buildKernelSessionPolicies({ calls: o.scope.calls, validUntil });\n\n return {\n prepare: {\n POST: (request) =>\n guard(\"combo prepare\", async () => {\n const user = await authenticate(request);\n if (user instanceof Response) return user;\n const { userId, ownerAddress } = user;\n const mins = minutes();\n const validUntil = sessionExpiry(nowSeconds(), mins);\n const key = generateSessionKey();\n const policies = policiesFor(validUntil);\n const [kernelAddress, permissionId] = await Promise.all([\n getKernelAddress(client(), ownerAddress),\n expectedPermissionId({ publicClient: client(), sessionKeyAddress: key.address, policies }),\n ]);\n const record: SessionRecord = {\n userId,\n ownerAddress,\n kernelAddress,\n sessionPrivateKey: key.privateKey,\n sessionKeyAddress: key.address,\n permissionId,\n validUntil,\n approval: null,\n actions: 0,\n };\n await o.store.set(record);\n return json({\n ownerAddress,\n kernelAddress,\n sessionKeyAddress: key.address,\n validUntil,\n minutes: mins,\n scope: describeKernelSessionScope({ calls: o.scope.calls, validUntil }),\n });\n }),\n },\n\n activate: {\n POST: (request) =>\n guard(\"combo activate\", async () => {\n const user = await authenticate(request);\n if (user instanceof Response) return user;\n const body = (await request.json().catch(() => null)) as { approval?: unknown } | null;\n if (typeof body?.approval !== \"string\") {\n throw new PepuPolicyError(\"UNKNOWN\", \"Missing approval.\", { status: 400, hint: \"Send { approval }.\" });\n }\n const record = await o.store.get(user.userId);\n if (!record || record.approval !== null) {\n throw new PepuSessionError(\"SESSION_NONE\", \"No pending session. Start again.\");\n }\n if (nowSeconds() >= record.validUntil) {\n await o.store.delete(record.userId);\n throw new PepuSessionError(\"SESSION_EXPIRED\", \"The session offer expired. Start again.\");\n }\n const check = checkApproval(body.approval, {\n kernelAddress: record.kernelAddress,\n permissionId: record.permissionId,\n });\n if (!check.ok) throw new PepuSessionError(\"SESSION_APPROVAL_MISMATCH\", check.reason, { status: 400 });\n await o.store.set({ ...record, approval: body.approval });\n return json({ active: true, validUntil: record.validUntil });\n }),\n },\n\n status: {\n GET: (request) =>\n guard(\"combo status\", async () => {\n const user = await authenticate(request);\n if (user instanceof Response) return user;\n const record = await o.store.get(user.userId);\n if (!record || !isLive(record, nowSeconds())) return json({ active: false });\n return json({\n active: true,\n validUntil: record.validUntil,\n kernelAddress: record.kernelAddress,\n ownerAddress: record.ownerAddress,\n sessionKeyAddress: record.sessionKeyAddress,\n actions: record.actions,\n });\n }),\n },\n\n act: {\n POST: (request) =>\n guard(\"combo act\", async () => {\n const user = await authenticate(request);\n if (user instanceof Response) return user;\n const record = await o.store.get(user.userId);\n if (!record || !record.approval || !isLive(record, nowSeconds())) {\n throw new PepuSessionError(\"SESSION_NONE\", \"No active session. Start one first.\");\n }\n\n let input: I;\n try {\n input = o.act.parse(await request.json().catch(() => ({})));\n } catch (e) {\n throw new PepuPolicyError(\"UNKNOWN\", e instanceof Error ? e.message : \"Invalid request body.\", {\n status: 400,\n hint: \"Fix the request body.\",\n cause: e,\n });\n }\n const calls = o.act.buildCalls(input, {\n kernelAddress: record.kernelAddress,\n ownerAddress: record.ownerAddress,\n });\n // Fail fast; the chain is the real enforcement (see the file comment).\n assertCallsInScope(describeKernelSessionScope({ calls: o.scope.calls, validUntil: record.validUntil }), calls);\n\n if (!(await o.store.tryLock(user.userId))) {\n throw new PepuChainError(\"UNKNOWN\", \"An action is already in flight.\", {\n status: 429,\n retryable: true,\n hint: \"Wait for the current action to finish.\",\n });\n }\n const privyToken = o.forwardPrivyToken === false ? \"\" : bearerToken(request);\n try {\n const account = await loadKernelSessionAccount({\n publicClient: client(),\n approval: record.approval,\n sessionPrivateKey: record.sessionPrivateKey,\n });\n const kernel = createPepuSponsoredClient({\n account,\n publicClient: client(),\n ...(o.endpoints?.bundlerUrl !== undefined ? { bundlerUrl: o.endpoints.bundlerUrl } : {}),\n ...(o.endpoints?.paymasterUrl !== undefined ? { paymasterUrl: o.endpoints.paymasterUrl } : {}),\n ...(o.endpoints?.paymasterToken !== undefined ? { paymasterToken: o.endpoints.paymasterToken } : {}),\n ...(privyToken ? { paymasterContext: buildPaymasterContext({ privyAccessToken: privyToken }) } : {}),\n });\n const result = await sendSponsored({ client: kernel, calls });\n const actions = record.actions + (result.success ? 1 : 0);\n if (result.success) await o.store.set({ ...record, actions });\n const out: SponsoredActResult = {\n userOpHash: result.userOpHash,\n transactionHash: result.transactionHash,\n kernelAddress: record.kernelAddress,\n success: result.success,\n paymaster: result.paymaster,\n actualGasCostWei: result.actualGasCostWei.toString(),\n explorerUrl: result.explorerUrl,\n actions,\n };\n return json(out);\n } finally {\n await o.store.unlock(user.userId);\n }\n }),\n },\n\n revoke: {\n POST: (request) =>\n guard(\"combo revoke\", async () => {\n const user = await authenticate(request);\n if (user instanceof Response) return user;\n await o.store.delete(user.userId);\n return json({ active: false });\n }),\n },\n };\n}\n\n/**\n * Throws `POLICY_UNSCOPED` (403) unless every call targets an allowed contract\n * and function selector with a value within the limit. Pure; used by the act\n * route and exported for custom routes.\n *\n * @example\n * assertCallsInScope(describeKernelSessionScope({ calls, validUntil }), [{ to, abi, functionName: \"tap\" }]);\n */\nexport function assertCallsInScope(scope: Pick<KernelSessionScope, \"calls\">, calls: readonly Call[]): void {\n for (const c of normalizeCalls(calls)) {\n if (!isCallInScope(scope, c)) {\n throw new PepuPolicyError(\"POLICY_UNSCOPED\", \"A call is outside the session scope.\", {\n status: 403,\n hint: \"Only the contracts and functions the user approved can be called.\",\n });\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { P as PepuChain } from './chains-DK13zGIp.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Typed Privy client config for PEPU (`@pepu-chain/sdk/privy`). Client-safe:
|
|
5
|
+
* no secrets, no Node APIs, and no dependency on any Privy package (the result
|
|
6
|
+
* is structurally assignable to `PrivyClientConfig` from
|
|
7
|
+
* `@privy-io/react-auth`).
|
|
8
|
+
*
|
|
9
|
+
* What it encodes, each a real, reproduced PEPU requirement:
|
|
10
|
+
*
|
|
11
|
+
* - `defaultChain` / `supportedChains` are PEPU mainnet only.
|
|
12
|
+
* - `embeddedWallets.ethereum.createOnLogin` defaults to `"off"`: the
|
|
13
|
+
* recommended pattern is to provision the wallet server-side (see the
|
|
14
|
+
* wallet-provisioning recipe). NOTE the Privy Dashboard's setting wins over
|
|
15
|
+
* this value at runtime; it is kept for intent and documentation.
|
|
16
|
+
* - Coinbase Wallet is pinned to `eoaOnly`: Coinbase Smart Wallet does not
|
|
17
|
+
* support chain 97741, and the default floods the console with "The
|
|
18
|
+
* configured chains are not supported by Coinbase Smart Wallet".
|
|
19
|
+
*/
|
|
20
|
+
type PrivyLoginMethod = "email" | "google" | "wallet" | "sms" | "apple" | "twitter" | "discord" | "github";
|
|
21
|
+
type EmbeddedWalletCreateOnLogin = "off" | "users-without-wallets" | "all-users";
|
|
22
|
+
interface PepuPrivyClientConfig {
|
|
23
|
+
loginMethods?: PrivyLoginMethod[];
|
|
24
|
+
appearance?: {
|
|
25
|
+
theme?: "light" | "dark" | `#${string}`;
|
|
26
|
+
accentColor?: `#${string}`;
|
|
27
|
+
logo?: string;
|
|
28
|
+
};
|
|
29
|
+
defaultChain: PepuChain;
|
|
30
|
+
supportedChains: PepuChain[];
|
|
31
|
+
embeddedWallets: {
|
|
32
|
+
ethereum: {
|
|
33
|
+
createOnLogin: EmbeddedWalletCreateOnLogin;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
externalWallets: {
|
|
37
|
+
coinbaseWallet: {
|
|
38
|
+
config: {
|
|
39
|
+
preference: {
|
|
40
|
+
options: "eoaOnly";
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface CreatePepuPrivyConfigOptions {
|
|
47
|
+
loginMethods?: PrivyLoginMethod[];
|
|
48
|
+
appearance?: PepuPrivyClientConfig["appearance"];
|
|
49
|
+
/** Default `"off"`. The Privy Dashboard setting overrides this at runtime. */
|
|
50
|
+
createOnLogin?: EmbeddedWalletCreateOnLogin;
|
|
51
|
+
/** Default {@link pepuMainnet}. Only pass a different PEPU chain deliberately. */
|
|
52
|
+
chain?: PepuChain;
|
|
53
|
+
}
|
|
54
|
+
/** Build the `config` prop for Privy's `<PrivyProvider>` on PEPU. */
|
|
55
|
+
declare function createPepuPrivyConfig(options?: CreatePepuPrivyConfigOptions): PepuPrivyClientConfig;
|
|
56
|
+
|
|
57
|
+
export { type CreatePepuPrivyConfigOptions as C, type EmbeddedWalletCreateOnLogin as E, type PepuPrivyClientConfig as P, type PrivyLoginMethod as a, createPepuPrivyConfig as c };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { P as PepuChain } from './chains-DK13zGIp.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Typed Privy client config for PEPU (`@pepu-chain/sdk/privy`). Client-safe:
|
|
5
|
+
* no secrets, no Node APIs, and no dependency on any Privy package (the result
|
|
6
|
+
* is structurally assignable to `PrivyClientConfig` from
|
|
7
|
+
* `@privy-io/react-auth`).
|
|
8
|
+
*
|
|
9
|
+
* What it encodes, each a real, reproduced PEPU requirement:
|
|
10
|
+
*
|
|
11
|
+
* - `defaultChain` / `supportedChains` are PEPU mainnet only.
|
|
12
|
+
* - `embeddedWallets.ethereum.createOnLogin` defaults to `"off"`: the
|
|
13
|
+
* recommended pattern is to provision the wallet server-side (see the
|
|
14
|
+
* wallet-provisioning recipe). NOTE the Privy Dashboard's setting wins over
|
|
15
|
+
* this value at runtime; it is kept for intent and documentation.
|
|
16
|
+
* - Coinbase Wallet is pinned to `eoaOnly`: Coinbase Smart Wallet does not
|
|
17
|
+
* support chain 97741, and the default floods the console with "The
|
|
18
|
+
* configured chains are not supported by Coinbase Smart Wallet".
|
|
19
|
+
*/
|
|
20
|
+
type PrivyLoginMethod = "email" | "google" | "wallet" | "sms" | "apple" | "twitter" | "discord" | "github";
|
|
21
|
+
type EmbeddedWalletCreateOnLogin = "off" | "users-without-wallets" | "all-users";
|
|
22
|
+
interface PepuPrivyClientConfig {
|
|
23
|
+
loginMethods?: PrivyLoginMethod[];
|
|
24
|
+
appearance?: {
|
|
25
|
+
theme?: "light" | "dark" | `#${string}`;
|
|
26
|
+
accentColor?: `#${string}`;
|
|
27
|
+
logo?: string;
|
|
28
|
+
};
|
|
29
|
+
defaultChain: PepuChain;
|
|
30
|
+
supportedChains: PepuChain[];
|
|
31
|
+
embeddedWallets: {
|
|
32
|
+
ethereum: {
|
|
33
|
+
createOnLogin: EmbeddedWalletCreateOnLogin;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
externalWallets: {
|
|
37
|
+
coinbaseWallet: {
|
|
38
|
+
config: {
|
|
39
|
+
preference: {
|
|
40
|
+
options: "eoaOnly";
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface CreatePepuPrivyConfigOptions {
|
|
47
|
+
loginMethods?: PrivyLoginMethod[];
|
|
48
|
+
appearance?: PepuPrivyClientConfig["appearance"];
|
|
49
|
+
/** Default `"off"`. The Privy Dashboard setting overrides this at runtime. */
|
|
50
|
+
createOnLogin?: EmbeddedWalletCreateOnLogin;
|
|
51
|
+
/** Default {@link pepuMainnet}. Only pass a different PEPU chain deliberately. */
|
|
52
|
+
chain?: PepuChain;
|
|
53
|
+
}
|
|
54
|
+
/** Build the `config` prop for Privy's `<PrivyProvider>` on PEPU. */
|
|
55
|
+
declare function createPepuPrivyConfig(options?: CreatePepuPrivyConfigOptions): PepuPrivyClientConfig;
|
|
56
|
+
|
|
57
|
+
export { type CreatePepuPrivyConfigOptions as C, type EmbeddedWalletCreateOnLogin as E, type PepuPrivyClientConfig as P, type PrivyLoginMethod as a, createPepuPrivyConfig as c };
|