@pepu-chain/sdk 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +565 -2
  3. package/dist/aa/kernel.cjs +40 -0
  4. package/dist/aa/kernel.cjs.map +1 -0
  5. package/dist/aa/kernel.d.cts +88 -0
  6. package/dist/aa/kernel.d.ts +88 -0
  7. package/dist/aa/kernel.js +11 -0
  8. package/dist/aa/kernel.js.map +1 -0
  9. package/dist/aa/react-direct.cjs +110 -0
  10. package/dist/aa/react-direct.cjs.map +1 -0
  11. package/dist/aa/react-direct.d.cts +42 -0
  12. package/dist/aa/react-direct.d.ts +42 -0
  13. package/dist/aa/react-direct.js +107 -0
  14. package/dist/aa/react-direct.js.map +1 -0
  15. package/dist/aa/react.cjs +151 -0
  16. package/dist/aa/react.cjs.map +1 -0
  17. package/dist/aa/react.d.cts +62 -0
  18. package/dist/aa/react.d.ts +62 -0
  19. package/dist/aa/react.js +147 -0
  20. package/dist/aa/react.js.map +1 -0
  21. package/dist/aa.cjs +84 -0
  22. package/dist/aa.cjs.map +1 -0
  23. package/dist/aa.d.cts +85 -0
  24. package/dist/aa.d.ts +85 -0
  25. package/dist/aa.js +11 -0
  26. package/dist/aa.js.map +1 -0
  27. package/dist/api-Dz4sCHH_.d.cts +654 -0
  28. package/dist/api-Dz4sCHH_.d.ts +654 -0
  29. package/dist/calls-BRPjKgjl.d.cts +70 -0
  30. package/dist/calls-z_EQOtFb.d.ts +70 -0
  31. package/dist/chains-DK13zGIp.d.cts +235 -0
  32. package/dist/chains-DK13zGIp.d.ts +235 -0
  33. package/dist/chunk-3XUGQODR.js +194 -0
  34. package/dist/chunk-3XUGQODR.js.map +1 -0
  35. package/dist/chunk-45KSZH26.cjs +145 -0
  36. package/dist/chunk-45KSZH26.cjs.map +1 -0
  37. package/dist/chunk-4GINFJO6.cjs +44 -0
  38. package/dist/chunk-4GINFJO6.cjs.map +1 -0
  39. package/dist/chunk-62M2LKQW.js +136 -0
  40. package/dist/chunk-62M2LKQW.js.map +1 -0
  41. package/dist/chunk-6DSZ4Z2N.js +498 -0
  42. package/dist/chunk-6DSZ4Z2N.js.map +1 -0
  43. package/dist/chunk-7MNJF2OB.cjs +72 -0
  44. package/dist/chunk-7MNJF2OB.cjs.map +1 -0
  45. package/dist/chunk-A5LP2UCS.cjs +2729 -0
  46. package/dist/chunk-A5LP2UCS.cjs.map +1 -0
  47. package/dist/chunk-AJS4UFQX.cjs +121 -0
  48. package/dist/chunk-AJS4UFQX.cjs.map +1 -0
  49. package/dist/chunk-C2XW44FI.cjs +200 -0
  50. package/dist/chunk-C2XW44FI.cjs.map +1 -0
  51. package/dist/chunk-C7IC36XS.cjs +13 -0
  52. package/dist/chunk-C7IC36XS.cjs.map +1 -0
  53. package/dist/chunk-D52PADVY.js +84 -0
  54. package/dist/chunk-D52PADVY.js.map +1 -0
  55. package/dist/chunk-DH6BFNVJ.cjs +272 -0
  56. package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
  57. package/dist/chunk-DPCZJLB3.cjs +87 -0
  58. package/dist/chunk-DPCZJLB3.cjs.map +1 -0
  59. package/dist/chunk-EHBPIYY4.js +262 -0
  60. package/dist/chunk-EHBPIYY4.js.map +1 -0
  61. package/dist/chunk-ESMNAXUI.js +86 -0
  62. package/dist/chunk-ESMNAXUI.js.map +1 -0
  63. package/dist/chunk-ET3P6TX6.cjs +49 -0
  64. package/dist/chunk-ET3P6TX6.cjs.map +1 -0
  65. package/dist/chunk-FCXSP2YF.js +219 -0
  66. package/dist/chunk-FCXSP2YF.js.map +1 -0
  67. package/dist/chunk-IB2FSPMJ.js +66 -0
  68. package/dist/chunk-IB2FSPMJ.js.map +1 -0
  69. package/dist/chunk-IG7RSL2Y.cjs +178 -0
  70. package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
  71. package/dist/chunk-IY3ALPUJ.js +2716 -0
  72. package/dist/chunk-IY3ALPUJ.js.map +1 -0
  73. package/dist/chunk-J3O2ZGG3.cjs +93 -0
  74. package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
  75. package/dist/chunk-J6UXXHBE.js +37 -0
  76. package/dist/chunk-J6UXXHBE.js.map +1 -0
  77. package/dist/chunk-JLZ4LZ4Z.js +22 -0
  78. package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
  79. package/dist/chunk-KIIFL4VM.js +274 -0
  80. package/dist/chunk-KIIFL4VM.js.map +1 -0
  81. package/dist/chunk-KVG3AYYR.js +99 -0
  82. package/dist/chunk-KVG3AYYR.js.map +1 -0
  83. package/dist/chunk-MBA4CLA5.js +45 -0
  84. package/dist/chunk-MBA4CLA5.js.map +1 -0
  85. package/dist/chunk-NE3QKDOB.cjs +24 -0
  86. package/dist/chunk-NE3QKDOB.cjs.map +1 -0
  87. package/dist/chunk-NVOPDXTA.cjs +95 -0
  88. package/dist/chunk-NVOPDXTA.cjs.map +1 -0
  89. package/dist/chunk-OH3QMAIB.js +11 -0
  90. package/dist/chunk-OH3QMAIB.js.map +1 -0
  91. package/dist/chunk-PHM3ZORG.cjs +110 -0
  92. package/dist/chunk-PHM3ZORG.cjs.map +1 -0
  93. package/dist/chunk-R5PXQNO3.cjs +209 -0
  94. package/dist/chunk-R5PXQNO3.cjs.map +1 -0
  95. package/dist/chunk-SLW7FRTL.cjs +285 -0
  96. package/dist/chunk-SLW7FRTL.cjs.map +1 -0
  97. package/dist/chunk-SVWRRALU.cjs +17 -0
  98. package/dist/chunk-SVWRRALU.cjs.map +1 -0
  99. package/dist/chunk-T43PQXJD.js +202 -0
  100. package/dist/chunk-T43PQXJD.js.map +1 -0
  101. package/dist/chunk-TIEAZYHF.cjs +225 -0
  102. package/dist/chunk-TIEAZYHF.cjs.map +1 -0
  103. package/dist/chunk-VBH3JLQ5.js +116 -0
  104. package/dist/chunk-VBH3JLQ5.js.map +1 -0
  105. package/dist/chunk-VF3D6KLQ.cjs +94 -0
  106. package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
  107. package/dist/chunk-VTQIHMF3.js +82 -0
  108. package/dist/chunk-VTQIHMF3.js.map +1 -0
  109. package/dist/chunk-W3JN3YIW.js +15 -0
  110. package/dist/chunk-W3JN3YIW.js.map +1 -0
  111. package/dist/chunk-WANILJZQ.cjs +87 -0
  112. package/dist/chunk-WANILJZQ.cjs.map +1 -0
  113. package/dist/chunk-XC4IBCI2.js +86 -0
  114. package/dist/chunk-XC4IBCI2.js.map +1 -0
  115. package/dist/chunk-YKEWWQEJ.js +165 -0
  116. package/dist/chunk-YKEWWQEJ.js.map +1 -0
  117. package/dist/chunk-YQL7NISX.cjs +515 -0
  118. package/dist/chunk-YQL7NISX.cjs.map +1 -0
  119. package/dist/chunk-ZB6SVBK4.js +89 -0
  120. package/dist/chunk-ZB6SVBK4.js.map +1 -0
  121. package/dist/combo/react.cjs +235 -0
  122. package/dist/combo/react.cjs.map +1 -0
  123. package/dist/combo/react.d.cts +148 -0
  124. package/dist/combo/react.d.ts +148 -0
  125. package/dist/combo/react.js +230 -0
  126. package/dist/combo/react.js.map +1 -0
  127. package/dist/combo.cjs +262 -0
  128. package/dist/combo.cjs.map +1 -0
  129. package/dist/combo.d.cts +139 -0
  130. package/dist/combo.d.ts +139 -0
  131. package/dist/combo.js +249 -0
  132. package/dist/combo.js.map +1 -0
  133. package/dist/config-CHjz7ZjZ.d.cts +57 -0
  134. package/dist/config-COjhIZTh.d.ts +57 -0
  135. package/dist/doctor.cjs +354 -0
  136. package/dist/doctor.cjs.map +1 -0
  137. package/dist/doctor.d.cts +177 -0
  138. package/dist/doctor.d.ts +177 -0
  139. package/dist/doctor.js +345 -0
  140. package/dist/doctor.js.map +1 -0
  141. package/dist/erc7677-DOW58QBE.d.cts +111 -0
  142. package/dist/erc7677-DOW58QBE.d.ts +111 -0
  143. package/dist/errors-CgX1vNj7.d.cts +100 -0
  144. package/dist/errors-CgX1vNj7.d.ts +100 -0
  145. package/dist/index.cjs +802 -0
  146. package/dist/index.cjs.map +1 -0
  147. package/dist/index.d.cts +2398 -0
  148. package/dist/index.d.ts +2398 -0
  149. package/dist/index.js +559 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/paymaster/server.cjs +38 -0
  152. package/dist/paymaster/server.cjs.map +1 -0
  153. package/dist/paymaster/server.d.cts +57 -0
  154. package/dist/paymaster/server.d.ts +57 -0
  155. package/dist/paymaster/server.js +36 -0
  156. package/dist/paymaster/server.js.map +1 -0
  157. package/dist/paymaster.cjs +356 -0
  158. package/dist/paymaster.cjs.map +1 -0
  159. package/dist/paymaster.d.cts +1851 -0
  160. package/dist/paymaster.d.ts +1851 -0
  161. package/dist/paymaster.js +289 -0
  162. package/dist/paymaster.js.map +1 -0
  163. package/dist/privy/react.cjs +48 -0
  164. package/dist/privy/react.cjs.map +1 -0
  165. package/dist/privy/react.d.cts +194 -0
  166. package/dist/privy/react.d.ts +194 -0
  167. package/dist/privy/react.js +7 -0
  168. package/dist/privy/react.js.map +1 -0
  169. package/dist/privy/server.cjs +43 -0
  170. package/dist/privy/server.cjs.map +1 -0
  171. package/dist/privy/server.d.cts +192 -0
  172. package/dist/privy/server.d.ts +192 -0
  173. package/dist/privy/server.js +6 -0
  174. package/dist/privy/server.js.map +1 -0
  175. package/dist/privy/wagmi.d.ts +90 -0
  176. package/dist/privy/wagmi.js +55 -0
  177. package/dist/privy/wagmi.js.map +1 -0
  178. package/dist/privy.cjs +34 -0
  179. package/dist/privy.cjs.map +1 -0
  180. package/dist/privy.d.cts +4 -0
  181. package/dist/privy.d.ts +4 -0
  182. package/dist/privy.js +5 -0
  183. package/dist/privy.js.map +1 -0
  184. package/dist/react.cjs +72 -0
  185. package/dist/react.cjs.map +1 -0
  186. package/dist/react.d.cts +66 -0
  187. package/dist/react.d.ts +66 -0
  188. package/dist/react.js +68 -0
  189. package/dist/react.js.map +1 -0
  190. package/dist/requirements-C-QiJkL9.d.cts +134 -0
  191. package/dist/requirements-C-QiJkL9.d.ts +134 -0
  192. package/dist/scope-DBRkN7bR.d.cts +94 -0
  193. package/dist/scope-DBRkN7bR.d.ts +94 -0
  194. package/dist/server.cjs +59 -0
  195. package/dist/server.cjs.map +1 -0
  196. package/dist/server.d.cts +208 -0
  197. package/dist/server.d.ts +208 -0
  198. package/dist/server.js +8 -0
  199. package/dist/server.js.map +1 -0
  200. package/dist/session/kernel.cjs +82 -0
  201. package/dist/session/kernel.cjs.map +1 -0
  202. package/dist/session/kernel.d.cts +131 -0
  203. package/dist/session/kernel.d.ts +131 -0
  204. package/dist/session/kernel.js +13 -0
  205. package/dist/session/kernel.js.map +1 -0
  206. package/dist/session/react.cjs +37 -0
  207. package/dist/session/react.cjs.map +1 -0
  208. package/dist/session/react.d.cts +119 -0
  209. package/dist/session/react.d.ts +119 -0
  210. package/dist/session/react.js +8 -0
  211. package/dist/session/react.js.map +1 -0
  212. package/dist/session/server.cjs +267 -0
  213. package/dist/session/server.cjs.map +1 -0
  214. package/dist/session/server.d.cts +151 -0
  215. package/dist/session/server.d.ts +151 -0
  216. package/dist/session/server.js +252 -0
  217. package/dist/session/server.js.map +1 -0
  218. package/dist/session.cjs +74 -0
  219. package/dist/session.cjs.map +1 -0
  220. package/dist/session.d.cts +3 -0
  221. package/dist/session.d.ts +3 -0
  222. package/dist/session.js +5 -0
  223. package/dist/session.js.map +1 -0
  224. package/dist/status-CmOsyPmO.d.cts +295 -0
  225. package/dist/status-DwkkOrGQ.d.ts +295 -0
  226. package/dist/store-CjmLgp9g.d.cts +64 -0
  227. package/dist/store-CjmLgp9g.d.ts +64 -0
  228. package/dist/types-BEEM7WdG.d.cts +25 -0
  229. package/dist/types-BEEM7WdG.d.ts +25 -0
  230. package/dist/types-BilBTDqK.d.cts +27 -0
  231. package/dist/types-BilBTDqK.d.ts +27 -0
  232. package/package.json +209 -3
@@ -0,0 +1,274 @@
1
+ import { redactSecrets } from './chunk-D52PADVY.js';
2
+ import { getContract } from './chunk-FCXSP2YF.js';
3
+ import { resolvePepuEndpoints, PEPU_ENV } from './chunk-XC4IBCI2.js';
4
+ import { pepuMainnet } from './chunk-VTQIHMF3.js';
5
+ import { PepuBundlerError, PepuConfigError } from './chunk-6DSZ4Z2N.js';
6
+ import { parseAbi } from 'viem';
7
+
8
+ var kernelFactoryAbi = parseAbi([
9
+ "function implementation() view returns (address)",
10
+ "function getAddress(bytes calldata data, bytes32 salt) view returns (address)",
11
+ "function createAccount(bytes calldata data, bytes32 salt) payable returns (address)"
12
+ ]);
13
+ var KERNEL_V3_1_IMPLEMENTATION_ADDRESS = "0xbAC849bB641841b44E965fb01A4Bf5F074F84B4d";
14
+ var entryPointV07Abi = parseAbi([
15
+ "function getNonce(address sender, uint192 key) view returns (uint256 nonce)",
16
+ "function balanceOf(address account) view returns (uint256)",
17
+ "function depositTo(address account) payable",
18
+ "function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount)",
19
+ "function getDepositInfo(address account) view returns ((uint256 deposit, bool staked, uint96 stake, uint32 unstakeDelaySec, uint48 withdrawTime) info)",
20
+ "event Deposited(address indexed account, uint256 totalDeposit)",
21
+ "event Withdrawn(address indexed account, address withdrawAddress, uint256 amount)"
22
+ ]);
23
+
24
+ // src/aa/probes.ts
25
+ var BUNDLER_METHODS = [
26
+ "eth_sendUserOperation",
27
+ "eth_estimateUserOperationGas",
28
+ "eth_getUserOperationReceipt",
29
+ "eth_getUserOperationByHash",
30
+ "pimlico_getUserOperationGasPrice",
31
+ "zd_getUserOperationGasPrice"
32
+ ];
33
+ var METHOD_NOT_FOUND = -32601;
34
+ function hostOf(url) {
35
+ try {
36
+ return new URL(url).host;
37
+ } catch {
38
+ return "the configured host";
39
+ }
40
+ }
41
+ function checkUrl(url, label) {
42
+ let u;
43
+ try {
44
+ u = new URL(url);
45
+ } catch {
46
+ throw new PepuConfigError("CONFIG_BAD_URL", `${label} is not a valid URL.`);
47
+ }
48
+ if (u.protocol !== "http:" && u.protocol !== "https:") {
49
+ throw new PepuConfigError("CONFIG_BAD_URL", `${label} must be an http(s) URL.`);
50
+ }
51
+ }
52
+ async function timedFetch(f, url, init, timeoutMs) {
53
+ const ctl = new AbortController();
54
+ const t = setTimeout(() => ctl.abort(), timeoutMs);
55
+ try {
56
+ return await f(url, { ...init, signal: ctl.signal });
57
+ } finally {
58
+ clearTimeout(t);
59
+ }
60
+ }
61
+ async function rpc(f, url, method, params, timeoutMs) {
62
+ const res = await timedFetch(
63
+ f,
64
+ url,
65
+ {
66
+ method: "POST",
67
+ headers: { "content-type": "application/json" },
68
+ body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params })
69
+ },
70
+ timeoutMs
71
+ );
72
+ let body;
73
+ try {
74
+ body = await res.json();
75
+ } catch {
76
+ throw new Error(`HTTP ${res.status} with a non-JSON body`);
77
+ }
78
+ if (!body || typeof body !== "object") throw new Error(`HTTP ${res.status} with an unexpected body`);
79
+ return body;
80
+ }
81
+ function unreachable(url, e) {
82
+ const reason = e instanceof Error && e.name === "AbortError" ? "timed out" : redactSecrets(e instanceof Error ? e.message : String(e)).replace(/https?:\/\/\S+/g, "[url]");
83
+ return new PepuBundlerError("BUNDLER_UNREACHABLE", `Could not reach ${hostOf(url)}: ${reason}`, { cause: e });
84
+ }
85
+ async function probeBundler(url, o = {}) {
86
+ checkUrl(url, "Bundler URL");
87
+ const f = o.fetch ?? ((i, init) => fetch(i, init));
88
+ const timeoutMs = o.timeoutMs ?? 8e3;
89
+ const started = Date.now();
90
+ try {
91
+ const chain = await rpc(f, url, "eth_chainId", [], timeoutMs);
92
+ const eps = await rpc(f, url, "eth_supportedEntryPoints", [], timeoutMs);
93
+ const chainId = typeof chain.result === "string" ? Number(BigInt(chain.result)) : void 0;
94
+ const entryPoints = Array.isArray(eps.result) ? eps.result : void 0;
95
+ const supportedMethods = {};
96
+ for (const m of BUNDLER_METHODS) {
97
+ try {
98
+ const r = await rpc(f, url, m, [], timeoutMs);
99
+ supportedMethods[m] = r.error?.code !== METHOD_NOT_FOUND;
100
+ } catch {
101
+ supportedMethods[m] = false;
102
+ }
103
+ }
104
+ const ep07 = getContract(pepuMainnet.id, "entryPoint07");
105
+ const want = ep07?.status === "deployed" ? ep07.address.toLowerCase() : void 0;
106
+ const ok = chainId === pepuMainnet.id && (want === void 0 || (entryPoints?.some((a) => a.toLowerCase() === want) ?? false));
107
+ const out = { ok, latencyMs: Date.now() - started, supportedMethods };
108
+ if (chainId !== void 0) out.chainId = chainId;
109
+ if (entryPoints) out.entryPoints = entryPoints;
110
+ if (!ok) {
111
+ out.error = new PepuBundlerError(
112
+ "BUNDLER_UNREACHABLE",
113
+ chainId !== void 0 && chainId !== pepuMainnet.id ? `The bundler serves chain ${chainId}, not ${pepuMainnet.id}.` : "The bundler does not list EntryPoint v0.7.",
114
+ { hint: "Point PEPU_BUNDLER_URL at a bundler for chain 97741 that supports EntryPoint v0.7." }
115
+ );
116
+ }
117
+ return out;
118
+ } catch (e) {
119
+ return { ok: false, latencyMs: Date.now() - started, error: unreachable(url, e) };
120
+ }
121
+ }
122
+ var STUB_PROBE_OP = {
123
+ sender: "0x0000000000000000000000000000000000000001",
124
+ nonce: "0x0",
125
+ callData: "0x",
126
+ callGasLimit: "0x0",
127
+ verificationGasLimit: "0x0",
128
+ preVerificationGas: "0x0",
129
+ maxFeePerGas: "0x0",
130
+ maxPriorityFeePerGas: "0x0",
131
+ signature: "0x"
132
+ };
133
+ async function probePaymaster(url, o = {}) {
134
+ checkUrl(url, "Paymaster URL");
135
+ const f = o.fetch ?? ((i, init) => fetch(i, init));
136
+ const timeoutMs = o.timeoutMs ?? 8e3;
137
+ const started = Date.now();
138
+ const origin = new URL(url).origin;
139
+ const out = { ok: false, latencyMs: 0 };
140
+ let reached = false;
141
+ let lastError;
142
+ try {
143
+ const res = await timedFetch(f, `${origin}/health`, { method: "GET" }, timeoutMs);
144
+ reached = true;
145
+ const body = await res.json().catch(() => null);
146
+ out.health = res.ok && body?.status === "ok";
147
+ } catch (e) {
148
+ lastError = e;
149
+ out.health = false;
150
+ }
151
+ try {
152
+ const res = await timedFetch(f, `${origin}/v2/free-tier`, { method: "GET" }, timeoutMs);
153
+ reached = true;
154
+ if (res.ok) out.freeTier = await res.json().catch(() => void 0);
155
+ } catch (e) {
156
+ lastError = e;
157
+ }
158
+ let speaksRpc = false;
159
+ try {
160
+ const ep07 = getContract(pepuMainnet.id, "entryPoint07");
161
+ const ep = ep07?.status === "deployed" ? ep07.address : "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
162
+ const reply = await rpc(
163
+ f,
164
+ url,
165
+ "pm_getPaymasterStubData",
166
+ [STUB_PROBE_OP, ep, `0x${pepuMainnet.id.toString(16)}`, {}],
167
+ timeoutMs
168
+ );
169
+ reached = true;
170
+ speaksRpc = reply.result !== void 0 || reply.error !== void 0;
171
+ out.erc7677StubOk = reply.result !== void 0;
172
+ } catch (e) {
173
+ lastError = e;
174
+ out.erc7677StubOk = false;
175
+ }
176
+ out.latencyMs = Date.now() - started;
177
+ out.ok = out.health === true || speaksRpc;
178
+ if (!reached) out.error = unreachable(url, lastError);
179
+ else if (!out.ok) {
180
+ out.error = new PepuBundlerError("BUNDLER_UNREACHABLE", `${hostOf(url)} answered but is not a PEPU paymaster service.`, {
181
+ hint: "Check PEPU_PAYMASTER_URL points at the policy service (https://paymaster.pepeunchained.com), or its /v2/paymaster/<client token> endpoint."
182
+ });
183
+ }
184
+ return out;
185
+ }
186
+ async function getPaymasterDeposit(client, paymaster) {
187
+ const pm = getContract(pepuMainnet.id, "paymaster");
188
+ const ep = getContract(pepuMainnet.id, "entryPoint07");
189
+ const account = paymaster ?? (pm?.status === "deployed" ? pm.address : void 0);
190
+ if (!account || ep?.status !== "deployed") {
191
+ throw new PepuConfigError("CONFIG_MISSING_ENV", "No paymaster address is known; pass one explicitly.", {
192
+ hint: "Pass the paymaster address as the second argument."
193
+ });
194
+ }
195
+ return client.readContract({
196
+ address: ep.address,
197
+ abi: entryPointV07Abi,
198
+ functionName: "balanceOf",
199
+ args: [account]
200
+ });
201
+ }
202
+
203
+ // src/aa/status.ts
204
+ function getPepuKernelStack(chainId) {
205
+ const entryPoint06 = getContract(chainId, "entryPoint06");
206
+ const entryPoint07 = getContract(chainId, "entryPoint07");
207
+ const kernelFactory = getContract(chainId, "kernelFactory");
208
+ const kernelMetaFactory = getContract(chainId, "kernelMetaFactory");
209
+ const ecdsaValidator = getContract(chainId, "ecdsaValidator");
210
+ if (entryPoint06?.status !== "deployed" || entryPoint07?.status !== "deployed" || kernelFactory?.status !== "deployed" || kernelMetaFactory?.status !== "deployed" || ecdsaValidator?.status !== "deployed") {
211
+ return void 0;
212
+ }
213
+ return { entryPoint06, entryPoint07, kernelFactory, kernelMetaFactory, ecdsaValidator };
214
+ }
215
+ function getSponsorshipStatus(options) {
216
+ const reason = "This deprecated function never probes anything and always reports unavailable. The hosted bundler (bundler.pepeunchained.com) and paymaster service (paymaster.pepeunchained.com) are live, and sponsorship is proven end to end on mainnet through them. Call checkSponsorship() for the live status. A Kernel v3 smart account without a funded project or free-tier token must still fund its own EntryPoint deposit and pay its own gas, like a normal EOA-sent transaction.";
217
+ return options?.bundlerUrl === void 0 ? { available: false, reason } : { available: false, reason, bundlerUrl: options.bundlerUrl };
218
+ }
219
+ async function getKernelAccountAddress(client, factory, args) {
220
+ return client.readContract({
221
+ address: factory.address,
222
+ abi: kernelFactoryAbi,
223
+ functionName: "getAddress",
224
+ args: [args.data, args.salt]
225
+ });
226
+ }
227
+ async function checkSponsorship(options = {}) {
228
+ const { bundlerUrl, paymasterUrl: erc7677Url, paymasterBaseUrl } = resolvePepuEndpoints({
229
+ ...options.bundlerUrl !== void 0 ? { bundlerUrl: options.bundlerUrl } : {},
230
+ ...options.paymasterUrl !== void 0 ? { paymasterUrl: options.paymasterUrl } : {},
231
+ ...options.env ? { env: options.env } : {}
232
+ });
233
+ const paymasterUrl = erc7677Url ?? paymasterBaseUrl;
234
+ const probeOpts = {
235
+ ...options.fetch ? { fetch: options.fetch } : {},
236
+ ...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
237
+ };
238
+ const fixes = [];
239
+ if (bundlerUrl === null) fixes.push(`Set ${PEPU_ENV.bundlerUrl} to a bundler for chain 97741 (EntryPoint v0.7).`);
240
+ if (paymasterUrl === null) fixes.push(`Set ${PEPU_ENV.paymasterUrl} to your ERC-7677 paymaster endpoint (https://paymaster.pepeunchained.com/v2/paymaster/<client token>).`);
241
+ const [bProbe, pProbe] = await Promise.all([
242
+ bundlerUrl === null ? void 0 : probeBundler(bundlerUrl, probeOpts),
243
+ paymasterUrl === null ? void 0 : probePaymaster(paymasterUrl, probeOpts)
244
+ ]);
245
+ if (bProbe && !bProbe.ok) fixes.push(bProbe.error?.hint ?? "The bundler did not answer correctly.");
246
+ if (pProbe && !pProbe.ok) fixes.push(pProbe.error?.hint ?? "The paymaster did not answer correctly.");
247
+ let depositWei;
248
+ if (options.publicClient) {
249
+ try {
250
+ depositWei = await getPaymasterDeposit(options.publicClient, options.paymasterAddress);
251
+ if (depositWei === 0n) fixes.push("The paymaster's EntryPoint deposit is empty. Deposit PEPU to it.");
252
+ } catch {
253
+ }
254
+ }
255
+ const available = !!bProbe?.ok && !!pProbe?.ok && depositWei !== 0n;
256
+ const configured = bundlerUrl !== null || paymasterUrl !== null;
257
+ const reason = available ? "Bundler and paymaster are reachable; sponsored UserOperations can be sent." : !configured ? "No bundler or paymaster URL is configured. Set PEPU_BUNDLER_URL and PEPU_PAYMASTER_URL, or use the hosted defaults." : "A bundler or paymaster is configured but not fully working. See fixes.";
258
+ return {
259
+ available,
260
+ transport: configured ? "direct" : "none",
261
+ bundler: { configured: bundlerUrl !== null, ...bProbe ? { probe: bProbe } : {} },
262
+ paymaster: {
263
+ configured: paymasterUrl !== null,
264
+ ...pProbe ? { probe: pProbe } : {},
265
+ ...depositWei !== void 0 ? { depositWei } : {}
266
+ },
267
+ reason,
268
+ fixes
269
+ };
270
+ }
271
+
272
+ export { KERNEL_V3_1_IMPLEMENTATION_ADDRESS, checkSponsorship, entryPointV07Abi, getKernelAccountAddress, getPaymasterDeposit, getPepuKernelStack, getSponsorshipStatus, kernelFactoryAbi, probeBundler, probePaymaster };
273
+ //# sourceMappingURL=chunk-KIIFL4VM.js.map
274
+ //# sourceMappingURL=chunk-KIIFL4VM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/abi/kernelFactory.ts","../src/abi/entryPointV07.ts","../src/aa/probes.ts","../src/aa/status.ts"],"names":["parseAbi"],"mappings":"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","file":"chunk-KIIFL4VM.js","sourcesContent":["import { parseAbi } from \"viem\";\n\n/**\n * ZeroDev Kernel v3 account factory ABI, at\n * `0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419` (deployed on PEPU mainnet\n * only; see `pepuContracts.kernelFactory` in `../contracts.js`).\n *\n * Verified live against mainnet 2026-09-24 via `eth_call`:\n * - `implementation()` returns `0xbAC849bB641841b44E965fb01A4Bf5F074F84B4d` —\n * ZeroDev's Kernel v3.1 singleton implementation address, deployed at the\n * same address on every chain that has it via CREATE2.\n * - `getAddress(bytes,bytes32)`, called with empty `data` and a zero salt,\n * returns a computed address without reverting.\n * - `createAccount(bytes,bytes32)`, simulated (not sent) with the same\n * empty `data` and zero salt via `eth_call`, returns the **same** address\n * `getAddress` computed for those inputs — exactly the counterfactual-\n * address behavior a CREATE2 account factory is supposed to have.\n *\n * What this package does NOT ship: a helper that encodes the `data`\n * argument (Kernel v3.1's `initialize(...)` calldata — root validator,\n * hook, validator data, hook data, init config). No account has ever been\n * created through this factory on PEPU yet (its transaction history is\n * empty as of the verification date above), so there was nothing on-chain\n * to check a hand-rolled encoding against, and guessing one here would be\n * exactly the kind of invented byte layout this package's rules forbid.\n * Use ZeroDev's own `@zerodev/sdk` (or the public Kernel contracts source)\n * to build that payload, then pass the resulting bytes into\n * `getAddress`/`createAccount` from this ABI.\n */\nexport const kernelFactoryAbi = parseAbi([\n \"function implementation() view returns (address)\",\n \"function getAddress(bytes calldata data, bytes32 salt) view returns (address)\",\n \"function createAccount(bytes calldata data, bytes32 salt) payable returns (address)\",\n]);\n\n/**\n * The verified Kernel v3.1 singleton implementation address that\n * `kernelFactoryAbi`'s `implementation()` resolves to on PEPU mainnet. Same\n * address ZeroDev uses across every chain that has this Kernel version.\n */\nexport const KERNEL_V3_1_IMPLEMENTATION_ADDRESS =\n \"0xbAC849bB641841b44E965fb01A4Bf5F074F84B4d\" as const;\n","import { parseAbi } from \"viem\";\n\n/**\n * ERC-4337 EntryPoint v0.7 ABI — the subset a dapp actually needs to manage\n * a smart account's gas deposit and read its nonce, at the canonical address\n * `0x0000000071727De22E5E9d8BAf0edAc6f37da032` (deployed on PEPU mainnet\n * only; see `pepuContracts.entryPoint07` in `../contracts.js`).\n *\n * This is NOT the full `IEntryPoint` interface (no `handleOps`,\n * `simulateValidation`, etc.) — those are normally called by a bundler, and\n * PEPU has no publicly hosted bundler yet (see `getSponsorshipStatus` in\n * `../aa/status.js`). This ABI only covers deposit/nonce management, which works\n * today with a plain viem wallet client and no bundler at all.\n *\n * Verified live against mainnet 2026-09-24 via `eth_call`:\n * - `getNonce(address,uint192)` for the zero address/key returns `0`.\n * - `balanceOf(address)` for the zero address returns `0`.\n * - `getDepositInfo(address)` for the zero address returns a 5-word\n * (all-zero) tuple, matching the v0.7 `DepositInfo` struct shape\n * `(uint256 deposit, bool staked, uint96 stake, uint32 unstakeDelaySec,\n * uint48 withdrawTime)` field-for-field.\n * `depositTo`/`withdrawTo` share the same `IStakeManager` interface as the\n * verified `getDepositInfo`/`balanceOf` pair and are standard across every\n * EntryPoint version; they were not separately simulated (both mutate\n * state, and simulating a withdrawal from an empty deposit would only prove\n * it reverts, not that it works).\n */\nexport const entryPointV07Abi = parseAbi([\n \"function getNonce(address sender, uint192 key) view returns (uint256 nonce)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function depositTo(address account) payable\",\n \"function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount)\",\n \"function getDepositInfo(address account) view returns ((uint256 deposit, bool staked, uint96 stake, uint32 unstakeDelaySec, uint48 withdrawTime) info)\",\n \"event Deposited(address indexed account, uint256 totalDeposit)\",\n \"event Withdrawn(address indexed account, address withdrawAddress, uint256 amount)\",\n]);\n","import type { Address, PublicClient } from \"viem\";\n\nimport { entryPointV07Abi } from \"../abi/entryPointV07.js\";\nimport { pepuMainnet } from \"../chains.js\";\nimport { getContract } from \"../contracts.js\";\nimport { PepuBundlerError, PepuConfigError } from \"../errors.js\";\nimport { redactSecrets } from \"./describe.js\";\n\n/** Minimal fetch signature, so tests and non-browser hosts can inject one. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface ProbeOptions {\n fetch?: FetchLike;\n /** Per-request timeout. Default 8000. */\n timeoutMs?: number;\n}\n\nexport interface BundlerProbeResult {\n ok: boolean;\n chainId?: number;\n entryPoints?: Address[];\n /** `true` when the method exists (any answer but \"method not found\"). */\n supportedMethods?: Record<string, boolean>;\n latencyMs: number;\n error?: PepuBundlerError;\n}\n\nexport interface PaymasterProbeResult {\n ok: boolean;\n /** `GET <origin>/health` answered `{ status: \"ok\" }`. */\n health?: boolean;\n /** Body of `GET <origin>/v2/free-tier` when the service exposes it. */\n freeTier?: unknown;\n /**\n * The URL answered a `pm_getPaymasterStubData` call with a stub result. A\n * JSON-RPC denial (no credential, unknown sender) is NOT a stub result:\n * the endpoint is alive and speaks ERC-7677, but the probe has no\n * credential, so this stays `false`.\n */\n erc7677StubOk?: boolean;\n latencyMs: number;\n error?: PepuBundlerError;\n}\n\nconst BUNDLER_METHODS = [\n \"eth_sendUserOperation\",\n \"eth_estimateUserOperationGas\",\n \"eth_getUserOperationReceipt\",\n \"eth_getUserOperationByHash\",\n \"pimlico_getUserOperationGasPrice\",\n \"zd_getUserOperationGasPrice\",\n] as const;\n\nconst METHOD_NOT_FOUND = -32601;\n\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return \"the configured host\";\n }\n}\n\nfunction checkUrl(url: string, label: string): void {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n throw new PepuConfigError(\"CONFIG_BAD_URL\", `${label} is not a valid URL.`);\n }\n if (u.protocol !== \"http:\" && u.protocol !== \"https:\") {\n throw new PepuConfigError(\"CONFIG_BAD_URL\", `${label} must be an http(s) URL.`);\n }\n}\n\nasync function timedFetch(f: FetchLike, url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const ctl = new AbortController();\n const t = setTimeout(() => ctl.abort(), timeoutMs);\n try {\n return await f(url, { ...init, signal: ctl.signal });\n } finally {\n clearTimeout(t);\n }\n}\n\ninterface RpcReply {\n result?: unknown;\n error?: { code?: number; message?: string; data?: unknown };\n}\n\nasync function rpc(f: FetchLike, url: string, method: string, params: unknown[], timeoutMs: number): Promise<RpcReply> {\n const res = await timedFetch(\n f,\n url,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n },\n timeoutMs,\n );\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n throw new Error(`HTTP ${res.status} with a non-JSON body`);\n }\n if (!body || typeof body !== \"object\") throw new Error(`HTTP ${res.status} with an unexpected body`);\n return body as RpcReply;\n}\n\nfunction unreachable(url: string, e: unknown): PepuBundlerError {\n const reason = e instanceof Error && e.name === \"AbortError\" ? \"timed out\" : redactSecrets(e instanceof Error ? e.message : String(e)).replace(/https?:\\/\\/\\S+/g, \"[url]\");\n return new PepuBundlerError(\"BUNDLER_UNREACHABLE\", `Could not reach ${hostOf(url)}: ${reason}`, { cause: e });\n}\n\n/**\n * Probe a bundler URL: `eth_chainId`, `eth_supportedEntryPoints` and a\n * capability check of the methods PEPU apps use (a method answered with\n * anything but \"method not found\" counts as supported; nothing is sent\n * on-chain). Never throws for network trouble; returns `ok: false` with a\n * `BUNDLER_UNREACHABLE` error. Throws `CONFIG_BAD_URL` for a malformed URL.\n *\n * @example\n * const r = await probeBundler(\"https://bundler.example.com\");\n * if (!r.ok) console.log(r.error?.hint);\n */\nexport async function probeBundler(url: string, o: ProbeOptions = {}): Promise<BundlerProbeResult> {\n checkUrl(url, \"Bundler URL\");\n const f: FetchLike = o.fetch ?? ((i, init) => fetch(i, init));\n const timeoutMs = o.timeoutMs ?? 8000;\n const started = Date.now();\n try {\n const chain = await rpc(f, url, \"eth_chainId\", [], timeoutMs);\n const eps = await rpc(f, url, \"eth_supportedEntryPoints\", [], timeoutMs);\n const chainId = typeof chain.result === \"string\" ? Number(BigInt(chain.result)) : undefined;\n const entryPoints = Array.isArray(eps.result) ? (eps.result as Address[]) : undefined;\n const supportedMethods: Record<string, boolean> = {};\n for (const m of BUNDLER_METHODS) {\n try {\n const r = await rpc(f, url, m, [], timeoutMs);\n supportedMethods[m] = r.error?.code !== METHOD_NOT_FOUND;\n } catch {\n supportedMethods[m] = false;\n }\n }\n const ep07 = getContract(pepuMainnet.id, \"entryPoint07\");\n const want = ep07?.status === \"deployed\" ? ep07.address.toLowerCase() : undefined;\n const ok =\n chainId === pepuMainnet.id &&\n (want === undefined || (entryPoints?.some((a) => a.toLowerCase() === want) ?? false));\n const out: BundlerProbeResult = { ok, latencyMs: Date.now() - started, supportedMethods };\n if (chainId !== undefined) out.chainId = chainId;\n if (entryPoints) out.entryPoints = entryPoints;\n if (!ok) {\n out.error = new PepuBundlerError(\n \"BUNDLER_UNREACHABLE\",\n chainId !== undefined && chainId !== pepuMainnet.id\n ? `The bundler serves chain ${chainId}, not ${pepuMainnet.id}.`\n : \"The bundler does not list EntryPoint v0.7.\",\n { hint: \"Point PEPU_BUNDLER_URL at a bundler for chain 97741 that supports EntryPoint v0.7.\" },\n );\n }\n return out;\n } catch (e) {\n return { ok: false, latencyMs: Date.now() - started, error: unreachable(url, e) };\n }\n}\n\nconst STUB_PROBE_OP = {\n sender: \"0x0000000000000000000000000000000000000001\",\n nonce: \"0x0\",\n callData: \"0x\",\n callGasLimit: \"0x0\",\n verificationGasLimit: \"0x0\",\n preVerificationGas: \"0x0\",\n maxFeePerGas: \"0x0\",\n maxPriorityFeePerGas: \"0x0\",\n signature: \"0x\",\n} as const;\n\n/**\n * Probe a paymaster URL: the service base (`https://paymaster.pepeunchained.com`) or the ERC-7677 endpoint\n * (`https://host/v2/paymaster/<token>`).\n * Checks `GET <origin>/health`, `GET <origin>/v2/free-tier`, and whether the URL\n * answers JSON-RPC `pm_getPaymasterStubData`. `ok` means the service is alive:\n * health is ok, or the URL spoke valid JSON-RPC. The URL (which can embed a\n * token) never appears in the returned error.\n *\n * @example\n * const r = await probePaymaster(process.env.PEPU_PAYMASTER_URL!);\n * console.log(r.ok, r.freeTier);\n */\nexport async function probePaymaster(url: string, o: ProbeOptions = {}): Promise<PaymasterProbeResult> {\n checkUrl(url, \"Paymaster URL\");\n const f: FetchLike = o.fetch ?? ((i, init) => fetch(i, init));\n const timeoutMs = o.timeoutMs ?? 8000;\n const started = Date.now();\n const origin = new URL(url).origin;\n const out: PaymasterProbeResult = { ok: false, latencyMs: 0 };\n let reached = false;\n let lastError: unknown;\n\n try {\n const res = await timedFetch(f, `${origin}/health`, { method: \"GET\" }, timeoutMs);\n reached = true;\n const body = (await res.json().catch(() => null)) as { status?: unknown } | null;\n out.health = res.ok && body?.status === \"ok\";\n } catch (e) {\n lastError = e;\n out.health = false;\n }\n\n try {\n const res = await timedFetch(f, `${origin}/v2/free-tier`, { method: \"GET\" }, timeoutMs);\n reached = true;\n if (res.ok) out.freeTier = await res.json().catch(() => undefined);\n } catch (e) {\n lastError = e;\n }\n\n let speaksRpc = false;\n try {\n const ep07 = getContract(pepuMainnet.id, \"entryPoint07\");\n const ep = ep07?.status === \"deployed\" ? ep07.address : \"0x0000000071727De22E5E9d8BAf0edAc6f37da032\";\n const reply = await rpc(\n f,\n url,\n \"pm_getPaymasterStubData\",\n [STUB_PROBE_OP, ep, `0x${pepuMainnet.id.toString(16)}`, {}],\n timeoutMs,\n );\n reached = true;\n speaksRpc = reply.result !== undefined || reply.error !== undefined;\n out.erc7677StubOk = reply.result !== undefined;\n } catch (e) {\n lastError = e;\n out.erc7677StubOk = false;\n }\n\n out.latencyMs = Date.now() - started;\n out.ok = out.health === true || speaksRpc;\n if (!reached) out.error = unreachable(url, lastError);\n else if (!out.ok) {\n out.error = new PepuBundlerError(\"BUNDLER_UNREACHABLE\", `${hostOf(url)} answered but is not a PEPU paymaster service.`, {\n hint: \"Check PEPU_PAYMASTER_URL points at the policy service (https://paymaster.pepeunchained.com), or its /v2/paymaster/<client token> endpoint.\",\n });\n }\n return out;\n}\n\n/**\n * The paymaster's EntryPoint v0.7 deposit in wei. A drop across a UserOperation\n * is the proof that it was sponsored. Defaults to PEPU's deployed paymaster.\n *\n * @example\n * const before = await getPaymasterDeposit(publicClient);\n */\nexport async function getPaymasterDeposit(client: PublicClient, paymaster?: Address): Promise<bigint> {\n const pm = getContract(pepuMainnet.id, \"paymaster\");\n const ep = getContract(pepuMainnet.id, \"entryPoint07\");\n const account = paymaster ?? (pm?.status === \"deployed\" ? pm.address : undefined);\n if (!account || ep?.status !== \"deployed\") {\n throw new PepuConfigError(\"CONFIG_MISSING_ENV\", \"No paymaster address is known; pass one explicitly.\", {\n hint: \"Pass the paymaster address as the second argument.\",\n });\n }\n return client.readContract({\n address: ep.address,\n abi: entryPointV07Abi,\n functionName: \"balanceOf\",\n args: [account],\n });\n}\n","import type { Address, Hex, PublicClient, Transport } from \"viem\";\n\nimport { kernelFactoryAbi } from \"../abi/kernelFactory.js\";\nimport type { PepuChain } from \"../chains.js\";\nimport type { DeployedContract } from \"../contracts.js\";\nimport { getContract } from \"../contracts.js\";\nimport { PEPU_ENV, resolvePepuEndpoints } from \"../endpoints.js\";\nimport { getPaymasterDeposit, probeBundler, probePaymaster } from \"./probes.js\";\nimport type { BundlerProbeResult, FetchLike, PaymasterProbeResult } from \"./probes.js\";\n\n/**\n * The account-abstraction contracts a Kernel v3 smart account needs,\n * narrowed to their {@link DeployedContract} form for a given chain.\n * Returns `undefined` if any one of them isn't deployed on that chain\n * (today: everything except mainnet, `97741`) — this package never fabricates\n * a partial/best-effort bundle.\n */\nexport interface PepuKernelStack {\n readonly entryPoint06: DeployedContract;\n readonly entryPoint07: DeployedContract;\n readonly kernelFactory: DeployedContract;\n readonly kernelMetaFactory: DeployedContract;\n readonly ecdsaValidator: DeployedContract;\n}\n\n/**\n * Look up every AA contract this package knows about for `chainId`, already\n * narrowed to {@link DeployedContract}. Returns `undefined` unless *all* five\n * are deployed on that chain (today, only PEPU mainnet qualifies) — a caller\n * building a Kernel account needs every one of them, so a partial result\n * would just move the \"is this actually usable\" check into every caller.\n *\n * This is a convenience grouping over `getContract` from `./contracts.js`;\n * it doesn't add any address or fact that registry doesn't already have.\n */\nexport function getPepuKernelStack(chainId: number): PepuKernelStack | undefined {\n const entryPoint06 = getContract(chainId, \"entryPoint06\");\n const entryPoint07 = getContract(chainId, \"entryPoint07\");\n const kernelFactory = getContract(chainId, \"kernelFactory\");\n const kernelMetaFactory = getContract(chainId, \"kernelMetaFactory\");\n const ecdsaValidator = getContract(chainId, \"ecdsaValidator\");\n\n if (\n entryPoint06?.status !== \"deployed\" ||\n entryPoint07?.status !== \"deployed\" ||\n kernelFactory?.status !== \"deployed\" ||\n kernelMetaFactory?.status !== \"deployed\" ||\n ecdsaValidator?.status !== \"deployed\"\n ) {\n return undefined;\n }\n\n return { entryPoint06, entryPoint07, kernelFactory, kernelMetaFactory, ecdsaValidator };\n}\n\n/**\n * Legacy static gas-sponsorship status for PEPU. **Always reports\n * unavailable** (it never probes). Sponsorship is PROVEN end to end on PEPU\n * mainnet through the hosted bundler and paymaster service (a zero-balance\n * Kernel smart account transacted, paid for by the paymaster); use\n * `checkSponsorship()` for the live answer. This function\n * exists so nothing downstream (this package, `@pepu-chain/mcp`, an app)\n * has to independently invent an \"is sponsorship on?\" check, and so that\n * check can't silently start lying once this file changes.\n *\n * Do not treat the presence of `kernelFactory`/`ecdsaValidator`/`paymaster`\n * addresses in {@link getPepuKernelStack} / the contract registry as\n * sponsorship support — those let you build and deploy a Kernel account and\n * send its UserOperations through a normal `eth_sendTransaction`-style flow\n * (self-paying its own gas via the EntryPoint deposit), which is a real,\n * working feature; sponsoring that gas needs a funded project or free-tier token.\n */\nexport interface SponsorshipStatus {\n readonly available: false;\n readonly reason: string;\n /**\n * Extension point for a future bundler/paymaster integration. Passing a\n * URL here does **not** make sponsorship available — `available` stays\n * `false` regardless — this field only exists so a caller can start\n * wiring a URL through their own config today and have this function\n * start using it later without an API change.\n */\n readonly bundlerUrl?: string;\n}\n\n/** Options for {@link getSponsorshipStatus}. */\nexport interface GetSponsorshipStatusOptions {\n /** See {@link SponsorshipStatus.bundlerUrl}. Not yet used for anything. */\n readonly bundlerUrl?: string;\n}\n\n/**\n * @deprecated Always reports `available: false`. Use `checkSponsorship()` (live\n * bundler and paymaster probe) from `@pepu-chain/sdk`. Kept for 0.1 callers.\n */\nexport function getSponsorshipStatus(\n options?: GetSponsorshipStatusOptions,\n): SponsorshipStatus {\n const reason =\n \"This deprecated function never probes anything and always reports \" +\n \"unavailable. The hosted bundler (bundler.pepeunchained.com) and \" +\n \"paymaster service (paymaster.pepeunchained.com) are live, and \" +\n \"sponsorship is proven end to end on mainnet through them. Call \" +\n \"checkSponsorship() for the live status. A Kernel v3 smart account \" +\n \"without a funded project or free-tier token must still fund its own \" +\n \"EntryPoint deposit and pay its own gas, like a normal EOA-sent transaction.\";\n return options?.bundlerUrl === undefined\n ? { available: false, reason }\n : { available: false, reason, bundlerUrl: options.bundlerUrl };\n}\n\n/**\n * Compute (or confirm) the counterfactual address of a Kernel v3 smart\n * account via the verified factory's `getAddress(data, salt)` — a thin,\n * typed pass-through, not a re-implementation.\n *\n * Deliberately does **not** build `data` (Kernel v3.1's `initialize(...)`\n * calldata: root validator, hook, validator data, hook data, init config)\n * for you. A hand-rolled encoding here would be a second, unverified copy of\n * the byte layout that ZeroDev's SDK already produces (and that has been\n * exercised against PEPU's factory through the sponsored-transaction run),\n * which is exactly the kind of invented encoding this package's rules\n * forbid for addresses. Build `data` with ZeroDev's\n * `@zerodev/sdk` (or by hand from the public Kernel v3 contracts source),\n * then pass the result here.\n */\nexport async function getKernelAccountAddress(\n client: PublicClient<Transport, PepuChain>,\n factory: Pick<DeployedContract, \"address\">,\n args: { readonly data: Hex; readonly salt: Hex },\n): Promise<Address> {\n return client.readContract({\n address: factory.address,\n abi: kernelFactoryAbi,\n functionName: \"getAddress\",\n args: [args.data, args.salt],\n });\n}\n\n/** Live sponsorship report from {@link checkSponsorship}. */\nexport interface SponsorshipReport {\n /** True only when a bundler and a paymaster are configured and both answer. */\n available: boolean;\n /** `direct` when you bring your own bundler and paymaster URLs; `none` when nothing is configured. */\n transport: \"direct\" | \"none\";\n bundler: { configured: boolean; probe?: BundlerProbeResult };\n paymaster: { configured: boolean; probe?: PaymasterProbeResult; depositWei?: bigint };\n /** One sentence for a human or an agent. */\n reason: string;\n /** Concrete next steps, empty when `available`. */\n fixes: string[];\n}\n\n/** Options for {@link checkSponsorship}. */\nexport interface CheckSponsorshipOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n env?: Record<string, string | undefined>;\n fetch?: FetchLike;\n /** When given, also read the paymaster's EntryPoint deposit. */\n publicClient?: PublicClient;\n /** Paymaster contract to read the deposit of. Defaults to PEPU's deployed paymaster. */\n paymasterAddress?: Address;\n timeoutMs?: number;\n}\n\n/**\n * Live gas-sponsorship status. Resolves the bundler and paymaster URLs from\n * options, env, then the hosted defaults (bundler.pepeunchained.com and the paymaster\n * service base; with no token URL the service is probed at its base), probes both,\n * and optionally reads the paymaster deposit. Never throws for an\n * unreachable service; it reports `available: false` with `fixes`.\n * Replaces the hard-coded {@link getSponsorshipStatus}.\n *\n * @example\n * const s = await checkSponsorship({ publicClient });\n * if (!s.available) console.log(s.reason, s.fixes);\n */\nexport async function checkSponsorship(options: CheckSponsorshipOptions = {}): Promise<SponsorshipReport> {\n const { bundlerUrl, paymasterUrl: erc7677Url, paymasterBaseUrl } = resolvePepuEndpoints({\n ...(options.bundlerUrl !== undefined ? { bundlerUrl: options.bundlerUrl } : {}),\n ...(options.paymasterUrl !== undefined ? { paymasterUrl: options.paymasterUrl } : {}),\n ...(options.env ? { env: options.env } : {}),\n });\n // No token means no complete ERC-7677 URL: probe the service base (health + free-tier state) instead.\n const paymasterUrl = erc7677Url ?? paymasterBaseUrl;\n const probeOpts = {\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n };\n const fixes: string[] = [];\n if (bundlerUrl === null) fixes.push(`Set ${PEPU_ENV.bundlerUrl} to a bundler for chain 97741 (EntryPoint v0.7).`);\n if (paymasterUrl === null) fixes.push(`Set ${PEPU_ENV.paymasterUrl} to your ERC-7677 paymaster endpoint (https://paymaster.pepeunchained.com/v2/paymaster/<client token>).`);\n\n const [bProbe, pProbe] = await Promise.all([\n bundlerUrl === null ? undefined : probeBundler(bundlerUrl, probeOpts),\n paymasterUrl === null ? undefined : probePaymaster(paymasterUrl, probeOpts),\n ]);\n if (bProbe && !bProbe.ok) fixes.push(bProbe.error?.hint ?? \"The bundler did not answer correctly.\");\n if (pProbe && !pProbe.ok) fixes.push(pProbe.error?.hint ?? \"The paymaster did not answer correctly.\");\n\n let depositWei: bigint | undefined;\n if (options.publicClient) {\n try {\n depositWei = await getPaymasterDeposit(options.publicClient, options.paymasterAddress);\n if (depositWei === 0n) fixes.push(\"The paymaster's EntryPoint deposit is empty. Deposit PEPU to it.\");\n } catch {\n // A failed read must not flip availability; the probes are the source of truth.\n }\n }\n\n const available = !!bProbe?.ok && !!pProbe?.ok && depositWei !== 0n;\n const configured = bundlerUrl !== null || paymasterUrl !== null;\n const reason = available\n ? \"Bundler and paymaster are reachable; sponsored UserOperations can be sent.\"\n : !configured\n ? \"No bundler or paymaster URL is configured. Set PEPU_BUNDLER_URL and PEPU_PAYMASTER_URL, or use the hosted defaults.\"\n : \"A bundler or paymaster is configured but not fully working. See fixes.\";\n return {\n available,\n transport: configured ? \"direct\" : \"none\",\n bundler: { configured: bundlerUrl !== null, ...(bProbe ? { probe: bProbe } : {}) },\n paymaster: {\n configured: paymasterUrl !== null,\n ...(pProbe ? { probe: pProbe } : {}),\n ...(depositWei !== undefined ? { depositWei } : {}),\n },\n reason,\n fixes,\n };\n}\n"]}
@@ -0,0 +1,99 @@
1
+ import { toPepuKernelAccount, KERNEL_VERSION } from './chunk-ZB6SVBK4.js';
2
+ import { ENTRY_POINT_V07 } from './chunk-IB2FSPMJ.js';
3
+ import { assertCalls, findFunction } from './chunk-ESMNAXUI.js';
4
+ import { serializePermissionAccount, deserializePermissionAccount, toPermissionValidator } from '@zerodev/permissions';
5
+ import { toCallPolicy, CallPolicyVersion, toTimestampPolicy } from '@zerodev/permissions/policies';
6
+ import { toECDSASigner, toEmptyECDSASigner } from '@zerodev/permissions/signers';
7
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
8
+
9
+ // src/session/store.ts
10
+ function createMemoryStore() {
11
+ const records = /* @__PURE__ */ new Map();
12
+ const locks = /* @__PURE__ */ new Set();
13
+ return {
14
+ get: (userId) => records.get(userId),
15
+ set: (record) => {
16
+ records.set(record.userId, record);
17
+ },
18
+ delete: (userId) => {
19
+ records.delete(userId);
20
+ },
21
+ tryLock: (userId) => {
22
+ if (locks.has(userId)) return false;
23
+ locks.add(userId);
24
+ return true;
25
+ },
26
+ unlock: (userId) => {
27
+ locks.delete(userId);
28
+ }
29
+ };
30
+ }
31
+ function isLive(record, nowSeconds) {
32
+ return record.approval !== null && nowSeconds < record.validUntil;
33
+ }
34
+
35
+ // src/session/kernel.ts
36
+ var CALL_POLICY_V0_0_4_ADDRESS = "0x9a52283276A0ec8740DF50bF01B28A80D880eaf2";
37
+ var TIMESTAMP_POLICY_ADDRESS = "0xB9f8f524bE6EcD8C945b1b87f9ae5C192FdCE20F";
38
+ var SESSION_GAS_RESERVATION_PEPU = { firstOperation: 20.5, laterOperation: 6.9 };
39
+ function zd(client) {
40
+ return client;
41
+ }
42
+ function buildKernelSessionPolicies(p) {
43
+ assertCalls(p.calls);
44
+ return [
45
+ toCallPolicy({
46
+ policyVersion: CallPolicyVersion.V0_0_4,
47
+ permissions: p.calls.map((c) => ({
48
+ target: c.target,
49
+ valueLimit: c.valueLimit ?? 0n,
50
+ abi: [findFunction(c)],
51
+ functionName: c.functionName
52
+ }))
53
+ }),
54
+ toTimestampPolicy({ validAfter: p.validAfter ?? 0, validUntil: p.validUntil })
55
+ ];
56
+ }
57
+ function generateSessionKey() {
58
+ const privateKey = generatePrivateKey();
59
+ return { privateKey, address: privateKeyToAccount(privateKey).address };
60
+ }
61
+ function permissionFor(publicClient, sessionKeyAddress, policies) {
62
+ return toPermissionValidator(zd(publicClient), {
63
+ entryPoint: ENTRY_POINT_V07,
64
+ kernelVersion: KERNEL_VERSION,
65
+ signer: toEmptyECDSASigner(sessionKeyAddress),
66
+ policies
67
+ });
68
+ }
69
+ async function expectedPermissionId(p) {
70
+ const permission = await permissionFor(p.publicClient, p.sessionKeyAddress, p.policies);
71
+ const { permissionId } = permission.getPluginSerializationParams();
72
+ if (!permissionId) throw new Error("Could not derive the permission id.");
73
+ return permissionId;
74
+ }
75
+ async function approveKernelSession(p) {
76
+ const regular = await permissionFor(p.publicClient, p.sessionKeyAddress, p.policies);
77
+ const account = await toPepuKernelAccount({
78
+ publicClient: p.publicClient,
79
+ owner: p.owner,
80
+ plugins: { regular }
81
+ });
82
+ const approval = await serializePermissionAccount(account);
83
+ return { approval, kernelAddress: account.address };
84
+ }
85
+ async function loadKernelSessionAccount(p) {
86
+ const sessionSigner = await toECDSASigner({ signer: privateKeyToAccount(p.sessionPrivateKey) });
87
+ const account = await deserializePermissionAccount(
88
+ zd(p.publicClient),
89
+ ENTRY_POINT_V07,
90
+ KERNEL_VERSION,
91
+ p.approval,
92
+ sessionSigner
93
+ );
94
+ return account;
95
+ }
96
+
97
+ export { CALL_POLICY_V0_0_4_ADDRESS, SESSION_GAS_RESERVATION_PEPU, TIMESTAMP_POLICY_ADDRESS, approveKernelSession, buildKernelSessionPolicies, createMemoryStore, expectedPermissionId, generateSessionKey, isLive, loadKernelSessionAccount };
98
+ //# sourceMappingURL=chunk-KVG3AYYR.js.map
99
+ //# sourceMappingURL=chunk-KVG3AYYR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/session/store.ts","../src/session/kernel.ts"],"names":[],"mappings":"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","file":"chunk-KVG3AYYR.js","sourcesContent":["import type { Address, Hex } from \"viem\";\n\n/**\n * Server-side session records for the Kernel (on-chain) session flow, keyed by\n * Privy user id. Ported from templates/sponsored-session-app/lib/session-store.ts.\n *\n * WHAT IS STORED: the session private key (a hot key whose power is limited\n * ON-CHAIN by the call and timestamp policies until `validUntil`) and the\n * public approval. The owner's key never reaches the server.\n *\n * PRODUCTION: {@link createMemoryStore} is DEV-GRADE. It is lost on every\n * restart (the user simply starts a new session) and is not shared between\n * serverless instances. A production deployment must implement\n * {@link SessionStore} on a persistent database or KV AND keep\n * `sessionPrivateKey` encrypted at rest (KMS or an envelope key). Nothing else\n * in the SDK changes.\n */\nexport interface SessionRecord {\n userId: string;\n ownerAddress: Address;\n kernelAddress: Address;\n /** The session key's private half. Encrypt it at rest in any persistent store. */\n sessionPrivateKey: Hex;\n sessionKeyAddress: Address;\n permissionId: string;\n /** Unix seconds. The on-chain permission is invalid at and after this time. */\n validUntil: number;\n /** Present once the owner has signed the grant. */\n approval: string | null;\n /** Number of successful sponsored actions in this session. */\n actions: number;\n}\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/**\n * Pluggable storage for {@link SessionRecord}s. Every method may be sync or\n * async. `tryLock` must be atomic per user: it returns `false` when an action\n * is already running for that user (a multi-instance deployment needs a\n * distributed lock, for example a Redis `SET NX PX`).\n */\nexport interface SessionStore {\n get(userId: string): MaybePromise<SessionRecord | undefined>;\n set(record: SessionRecord): MaybePromise<void>;\n delete(userId: string): MaybePromise<void>;\n tryLock(userId: string): MaybePromise<boolean>;\n unlock(userId: string): MaybePromise<void>;\n}\n\n/**\n * An in-memory {@link SessionStore} for development and tests. DEV-GRADE: not\n * persistent, not shared across instances, and the session key is held in\n * plaintext in process memory. Production needs an encrypted persistent store.\n *\n * @example\n * const store = createMemoryStore();\n */\nexport function createMemoryStore(): SessionStore {\n const records = new Map<string, SessionRecord>();\n const locks = new Set<string>();\n return {\n get: (userId) => records.get(userId),\n set: (record) => {\n records.set(record.userId, record);\n },\n delete: (userId) => {\n records.delete(userId);\n },\n tryLock: (userId) => {\n if (locks.has(userId)) return false;\n locks.add(userId);\n return true;\n },\n unlock: (userId) => {\n locks.delete(userId);\n },\n };\n}\n\n/**\n * True while the on-chain permission is still valid: approved and before expiry.\n *\n * @example\n * isLive(record, Math.floor(Date.now() / 1000));\n */\nexport function isLive(record: SessionRecord, nowSeconds: number): boolean {\n return record.approval !== null && nowSeconds < record.validUntil;\n}\n","import { deserializePermissionAccount, serializePermissionAccount, toPermissionValidator } from \"@zerodev/permissions\";\nimport type { Policy } from \"@zerodev/permissions\";\nimport { CallPolicyVersion, toCallPolicy, toTimestampPolicy } from \"@zerodev/permissions/policies\";\nimport { toECDSASigner, toEmptyECDSASigner } from \"@zerodev/permissions/signers\";\nimport type { createKernelAccount } from \"@zerodev/sdk\";\nimport type { Abi, Address, Hex, PublicClient } from \"viem\";\nimport { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\n\nimport { ENTRY_POINT_V07 } from \"../aa/clients.js\";\nimport { KERNEL_VERSION, toPepuKernelAccount } from \"../aa/kernel.js\";\nimport type { KernelOwner, KernelSmartAccount } from \"../aa/kernel.js\";\nimport { assertCalls, findFunction } from \"./scope.js\";\nimport type { KernelSessionCall } from \"./scope.js\";\n\nexport { KERNEL_VERSION, getKernelAddress } from \"../aa/kernel.js\";\nexport type { KernelOwner, KernelSmartAccount } from \"../aa/kernel.js\";\nexport { createMemoryStore, isLive } from \"./store.js\";\nexport type { SessionRecord, SessionStore } from \"./store.js\";\nexport { checkApproval, describeKernelSessionScope, isCallInScope, parseApproval } from \"./scope.js\";\nexport type { ApprovalCheck, KernelSessionCall, KernelSessionScope, ParsedApproval } from \"./scope.js\";\n\n/**\n * `@pepu-chain/sdk/session/kernel`: on-chain session keys with ZeroDev Kernel\n * permissions. Extracted from templates/sponsored-session-app/lib/{kernel,\n * session-policy,approval}.ts and built on `toPepuKernelAccount`\n * (`plugins.regular`).\n *\n * The scope is enforced ON-CHAIN by ZeroDev's policy contracts, which the\n * user's Kernel account calls during UserOperation validation:\n *\n * - Call policy v0.0.4: only the listed targets and function selectors, with a\n * native value no larger than `valueLimit` (default 0).\n * - Timestamp policy: the permission is invalid outside `validAfter`..`validUntil`.\n *\n * A UserOperation outside this scope is rejected by the EntryPoint itself, no\n * matter who relays it or what the app backend does.\n *\n * Deployed on PEPU mainnet (eth_getCode verified 2026-10-02): Kernel v3.1\n * factory 0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419, ECDSA validator\n * 0x845ADb2C711129d4f3966735eD98a9F09fC4cE57, ECDSA signer module\n * 0x6A6F069E2a08c2468e7724Ab3250CdBFBA14D4FF, call policy v0.0.4 and the\n * timestamp policy below. Call policy v0.0.5 is NOT deployed on PEPU, so the\n * version is pinned.\n *\n * Optional peers: `@zerodev/sdk`, `@zerodev/permissions`, `@zerodev/ecdsa-validator`.\n */\n\n/** Call policy v0.0.4. Pinned: v0.0.5 is not deployed on PEPU mainnet. */\nexport const CALL_POLICY_V0_0_4_ADDRESS: Address = \"0x9a52283276A0ec8740DF50bF01B28A80D880eaf2\";\n/** ZeroDev timestamp policy on PEPU mainnet. */\nexport const TIMESTAMP_POLICY_ADDRESS: Address = \"0xB9f8f524bE6EcD8C945b1b87f9ae5C192FdCE20F\";\n\n/**\n * Worst-case gas the paymaster policy service RESERVES per sponsored operation,\n * measured on PEPU mainnet with the sponsored-session-app template: the first\n * operation of a session (account deploy plus enabling the permission) about\n * 20.5 PEPU, later operations about 6.9 PEPU. The real first-session cost was\n * about 12.8 PEPU for two operations. Size per-user hourly and daily spend\n * caps above these, or users hit `trailing-hour spend ... would exceed cap`\n * after their first action.\n */\nexport const SESSION_GAS_RESERVATION_PEPU = { firstOperation: 20.5, laterOperation: 6.9 } as const;\n\ntype ZeroDevClient = Parameters<typeof createKernelAccount>[0];\n\n/** Type-level bridge for ZeroDev's own viem copy (same object at runtime). */\nfunction zd(client: PublicClient): ZeroDevClient {\n return client as unknown as ZeroDevClient;\n}\n\n/**\n * The on-chain policies for one session: call policy v0.0.4 plus the timestamp\n * policy. Pure and deterministic given its input. Only the named function\n * fragments go into the policy, which keeps the grant small.\n *\n * @example\n * const policies = buildKernelSessionPolicies({\n * calls: [{ target: tapScore, abi: tapScoreAbi, functionName: \"tap\" }],\n * validUntil: Math.floor(Date.now() / 1000) + 900,\n * });\n */\nexport function buildKernelSessionPolicies(p: {\n calls: readonly KernelSessionCall[];\n validUntil: number;\n validAfter?: number;\n}): Policy[] {\n assertCalls(p.calls);\n return [\n toCallPolicy({\n policyVersion: CallPolicyVersion.V0_0_4,\n permissions: p.calls.map((c) => ({\n target: c.target,\n valueLimit: c.valueLimit ?? 0n,\n abi: [findFunction(c)] as Abi,\n functionName: c.functionName,\n })),\n } as Parameters<typeof toCallPolicy>[0]),\n toTimestampPolicy({ validAfter: p.validAfter ?? 0, validUntil: p.validUntil }),\n ];\n}\n\n/**\n * A fresh random session key. SERVER ONLY: the private key must never reach\n * the browser. Only the address is sent to the owner for approval.\n *\n * @example\n * const { privateKey, address } = generateSessionKey();\n */\nexport function generateSessionKey(): { privateKey: Hex; address: Address } {\n const privateKey = generatePrivateKey();\n return { privateKey, address: privateKeyToAccount(privateKey).address };\n}\n\nfunction permissionFor(publicClient: PublicClient, sessionKeyAddress: Address, policies: Policy[]) {\n return toPermissionValidator(zd(publicClient), {\n entryPoint: ENTRY_POINT_V07,\n kernelVersion: KERNEL_VERSION,\n signer: toEmptyECDSASigner(sessionKeyAddress),\n policies,\n });\n}\n\n/**\n * The permission id the chain derives for this session key plus these\n * policies. The server compares it with a browser-supplied approval.\n *\n * @example\n * const permissionId = await expectedPermissionId({ publicClient, sessionKeyAddress, policies });\n */\nexport async function expectedPermissionId(p: {\n publicClient: PublicClient;\n sessionKeyAddress: Address;\n policies: Policy[];\n}): Promise<string> {\n const permission = await permissionFor(p.publicClient, p.sessionKeyAddress, p.policies);\n const { permissionId } = permission.getPluginSerializationParams();\n if (!permissionId) throw new Error(\"Could not derive the permission id.\");\n return permissionId;\n}\n\n/**\n * In the user's browser: the owner (the Privy embedded wallet, the only thing\n * that can authorize a session) signs ONE EIP-712 message that enables a\n * permission validator on their Kernel account. That signature is the whole\n * grant. It names the session key's public address (never its private key)\n * and the policies. The returned `approval` holds no secret: it is the enable\n * signature plus the policy parameters, useless without the session key.\n *\n * @example\n * const { approval, kernelAddress } = await approveKernelSession({\n * publicClient, owner: walletClient, sessionKeyAddress, policies,\n * });\n */\nexport async function approveKernelSession(p: {\n publicClient: PublicClient;\n owner: KernelOwner;\n sessionKeyAddress: Address;\n policies: Policy[];\n}): Promise<{ approval: string; kernelAddress: Address }> {\n const regular = await permissionFor(p.publicClient, p.sessionKeyAddress, p.policies);\n const account = await toPepuKernelAccount({\n publicClient: p.publicClient,\n owner: p.owner,\n plugins: { regular },\n });\n const approval = await serializePermissionAccount(account as never);\n return { approval, kernelAddress: account.address };\n}\n\n/**\n * On the server: rebuild the session's Kernel account from the approval and\n * the server-held session key (an ECDSA signer for that key). No owner\n * signature is involved. Pass the result to `createPepuSponsoredClient`.\n *\n * @example\n * const account = await loadKernelSessionAccount({ publicClient, approval, sessionPrivateKey });\n */\nexport async function loadKernelSessionAccount(p: {\n publicClient: PublicClient;\n approval: string;\n sessionPrivateKey: Hex;\n}): Promise<KernelSmartAccount> {\n const sessionSigner = await toECDSASigner({ signer: privateKeyToAccount(p.sessionPrivateKey) });\n const account = await deserializePermissionAccount(\n zd(p.publicClient),\n ENTRY_POINT_V07,\n KERNEL_VERSION,\n p.approval,\n sessionSigner,\n );\n return account as unknown as KernelSmartAccount;\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { getContract } from './chunk-FCXSP2YF.js';
2
+ import { pepuMainnet } from './chunk-VTQIHMF3.js';
3
+ import { toHex } from 'viem';
4
+
5
+ function buildPaymasterContext(entries = {}) {
6
+ const context = {};
7
+ for (const [key, value] of Object.entries(entries)) {
8
+ if (value === void 0) continue;
9
+ const kind = typeof value;
10
+ if (kind === "bigint" || kind === "function" || kind === "symbol") {
11
+ throw new Error(
12
+ `buildPaymasterContext: "${key}" is a ${kind}, which is not JSON-serializable. Convert it to a string or number first.`
13
+ );
14
+ }
15
+ context[key] = value;
16
+ }
17
+ return context;
18
+ }
19
+ function buildParams(options) {
20
+ const entryPointEntry = getContract(pepuMainnet.id, "entryPoint07");
21
+ const entryPoint = options.entryPoint ?? (entryPointEntry?.status === "deployed" ? entryPointEntry.address : void 0);
22
+ if (!entryPoint) throw new Error("buildPaymasterRequest: no EntryPoint v0.7 address available.");
23
+ const chainId = toHex(options.chainId ?? pepuMainnet.id);
24
+ return options.context ? [options.userOperation, entryPoint, chainId, options.context] : [options.userOperation, entryPoint, chainId];
25
+ }
26
+ function buildPaymasterStubDataRequest(options) {
27
+ return {
28
+ jsonrpc: "2.0",
29
+ id: options.id ?? 1,
30
+ method: "pm_getPaymasterStubData",
31
+ params: buildParams(options)
32
+ };
33
+ }
34
+ function buildPaymasterDataRequest(options) {
35
+ return {
36
+ jsonrpc: "2.0",
37
+ id: options.id ?? 1,
38
+ method: "pm_getPaymasterData",
39
+ params: buildParams(options)
40
+ };
41
+ }
42
+
43
+ export { buildPaymasterContext, buildPaymasterDataRequest, buildPaymasterStubDataRequest };
44
+ //# sourceMappingURL=chunk-MBA4CLA5.js.map
45
+ //# sourceMappingURL=chunk-MBA4CLA5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/erc7677.ts"],"names":[],"mappings":";;;;AAkGO,SAAS,qBAAA,CACd,OAAA,GAA6C,EAAC,EAC5B;AAClB,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,OAAO,OAAO,KAAA;AACpB,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,UAAA,IAAc,SAAS,QAAA,EAAU;AACjE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,GAAG,CAAA,OAAA,EAAU,IAAI,CAAA,yEAAA;AAAA,OAC9C;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EACjB;AACA,EAAA,OAAO,OAAA;AACT;AAYA,SAAS,YAAY,OAAA,EAA2D;AAC9E,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,WAAA,CAAY,EAAA,EAAI,cAAc,CAAA;AAClE,EAAA,MAAM,aACJ,OAAA,CAAQ,UAAA,KACP,iBAAiB,MAAA,KAAW,UAAA,GAAa,gBAAgB,OAAA,GAAU,MAAA,CAAA;AACtE,EAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAC/F,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,IAAW,YAAY,EAAE,CAAA;AACvD,EAAA,OAAO,OAAA,CAAQ,OAAA,GACX,CAAC,OAAA,CAAQ,eAAe,UAAA,EAAY,OAAA,EAAS,OAAA,CAAQ,OAAO,CAAA,GAC5D,CAAC,OAAA,CAAQ,aAAA,EAAe,YAAY,OAAO,CAAA;AACjD;AAGO,SAAS,8BACd,OAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,EAAA,EAAI,QAAQ,EAAA,IAAM,CAAA;AAAA,IAClB,MAAA,EAAQ,yBAAA;AAAA,IACR,MAAA,EAAQ,YAAY,OAAO;AAAA,GAC7B;AACF;AAGO,SAAS,0BACd,OAAA,EACsB;AACtB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,EAAA,EAAI,QAAQ,EAAA,IAAM,CAAA;AAAA,IAClB,MAAA,EAAQ,qBAAA;AAAA,IACR,MAAA,EAAQ,YAAY,OAAO;AAAA,GAC7B;AACF","file":"chunk-MBA4CLA5.js","sourcesContent":["import { toHex } from \"viem\";\nimport type { Address, Hex } from \"viem\";\n\nimport { pepuMainnet } from \"./chains.js\";\nimport { getContract } from \"./contracts.js\";\n\n/**\n * ERC-7677 paymaster web-service types, for the two JSON-RPC methods PEPU's\n * paymaster policy service implements: `pm_getPaymasterStubData` and\n * `pm_getPaymasterData`. See https://eips.ethereum.org/EIPS/eip-7677.\n *\n * Pure types plus a few tiny builders: no network, no secrets, safe in a\n * browser bundle. Quantities are `0x`-prefixed hex strings, as on the wire.\n *\n * Note this package never implies sponsorship is available to an app: see\n * `getSponsorshipStatus()`. These types describe the protocol only.\n */\n\n/** An ERC-4337 v0.7 UserOperation in its unpacked JSON-RPC shape. */\nexport interface Erc7677UserOperation {\n sender: Address;\n nonce: Hex;\n factory?: Address;\n factoryData?: Hex;\n callData: Hex;\n callGasLimit: Hex;\n verificationGasLimit: Hex;\n preVerificationGas: Hex;\n maxFeePerGas: Hex;\n maxPriorityFeePerGas: Hex;\n paymaster?: Address;\n paymasterVerificationGasLimit?: Hex;\n paymasterPostOpGasLimit?: Hex;\n paymasterData?: Hex;\n signature: Hex;\n}\n\n/** Paymaster-defined, JSON-serializable context (params[3]). */\nexport type PaymasterContext = Record<string, unknown>;\n\nexport type PaymasterRpcParams = readonly [\n userOperation: Partial<Erc7677UserOperation> & Pick<Erc7677UserOperation, \"sender\" | \"callData\">,\n entryPoint: Address,\n chainId: Hex,\n context?: PaymasterContext,\n];\n\nexport interface PaymasterStubDataRequest {\n jsonrpc: \"2.0\";\n id: number | string;\n method: \"pm_getPaymasterStubData\";\n params: PaymasterRpcParams;\n}\n\nexport interface PaymasterDataRequest {\n jsonrpc: \"2.0\";\n id: number | string;\n method: \"pm_getPaymasterData\";\n params: PaymasterRpcParams;\n}\n\n/** Result of `pm_getPaymasterStubData`. Stub values are for gas estimation only. */\nexport interface PaymasterStubDataResult {\n paymaster: Address;\n paymasterData: Hex;\n paymasterVerificationGasLimit?: Hex;\n paymasterPostOpGasLimit?: Hex;\n /** `true` when the stub values are also the final values. */\n isFinal?: boolean;\n sponsor?: { name: string; icon?: string };\n}\n\n/** Result of `pm_getPaymasterData`: the signed values to submit. */\nexport interface PaymasterDataResult {\n paymaster: Address;\n paymasterData: Hex;\n paymasterVerificationGasLimit?: Hex;\n paymasterPostOpGasLimit?: Hex;\n}\n\nexport interface PaymasterRpcError {\n code: number;\n message: string;\n /** PEPU's policy service puts the machine-readable denial reason in `data.reason`. */\n data?: { reason?: string } & Record<string, unknown>;\n}\n\nexport type PaymasterRpcResponse<TResult> =\n | { jsonrpc: \"2.0\"; id: number | string | null; result: TResult }\n | { jsonrpc: \"2.0\"; id: number | string | null; error: PaymasterRpcError };\n\n/**\n * Build a paymaster `context` object: drops `undefined` entries and throws on\n * anything that would not survive `JSON.stringify` (bigint, function, symbol),\n * so a bad value fails here instead of as an opaque RPC error. Returns `{}`\n * for no input. The context is paymaster-defined; PEPU's policy service\n * currently accepts and ignores it.\n */\nexport function buildPaymasterContext(\n entries: Readonly<Record<string, unknown>> = {},\n): PaymasterContext {\n const context: PaymasterContext = {};\n for (const [key, value] of Object.entries(entries)) {\n if (value === undefined) continue;\n const kind = typeof value;\n if (kind === \"bigint\" || kind === \"function\" || kind === \"symbol\") {\n throw new Error(\n `buildPaymasterContext: \"${key}\" is a ${kind}, which is not JSON-serializable. Convert it to a string or number first.`,\n );\n }\n context[key] = value;\n }\n return context;\n}\n\nexport interface BuildPaymasterRequestOptions {\n userOperation: PaymasterRpcParams[0];\n /** Defaults to PEPU mainnet's EntryPoint v0.7. */\n entryPoint?: Address;\n /** Defaults to 97741 (PEPU mainnet). */\n chainId?: number;\n context?: PaymasterContext;\n id?: number | string;\n}\n\nfunction buildParams(options: BuildPaymasterRequestOptions): PaymasterRpcParams {\n const entryPointEntry = getContract(pepuMainnet.id, \"entryPoint07\");\n const entryPoint =\n options.entryPoint ??\n (entryPointEntry?.status === \"deployed\" ? entryPointEntry.address : undefined);\n if (!entryPoint) throw new Error(\"buildPaymasterRequest: no EntryPoint v0.7 address available.\");\n const chainId = toHex(options.chainId ?? pepuMainnet.id);\n return options.context\n ? [options.userOperation, entryPoint, chainId, options.context]\n : [options.userOperation, entryPoint, chainId];\n}\n\n/** Build a `pm_getPaymasterStubData` JSON-RPC request body. */\nexport function buildPaymasterStubDataRequest(\n options: BuildPaymasterRequestOptions,\n): PaymasterStubDataRequest {\n return {\n jsonrpc: \"2.0\",\n id: options.id ?? 1,\n method: \"pm_getPaymasterStubData\",\n params: buildParams(options),\n };\n}\n\n/** Build a `pm_getPaymasterData` JSON-RPC request body. */\nexport function buildPaymasterDataRequest(\n options: BuildPaymasterRequestOptions,\n): PaymasterDataRequest {\n return {\n jsonrpc: \"2.0\",\n id: options.id ?? 1,\n method: \"pm_getPaymasterData\",\n params: buildParams(options),\n };\n}\n"]}
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var chunkDPCZJLB3_cjs = require('./chunk-DPCZJLB3.cjs');
4
+
5
+ // src/privy/config.ts
6
+ function createPepuPrivyConfig(options = {}) {
7
+ const chain = options.chain ?? chunkDPCZJLB3_cjs.pepuMainnet;
8
+ return {
9
+ ...options.loginMethods ? { loginMethods: options.loginMethods } : {},
10
+ ...options.appearance ? { appearance: options.appearance } : {},
11
+ defaultChain: chain,
12
+ supportedChains: [chain],
13
+ embeddedWallets: {
14
+ ethereum: { createOnLogin: options.createOnLogin ?? "off" }
15
+ },
16
+ externalWallets: {
17
+ coinbaseWallet: { config: { preference: { options: "eoaOnly" } } }
18
+ }
19
+ };
20
+ }
21
+
22
+ exports.createPepuPrivyConfig = createPepuPrivyConfig;
23
+ //# sourceMappingURL=chunk-NE3QKDOB.cjs.map
24
+ //# sourceMappingURL=chunk-NE3QKDOB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/privy/config.ts"],"names":["pepuMainnet"],"mappings":";;;;;AAwDO,SAAS,qBAAA,CACd,OAAA,GAAwC,EAAC,EAClB;AACvB,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAASA,6BAAA;AAC/B,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB,EAAC;AAAA,IACrE,GAAI,QAAQ,UAAA,GAAa,EAAE,YAAY,OAAA,CAAQ,UAAA,KAAe,EAAC;AAAA,IAC/D,YAAA,EAAc,KAAA;AAAA,IACd,eAAA,EAAiB,CAAC,KAAK,CAAA;AAAA,IACvB,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,EAAE,aAAA,EAAe,OAAA,CAAQ,iBAAiB,KAAA;AAAM,KAC5D;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,cAAA,EAAgB,EAAE,MAAA,EAAQ,EAAE,YAAY,EAAE,OAAA,EAAS,SAAA,EAAU,EAAE;AAAE;AACnE,GACF;AACF","file":"chunk-NE3QKDOB.cjs","sourcesContent":["import { pepuMainnet } from \"../chains.js\";\nimport type { PepuChain } from \"../chains.js\";\n\n/**\n * Typed Privy client config for PEPU (`@pepu-chain/sdk/privy`). Client-safe:\n * no secrets, no Node APIs, and no dependency on any Privy package (the result\n * is structurally assignable to `PrivyClientConfig` from\n * `@privy-io/react-auth`).\n *\n * What it encodes, each a real, reproduced PEPU requirement:\n *\n * - `defaultChain` / `supportedChains` are PEPU mainnet only.\n * - `embeddedWallets.ethereum.createOnLogin` defaults to `\"off\"`: the\n * recommended pattern is to provision the wallet server-side (see the\n * wallet-provisioning recipe). NOTE the Privy Dashboard's setting wins over\n * this value at runtime; it is kept for intent and documentation.\n * - Coinbase Wallet is pinned to `eoaOnly`: Coinbase Smart Wallet does not\n * support chain 97741, and the default floods the console with \"The\n * configured chains are not supported by Coinbase Smart Wallet\".\n */\n\nexport type PrivyLoginMethod =\n | \"email\"\n | \"google\"\n | \"wallet\"\n | \"sms\"\n | \"apple\"\n | \"twitter\"\n | \"discord\"\n | \"github\";\n\nexport type EmbeddedWalletCreateOnLogin = \"off\" | \"users-without-wallets\" | \"all-users\";\n\nexport interface PepuPrivyClientConfig {\n loginMethods?: PrivyLoginMethod[];\n appearance?: { theme?: \"light\" | \"dark\" | `#${string}`; accentColor?: `#${string}`; logo?: string };\n defaultChain: PepuChain;\n supportedChains: PepuChain[];\n embeddedWallets: {\n ethereum: { createOnLogin: EmbeddedWalletCreateOnLogin };\n };\n externalWallets: {\n coinbaseWallet: { config: { preference: { options: \"eoaOnly\" } } };\n };\n}\n\nexport interface CreatePepuPrivyConfigOptions {\n loginMethods?: PrivyLoginMethod[];\n appearance?: PepuPrivyClientConfig[\"appearance\"];\n /** Default `\"off\"`. The Privy Dashboard setting overrides this at runtime. */\n createOnLogin?: EmbeddedWalletCreateOnLogin;\n /** Default {@link pepuMainnet}. Only pass a different PEPU chain deliberately. */\n chain?: PepuChain;\n}\n\n/** Build the `config` prop for Privy's `<PrivyProvider>` on PEPU. */\nexport function createPepuPrivyConfig(\n options: CreatePepuPrivyConfigOptions = {},\n): PepuPrivyClientConfig {\n const chain = options.chain ?? pepuMainnet;\n return {\n ...(options.loginMethods ? { loginMethods: options.loginMethods } : {}),\n ...(options.appearance ? { appearance: options.appearance } : {}),\n defaultChain: chain,\n supportedChains: [chain],\n embeddedWallets: {\n ethereum: { createOnLogin: options.createOnLogin ?? \"off\" },\n },\n externalWallets: {\n coinbaseWallet: { config: { preference: { options: \"eoaOnly\" } } },\n },\n };\n}\n\nexport * from \"./requirements.js\";\n"]}