@pepu-chain/sdk 0.0.0-stage → 0.2.1

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 (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +590 -2
  3. package/dist/aa/kernel.cjs +41 -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.guard.js +15 -0
  8. package/dist/aa/kernel.js +11 -0
  9. package/dist/aa/kernel.js.map +1 -0
  10. package/dist/aa/react-direct.cjs +111 -0
  11. package/dist/aa/react-direct.cjs.map +1 -0
  12. package/dist/aa/react-direct.d.cts +42 -0
  13. package/dist/aa/react-direct.d.ts +42 -0
  14. package/dist/aa/react-direct.guard.js +15 -0
  15. package/dist/aa/react-direct.js +107 -0
  16. package/dist/aa/react-direct.js.map +1 -0
  17. package/dist/aa/react.cjs +152 -0
  18. package/dist/aa/react.cjs.map +1 -0
  19. package/dist/aa/react.d.cts +62 -0
  20. package/dist/aa/react.d.ts +62 -0
  21. package/dist/aa/react.guard.js +15 -0
  22. package/dist/aa/react.js +147 -0
  23. package/dist/aa/react.js.map +1 -0
  24. package/dist/aa.cjs +84 -0
  25. package/dist/aa.cjs.map +1 -0
  26. package/dist/aa.d.cts +85 -0
  27. package/dist/aa.d.ts +85 -0
  28. package/dist/aa.js +11 -0
  29. package/dist/aa.js.map +1 -0
  30. package/dist/api-Dz4sCHH_.d.cts +654 -0
  31. package/dist/api-Dz4sCHH_.d.ts +654 -0
  32. package/dist/calls-BRPjKgjl.d.cts +70 -0
  33. package/dist/calls-z_EQOtFb.d.ts +70 -0
  34. package/dist/chains-DK13zGIp.d.cts +235 -0
  35. package/dist/chains-DK13zGIp.d.ts +235 -0
  36. package/dist/chunk-3XUGQODR.js +194 -0
  37. package/dist/chunk-3XUGQODR.js.map +1 -0
  38. package/dist/chunk-45KSZH26.cjs +145 -0
  39. package/dist/chunk-45KSZH26.cjs.map +1 -0
  40. package/dist/chunk-4GINFJO6.cjs +44 -0
  41. package/dist/chunk-4GINFJO6.cjs.map +1 -0
  42. package/dist/chunk-62M2LKQW.js +136 -0
  43. package/dist/chunk-62M2LKQW.js.map +1 -0
  44. package/dist/chunk-6DSZ4Z2N.js +498 -0
  45. package/dist/chunk-6DSZ4Z2N.js.map +1 -0
  46. package/dist/chunk-7MNJF2OB.cjs +72 -0
  47. package/dist/chunk-7MNJF2OB.cjs.map +1 -0
  48. package/dist/chunk-7PVR7QSE.js +45 -0
  49. package/dist/chunk-7PVR7QSE.js.map +1 -0
  50. package/dist/chunk-A5LP2UCS.cjs +2729 -0
  51. package/dist/chunk-A5LP2UCS.cjs.map +1 -0
  52. package/dist/chunk-AJS4UFQX.cjs +121 -0
  53. package/dist/chunk-AJS4UFQX.cjs.map +1 -0
  54. package/dist/chunk-BGALSKAF.cjs +315 -0
  55. package/dist/chunk-BGALSKAF.cjs.map +1 -0
  56. package/dist/chunk-C2XW44FI.cjs +200 -0
  57. package/dist/chunk-C2XW44FI.cjs.map +1 -0
  58. package/dist/chunk-C7IC36XS.cjs +13 -0
  59. package/dist/chunk-C7IC36XS.cjs.map +1 -0
  60. package/dist/chunk-D52PADVY.js +84 -0
  61. package/dist/chunk-D52PADVY.js.map +1 -0
  62. package/dist/chunk-DH6BFNVJ.cjs +272 -0
  63. package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
  64. package/dist/chunk-DPCZJLB3.cjs +87 -0
  65. package/dist/chunk-DPCZJLB3.cjs.map +1 -0
  66. package/dist/chunk-EHBPIYY4.js +262 -0
  67. package/dist/chunk-EHBPIYY4.js.map +1 -0
  68. package/dist/chunk-ESMNAXUI.js +86 -0
  69. package/dist/chunk-ESMNAXUI.js.map +1 -0
  70. package/dist/chunk-F2R473FR.js +304 -0
  71. package/dist/chunk-F2R473FR.js.map +1 -0
  72. package/dist/chunk-IB2FSPMJ.js +66 -0
  73. package/dist/chunk-IB2FSPMJ.js.map +1 -0
  74. package/dist/chunk-IG7RSL2Y.cjs +178 -0
  75. package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
  76. package/dist/chunk-IY3ALPUJ.js +2716 -0
  77. package/dist/chunk-IY3ALPUJ.js.map +1 -0
  78. package/dist/chunk-J3O2ZGG3.cjs +93 -0
  79. package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
  80. package/dist/chunk-J6UXXHBE.js +37 -0
  81. package/dist/chunk-J6UXXHBE.js.map +1 -0
  82. package/dist/chunk-JLZ4LZ4Z.js +22 -0
  83. package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
  84. package/dist/chunk-K7JSQPZO.cjs +231 -0
  85. package/dist/chunk-K7JSQPZO.cjs.map +1 -0
  86. package/dist/chunk-KJYNF5KH.js +224 -0
  87. package/dist/chunk-KJYNF5KH.js.map +1 -0
  88. package/dist/chunk-KVG3AYYR.js +99 -0
  89. package/dist/chunk-KVG3AYYR.js.map +1 -0
  90. package/dist/chunk-NE3QKDOB.cjs +24 -0
  91. package/dist/chunk-NE3QKDOB.cjs.map +1 -0
  92. package/dist/chunk-NVOPDXTA.cjs +95 -0
  93. package/dist/chunk-NVOPDXTA.cjs.map +1 -0
  94. package/dist/chunk-OH3QMAIB.js +11 -0
  95. package/dist/chunk-OH3QMAIB.js.map +1 -0
  96. package/dist/chunk-PHM3ZORG.cjs +110 -0
  97. package/dist/chunk-PHM3ZORG.cjs.map +1 -0
  98. package/dist/chunk-R5PXQNO3.cjs +209 -0
  99. package/dist/chunk-R5PXQNO3.cjs.map +1 -0
  100. package/dist/chunk-RCMKPJZO.cjs +49 -0
  101. package/dist/chunk-RCMKPJZO.cjs.map +1 -0
  102. package/dist/chunk-SVWRRALU.cjs +17 -0
  103. package/dist/chunk-SVWRRALU.cjs.map +1 -0
  104. package/dist/chunk-T43PQXJD.js +202 -0
  105. package/dist/chunk-T43PQXJD.js.map +1 -0
  106. package/dist/chunk-VBH3JLQ5.js +116 -0
  107. package/dist/chunk-VBH3JLQ5.js.map +1 -0
  108. package/dist/chunk-VF3D6KLQ.cjs +94 -0
  109. package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
  110. package/dist/chunk-VTQIHMF3.js +82 -0
  111. package/dist/chunk-VTQIHMF3.js.map +1 -0
  112. package/dist/chunk-W3JN3YIW.js +15 -0
  113. package/dist/chunk-W3JN3YIW.js.map +1 -0
  114. package/dist/chunk-WANILJZQ.cjs +87 -0
  115. package/dist/chunk-WANILJZQ.cjs.map +1 -0
  116. package/dist/chunk-XC4IBCI2.js +86 -0
  117. package/dist/chunk-XC4IBCI2.js.map +1 -0
  118. package/dist/chunk-YKEWWQEJ.js +165 -0
  119. package/dist/chunk-YKEWWQEJ.js.map +1 -0
  120. package/dist/chunk-YQL7NISX.cjs +515 -0
  121. package/dist/chunk-YQL7NISX.cjs.map +1 -0
  122. package/dist/chunk-ZB6SVBK4.js +89 -0
  123. package/dist/chunk-ZB6SVBK4.js.map +1 -0
  124. package/dist/combo/react.cjs +236 -0
  125. package/dist/combo/react.cjs.map +1 -0
  126. package/dist/combo/react.d.cts +148 -0
  127. package/dist/combo/react.d.ts +148 -0
  128. package/dist/combo/react.guard.js +15 -0
  129. package/dist/combo/react.js +230 -0
  130. package/dist/combo/react.js.map +1 -0
  131. package/dist/combo.cjs +263 -0
  132. package/dist/combo.cjs.map +1 -0
  133. package/dist/combo.d.cts +139 -0
  134. package/dist/combo.d.ts +139 -0
  135. package/dist/combo.guard.js +15 -0
  136. package/dist/combo.js +249 -0
  137. package/dist/combo.js.map +1 -0
  138. package/dist/config-CHjz7ZjZ.d.cts +57 -0
  139. package/dist/config-COjhIZTh.d.ts +57 -0
  140. package/dist/doctor.cjs +354 -0
  141. package/dist/doctor.cjs.map +1 -0
  142. package/dist/doctor.d.cts +177 -0
  143. package/dist/doctor.d.ts +177 -0
  144. package/dist/doctor.js +345 -0
  145. package/dist/doctor.js.map +1 -0
  146. package/dist/erc7677-DOW58QBE.d.cts +111 -0
  147. package/dist/erc7677-DOW58QBE.d.ts +111 -0
  148. package/dist/errors-CgX1vNj7.d.cts +100 -0
  149. package/dist/errors-CgX1vNj7.d.ts +100 -0
  150. package/dist/index.cjs +806 -0
  151. package/dist/index.cjs.map +1 -0
  152. package/dist/index.d.cts +2398 -0
  153. package/dist/index.d.ts +2398 -0
  154. package/dist/index.js +559 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/paymaster/server.cjs +38 -0
  157. package/dist/paymaster/server.cjs.map +1 -0
  158. package/dist/paymaster/server.d.cts +57 -0
  159. package/dist/paymaster/server.d.ts +57 -0
  160. package/dist/paymaster/server.js +36 -0
  161. package/dist/paymaster/server.js.map +1 -0
  162. package/dist/paymaster.cjs +356 -0
  163. package/dist/paymaster.cjs.map +1 -0
  164. package/dist/paymaster.d.cts +1851 -0
  165. package/dist/paymaster.d.ts +1851 -0
  166. package/dist/paymaster.js +289 -0
  167. package/dist/paymaster.js.map +1 -0
  168. package/dist/privy/react.cjs +49 -0
  169. package/dist/privy/react.cjs.map +1 -0
  170. package/dist/privy/react.d.cts +194 -0
  171. package/dist/privy/react.d.ts +194 -0
  172. package/dist/privy/react.guard.js +15 -0
  173. package/dist/privy/react.js +7 -0
  174. package/dist/privy/react.js.map +1 -0
  175. package/dist/privy/server.cjs +44 -0
  176. package/dist/privy/server.cjs.map +1 -0
  177. package/dist/privy/server.d.cts +192 -0
  178. package/dist/privy/server.d.ts +192 -0
  179. package/dist/privy/server.guard.js +15 -0
  180. package/dist/privy/server.js +6 -0
  181. package/dist/privy/server.js.map +1 -0
  182. package/dist/privy/wagmi.d.ts +90 -0
  183. package/dist/privy/wagmi.guard.js +15 -0
  184. package/dist/privy/wagmi.js +55 -0
  185. package/dist/privy/wagmi.js.map +1 -0
  186. package/dist/privy.cjs +34 -0
  187. package/dist/privy.cjs.map +1 -0
  188. package/dist/privy.d.cts +4 -0
  189. package/dist/privy.d.ts +4 -0
  190. package/dist/privy.js +5 -0
  191. package/dist/privy.js.map +1 -0
  192. package/dist/react.cjs +73 -0
  193. package/dist/react.cjs.map +1 -0
  194. package/dist/react.d.cts +66 -0
  195. package/dist/react.d.ts +66 -0
  196. package/dist/react.guard.js +15 -0
  197. package/dist/react.js +68 -0
  198. package/dist/react.js.map +1 -0
  199. package/dist/requirements-C-QiJkL9.d.cts +134 -0
  200. package/dist/requirements-C-QiJkL9.d.ts +134 -0
  201. package/dist/scope-DBRkN7bR.d.cts +94 -0
  202. package/dist/scope-DBRkN7bR.d.ts +94 -0
  203. package/dist/server.cjs +59 -0
  204. package/dist/server.cjs.map +1 -0
  205. package/dist/server.d.cts +208 -0
  206. package/dist/server.d.ts +208 -0
  207. package/dist/server.js +8 -0
  208. package/dist/server.js.map +1 -0
  209. package/dist/session/kernel.cjs +83 -0
  210. package/dist/session/kernel.cjs.map +1 -0
  211. package/dist/session/kernel.d.cts +131 -0
  212. package/dist/session/kernel.d.ts +131 -0
  213. package/dist/session/kernel.guard.js +15 -0
  214. package/dist/session/kernel.js +13 -0
  215. package/dist/session/kernel.js.map +1 -0
  216. package/dist/session/react.cjs +38 -0
  217. package/dist/session/react.cjs.map +1 -0
  218. package/dist/session/react.d.cts +119 -0
  219. package/dist/session/react.d.ts +119 -0
  220. package/dist/session/react.guard.js +15 -0
  221. package/dist/session/react.js +8 -0
  222. package/dist/session/react.js.map +1 -0
  223. package/dist/session/server.cjs +268 -0
  224. package/dist/session/server.cjs.map +1 -0
  225. package/dist/session/server.d.cts +151 -0
  226. package/dist/session/server.d.ts +151 -0
  227. package/dist/session/server.guard.js +15 -0
  228. package/dist/session/server.js +252 -0
  229. package/dist/session/server.js.map +1 -0
  230. package/dist/session.cjs +74 -0
  231. package/dist/session.cjs.map +1 -0
  232. package/dist/session.d.cts +3 -0
  233. package/dist/session.d.ts +3 -0
  234. package/dist/session.js +5 -0
  235. package/dist/session.js.map +1 -0
  236. package/dist/status-Dx9zAFo9.d.ts +327 -0
  237. package/dist/status-wgTM26V7.d.cts +327 -0
  238. package/dist/store-CjmLgp9g.d.cts +64 -0
  239. package/dist/store-CjmLgp9g.d.ts +64 -0
  240. package/dist/types-BEEM7WdG.d.cts +25 -0
  241. package/dist/types-BEEM7WdG.d.ts +25 -0
  242. package/dist/types-BilBTDqK.d.cts +27 -0
  243. package/dist/types-BilBTDqK.d.ts +27 -0
  244. package/package.json +245 -3
@@ -0,0 +1,116 @@
1
+ import { PepuPolicyError } from './chunk-6DSZ4Z2N.js';
2
+ import { pad, encodeFunctionData, parseEventLogs, encodePacked, encodeAbiParameters } from 'viem';
3
+ import { entryPoint07Abi } from 'viem/account-abstraction';
4
+
5
+ function normalizeCalls(calls) {
6
+ if (calls.length === 0) {
7
+ throw new PepuPolicyError("POLICY_UNSCOPED", "A sponsored send needs at least one call.", {
8
+ hint: "Pass calls: [{ to, data }] or [{ to, abi, functionName, args }]."
9
+ });
10
+ }
11
+ return calls.map((c, i) => {
12
+ if (c.data !== void 0 && c.functionName !== void 0) {
13
+ throw new PepuPolicyError("POLICY_UNSCOPED", `Call ${i} sets both data and functionName.`, {
14
+ hint: "Use either raw data or abi plus functionName, not both."
15
+ });
16
+ }
17
+ let data = c.data ?? "0x";
18
+ if (c.functionName !== void 0) {
19
+ if (!c.abi) {
20
+ throw new PepuPolicyError("POLICY_UNSCOPED", `Call ${i} has functionName but no abi.`, {
21
+ hint: "Pass the contract abi alongside functionName."
22
+ });
23
+ }
24
+ data = encodeFunctionData({
25
+ abi: c.abi,
26
+ functionName: c.functionName,
27
+ ...c.args ? { args: c.args } : {}
28
+ });
29
+ }
30
+ return { to: c.to, value: c.value ?? 0n, data };
31
+ });
32
+ }
33
+ function userOpEventFromReceipt(receipt, sender) {
34
+ const events = parseEventLogs({
35
+ abi: entryPoint07Abi,
36
+ eventName: "UserOperationEvent",
37
+ logs: receipt.logs,
38
+ strict: false
39
+ });
40
+ const ev = events.find((e) => e.args.sender?.toLowerCase() === sender.toLowerCase());
41
+ if (!ev || ev.args.userOpHash === void 0) return null;
42
+ const pm = ev.args.paymaster;
43
+ const zero = "0x0000000000000000000000000000000000000000";
44
+ return {
45
+ userOpHash: ev.args.userOpHash,
46
+ paymaster: pm && pm.toLowerCase() !== zero ? pm : null,
47
+ actualGasCost: ev.args.actualGasCost ?? 0n,
48
+ success: ev.args.success ?? false
49
+ };
50
+ }
51
+ function userOpEventsFromReceipt(receipt) {
52
+ const zero = "0x0000000000000000000000000000000000000000";
53
+ const out = [];
54
+ for (const ev of parseEventLogs({
55
+ abi: entryPoint07Abi,
56
+ eventName: "UserOperationEvent",
57
+ logs: receipt.logs,
58
+ strict: false
59
+ })) {
60
+ const a = ev.args;
61
+ if (a.sender === void 0 || a.userOpHash === void 0) continue;
62
+ out.push({
63
+ sender: a.sender,
64
+ userOpHash: a.userOpHash,
65
+ nonce: a.nonce ?? 0n,
66
+ paymaster: a.paymaster && a.paymaster.toLowerCase() !== zero ? a.paymaster : null,
67
+ actualGasCost: a.actualGasCost ?? 0n,
68
+ actualGasUsed: a.actualGasUsed ?? 0n,
69
+ success: a.success ?? false
70
+ });
71
+ }
72
+ return out;
73
+ }
74
+ var KERNEL_EXECUTE_ABI = [
75
+ {
76
+ type: "function",
77
+ name: "execute",
78
+ stateMutability: "payable",
79
+ inputs: [
80
+ { name: "execMode", type: "bytes32" },
81
+ { name: "executionCalldata", type: "bytes" }
82
+ ],
83
+ outputs: []
84
+ }
85
+ ];
86
+ var EXEC_MODE_SINGLE = pad("0x00", { size: 32, dir: "right" });
87
+ var EXEC_MODE_BATCH = pad("0x01", { size: 32, dir: "right" });
88
+ function encodeKernelExecute(calls) {
89
+ const encoded = normalizeCalls(calls);
90
+ if (encoded.length === 1 && encoded[0]) {
91
+ const c = encoded[0];
92
+ return encodeFunctionData({
93
+ abi: KERNEL_EXECUTE_ABI,
94
+ functionName: "execute",
95
+ args: [EXEC_MODE_SINGLE, encodePacked(["address", "uint256", "bytes"], [c.to, c.value, c.data])]
96
+ });
97
+ }
98
+ const batch = encodeAbiParameters(
99
+ [
100
+ {
101
+ type: "tuple[]",
102
+ components: [
103
+ { name: "target", type: "address" },
104
+ { name: "value", type: "uint256" },
105
+ { name: "callData", type: "bytes" }
106
+ ]
107
+ }
108
+ ],
109
+ [encoded.map((c) => ({ target: c.to, value: c.value, callData: c.data }))]
110
+ );
111
+ return encodeFunctionData({ abi: KERNEL_EXECUTE_ABI, functionName: "execute", args: [EXEC_MODE_BATCH, batch] });
112
+ }
113
+
114
+ export { encodeKernelExecute, normalizeCalls, userOpEventFromReceipt, userOpEventsFromReceipt };
115
+ //# sourceMappingURL=chunk-VBH3JLQ5.js.map
116
+ //# sourceMappingURL=chunk-VBH3JLQ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/aa/calls.ts"],"names":[],"mappings":"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","file":"chunk-VBH3JLQ5.js","sourcesContent":["import { encodeAbiParameters, encodeFunctionData, encodePacked, pad, parseEventLogs } from \"viem\";\nimport type { Abi } from \"viem\";\nimport type { Address, Hex, TransactionReceipt } from \"viem\";\nimport { entryPoint07Abi } from \"viem/account-abstraction\";\n\nimport { PepuPolicyError } from \"../errors.js\";\nimport type { Call } from \"./types.js\";\n\n/** A call in the exact `{ to, value, data }` shape smart-account clients take. */\nexport interface EncodedCall {\n to: Address;\n value: bigint;\n data: Hex;\n}\n\n/**\n * Normalize {@link Call}s: encode `abi`/`functionName`/`args` into `data`,\n * default `value` to 0 and `data` to `0x`. Throws a PepuError for an empty\n * list or an ambiguous call.\n *\n * @example\n * normalizeCalls([{ to, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function normalizeCalls(calls: readonly Call[]): EncodedCall[] {\n if (calls.length === 0) {\n throw new PepuPolicyError(\"POLICY_UNSCOPED\", \"A sponsored send needs at least one call.\", {\n hint: \"Pass calls: [{ to, data }] or [{ to, abi, functionName, args }].\",\n });\n }\n return calls.map((c, i) => {\n if (c.data !== undefined && c.functionName !== undefined) {\n throw new PepuPolicyError(\"POLICY_UNSCOPED\", `Call ${i} sets both data and functionName.`, {\n hint: \"Use either raw data or abi plus functionName, not both.\",\n });\n }\n let data: Hex = c.data ?? \"0x\";\n if (c.functionName !== undefined) {\n if (!c.abi) {\n throw new PepuPolicyError(\"POLICY_UNSCOPED\", `Call ${i} has functionName but no abi.`, {\n hint: \"Pass the contract abi alongside functionName.\",\n });\n }\n data = encodeFunctionData({\n abi: c.abi,\n functionName: c.functionName,\n ...(c.args ? { args: c.args } : {}),\n } as Parameters<typeof encodeFunctionData>[0]);\n }\n return { to: c.to, value: c.value ?? 0n, data };\n });\n}\n\n/**\n * Read who paid and how much from a bundle transaction receipt's\n * `UserOperationEvent` (EntryPoint v0.7). Returns `null` when the receipt has\n * no event for `sender`.\n *\n * @example\n * const paid = userOpEventFromReceipt(receipt, smartAccountAddress);\n */\nexport function userOpEventFromReceipt(\n receipt: Pick<TransactionReceipt, \"logs\">,\n sender: Address,\n): { userOpHash: Hex; paymaster: Address | null; actualGasCost: bigint; success: boolean } | null {\n const events = parseEventLogs({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n logs: receipt.logs,\n strict: false,\n });\n const ev = events.find((e) => e.args.sender?.toLowerCase() === sender.toLowerCase());\n if (!ev || ev.args.userOpHash === undefined) return null;\n const pm = ev.args.paymaster;\n const zero = \"0x0000000000000000000000000000000000000000\";\n return {\n userOpHash: ev.args.userOpHash,\n paymaster: pm && pm.toLowerCase() !== zero ? pm : null,\n actualGasCost: ev.args.actualGasCost ?? 0n,\n success: ev.args.success ?? false,\n };\n}\n\n/** One UserOperationEvent from a bundle receipt. */\nexport interface UserOpEvent {\n sender: Address;\n userOpHash: Hex;\n nonce: bigint;\n /** The paymaster the EntryPoint charged, or `null` when the account paid for itself. */\n paymaster: Address | null;\n actualGasCost: bigint;\n actualGasUsed: bigint;\n success: boolean;\n}\n\n/**\n * Every `UserOperationEvent` in a receipt, without knowing the sender. A\n * bundle can carry several operations; use this to inspect them all (for\n * example when you only have a transaction hash). Pure.\n *\n * @example\n * const events = userOpEventsFromReceipt(receipt);\n * events.map((e) => [e.sender, e.success]);\n */\nexport function userOpEventsFromReceipt(receipt: Pick<TransactionReceipt, \"logs\">): UserOpEvent[] {\n const zero = \"0x0000000000000000000000000000000000000000\";\n const out: UserOpEvent[] = [];\n for (const ev of parseEventLogs({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n logs: receipt.logs,\n strict: false,\n })) {\n const a = ev.args;\n if (a.sender === undefined || a.userOpHash === undefined) continue;\n out.push({\n sender: a.sender,\n userOpHash: a.userOpHash,\n nonce: a.nonce ?? 0n,\n paymaster: a.paymaster && a.paymaster.toLowerCase() !== zero ? a.paymaster : null,\n actualGasCost: a.actualGasCost ?? 0n,\n actualGasUsed: a.actualGasUsed ?? 0n,\n success: a.success ?? false,\n });\n }\n return out;\n}\n\nconst KERNEL_EXECUTE_ABI = [\n {\n type: \"function\",\n name: \"execute\",\n stateMutability: \"payable\",\n inputs: [\n { name: \"execMode\", type: \"bytes32\" },\n { name: \"executionCalldata\", type: \"bytes\" },\n ],\n outputs: [],\n },\n] as const satisfies Abi;\n\n/** ERC-7579 execution modes: callType (1 byte) then zeros, default exec type. */\nconst EXEC_MODE_SINGLE: Hex = pad(\"0x00\", { size: 32, dir: \"right\" });\nconst EXEC_MODE_BATCH: Hex = pad(\"0x01\", { size: 32, dir: \"right\" });\n\n/**\n * The ERC-7579 `execute(bytes32 mode, bytes executionCalldata)` callData a\n * Kernel v3 account puts in a UserOperation. One call uses single mode\n * (callType 0x00, packed `target ++ value ++ data`); several use batch mode\n * (callType 0x01, ABI-encoded `Execution[]`). Pure: needs no live account. It\n * is the same bytes `account.encodeCalls(calls)` returns for a Kernel v3.1\n * account (`toPepuKernelAccount`, `@pepu-chain/sdk/aa/kernel`).\n *\n * Calls take either raw `data` or `abi` + `functionName` (+ `args`), like\n * `sendSponsored`. Throws a PepuError for an empty list or ambiguous call.\n *\n * @example\n * const callData = encodeKernelExecute([{ to: tapScore, abi: tapScoreAbi, functionName: \"tap\" }]);\n */\nexport function encodeKernelExecute(calls: readonly Call[]): Hex {\n const encoded = normalizeCalls(calls);\n if (encoded.length === 1 && encoded[0]) {\n const c = encoded[0];\n return encodeFunctionData({\n abi: KERNEL_EXECUTE_ABI,\n functionName: \"execute\",\n args: [EXEC_MODE_SINGLE, encodePacked([\"address\", \"uint256\", \"bytes\"], [c.to, c.value, c.data])],\n });\n }\n const batch = encodeAbiParameters(\n [\n {\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n [encoded.map((c) => ({ target: c.to, value: c.value, callData: c.data }))],\n );\n return encodeFunctionData({ abi: KERNEL_EXECUTE_ABI, functionName: \"execute\", args: [EXEC_MODE_BATCH, batch] });\n}\n"]}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var chunkDPCZJLB3_cjs = require('./chunk-DPCZJLB3.cjs');
4
+ var chunkYQL7NISX_cjs = require('./chunk-YQL7NISX.cjs');
5
+
6
+ // src/endpoints.ts
7
+ var PEPU_HOSTED = {
8
+ bundlerUrl: "https://bundler.pepeunchained.com",
9
+ paymasterBaseUrl: "https://paymaster.pepeunchained.com",
10
+ paymasterUrl: null
11
+ };
12
+ var PEPU_ENV = {
13
+ bundlerUrl: "PEPU_BUNDLER_URL",
14
+ paymasterUrl: "PEPU_PAYMASTER_URL",
15
+ rpcUrl: "PEPU_RPC_URL"
16
+ };
17
+ var PEPU_PUBLIC_ENV = {
18
+ bundlerUrl: "NEXT_PUBLIC_PEPU_BUNDLER_URL",
19
+ paymasterUrl: "NEXT_PUBLIC_PEPU_PAYMASTER_URL",
20
+ rpcUrl: "NEXT_PUBLIC_PEPU_RPC_URL"
21
+ };
22
+ function clean(value) {
23
+ const v = value?.trim();
24
+ return v === void 0 || v === "" ? void 0 : v;
25
+ }
26
+ function validate(url, label) {
27
+ let parsed;
28
+ try {
29
+ parsed = new URL(url);
30
+ } catch {
31
+ throw new chunkYQL7NISX_cjs.PepuConfigError("CONFIG_BAD_URL", `${label} is not a valid URL.`);
32
+ }
33
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
34
+ throw new chunkYQL7NISX_cjs.PepuConfigError("CONFIG_BAD_URL", `${label} must be an http(s) URL.`);
35
+ }
36
+ return url;
37
+ }
38
+ function paymasterBaseOf(url) {
39
+ return url.replace(/\/+$/, "").replace(/\/(?:v2\/)?paymaster\/[^/]+$/, "");
40
+ }
41
+ function defaultEnv() {
42
+ return typeof process !== "undefined" && process.env ? process.env : {};
43
+ }
44
+ function resolvePepuEndpoints(options = {}) {
45
+ const env = options.env ?? defaultEnv();
46
+ const rank = { explicit: 2, env: 1, "hosted-default": 0 };
47
+ let source = "hosted-default";
48
+ const bump = (s) => {
49
+ if (rank[s] > rank[source]) source = s;
50
+ };
51
+ const pick = (key, explicit, hosted) => {
52
+ const e = clean(explicit);
53
+ if (e !== void 0) {
54
+ bump("explicit");
55
+ return validate(e, `Option ${key}`);
56
+ }
57
+ for (const name of [PEPU_ENV[key], PEPU_PUBLIC_ENV[key]]) {
58
+ const v = clean(env[name]);
59
+ if (v !== void 0) {
60
+ bump("env");
61
+ return validate(v, name);
62
+ }
63
+ }
64
+ return hosted;
65
+ };
66
+ const rpcDefault = chunkDPCZJLB3_cjs.pepuMainnet.rpcUrls.default.http[0];
67
+ const paymasterUrl = pick("paymasterUrl", options.paymasterUrl, PEPU_HOSTED.paymasterUrl);
68
+ return {
69
+ rpcUrl: pick("rpcUrl", options.rpcUrl, rpcDefault) ?? rpcDefault,
70
+ bundlerUrl: pick("bundlerUrl", options.bundlerUrl, PEPU_HOSTED.bundlerUrl),
71
+ paymasterUrl,
72
+ paymasterBaseUrl: paymasterUrl !== null ? paymasterBaseOf(paymasterUrl) : PEPU_HOSTED.paymasterBaseUrl,
73
+ source
74
+ };
75
+ }
76
+ function isHostedSponsorshipLive() {
77
+ return PEPU_HOSTED.bundlerUrl !== null && PEPU_HOSTED.paymasterBaseUrl !== null;
78
+ }
79
+ function hostedFreeTierUrl() {
80
+ if (PEPU_HOSTED.paymasterBaseUrl === null) {
81
+ throw new chunkYQL7NISX_cjs.PepuConfigError("CONFIG_MISSING_ENV", "No hosted paymaster base URL is set.");
82
+ }
83
+ return `${PEPU_HOSTED.paymasterBaseUrl.replace(/\/+$/, "")}/v2/free-tier`;
84
+ }
85
+
86
+ exports.PEPU_ENV = PEPU_ENV;
87
+ exports.PEPU_HOSTED = PEPU_HOSTED;
88
+ exports.PEPU_PUBLIC_ENV = PEPU_PUBLIC_ENV;
89
+ exports.hostedFreeTierUrl = hostedFreeTierUrl;
90
+ exports.isHostedSponsorshipLive = isHostedSponsorshipLive;
91
+ exports.paymasterBaseOf = paymasterBaseOf;
92
+ exports.resolvePepuEndpoints = resolvePepuEndpoints;
93
+ //# sourceMappingURL=chunk-VF3D6KLQ.cjs.map
94
+ //# sourceMappingURL=chunk-VF3D6KLQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endpoints.ts"],"names":["PepuConfigError","pepuMainnet"],"mappings":"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","file":"chunk-VF3D6KLQ.cjs","sourcesContent":["import { pepuMainnet } from \"./chains.js\";\nimport { PepuConfigError } from \"./errors.js\";\n\n/**\n * Hosted-URL swap point. The hosted PEPU bundler and paymaster service run at\n * bundler.pepeunchained.com and paymaster.pepeunchained.com. Set here, the SDK,\n * MCP server and docs flip together. Apps can still point at their own\n * services with the env vars below.\n *\n * - `bundlerUrl` is a complete JSON-RPC URL.\n * - `paymasterBaseUrl` is the paymaster SERVICE base (REST API, `/health`,\n * `/v2/free-tier`). It is NOT an ERC-7677 URL: v2 serves ERC-7677 at\n * `<base>/v2/paymaster/<client token>`, so build that with\n * `hostedErc7677Url` (or `buildErc7677Url`).\n * - `paymasterUrl` is the default complete ERC-7677 URL. It stays `null`\n * because every ERC-7677 URL embeds a per-project token; set\n * `PEPU_PAYMASTER_URL` (or pass a token) to supply one.\n */\nexport const PEPU_HOSTED: {\n readonly bundlerUrl: string | null;\n readonly paymasterBaseUrl: string | null;\n readonly paymasterUrl: string | null;\n} = {\n bundlerUrl: \"https://bundler.pepeunchained.com\",\n paymasterBaseUrl: \"https://paymaster.pepeunchained.com\",\n paymasterUrl: null,\n};\n\n/** Server-side (and script) environment variable names. */\nexport const PEPU_ENV = {\n bundlerUrl: \"PEPU_BUNDLER_URL\",\n paymasterUrl: \"PEPU_PAYMASTER_URL\",\n rpcUrl: \"PEPU_RPC_URL\",\n} as const;\n\n/** Browser-exposed variants (Next.js `NEXT_PUBLIC_` convention). */\nexport const PEPU_PUBLIC_ENV = {\n bundlerUrl: \"NEXT_PUBLIC_PEPU_BUNDLER_URL\",\n paymasterUrl: \"NEXT_PUBLIC_PEPU_PAYMASTER_URL\",\n rpcUrl: \"NEXT_PUBLIC_PEPU_RPC_URL\",\n} as const;\n\nexport interface ResolvePepuEndpointsOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n rpcUrl?: string;\n /**\n * Environment to read. Defaults to `process.env` when it exists. In browser\n * bundles frameworks only inline literal `process.env.NEXT_PUBLIC_X`\n * accesses, so pass them explicitly there.\n */\n env?: Record<string, string | undefined>;\n}\n\nexport interface PepuEndpoints {\n rpcUrl: string;\n bundlerUrl: string | null;\n /** Complete ERC-7677 URL from the option or env, else `null` (it needs a project token). */\n paymasterUrl: string | null;\n /**\n * Paymaster service base for the REST API, probes and ERC-7677 URL building.\n * From the option or env (a full ERC-7677 URL is reduced to its base), else the hosted base.\n */\n paymasterBaseUrl: string | null;\n /** Highest-precedence origin used for any of the three values. */\n source: \"explicit\" | \"env\" | \"hosted-default\";\n}\n\nfunction clean(value: string | undefined): string | undefined {\n const v = value?.trim();\n return v === undefined || v === \"\" ? undefined : v;\n}\n\nfunction validate(url: string, label: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new PepuConfigError(\"CONFIG_BAD_URL\", `${label} is not a valid URL.`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new PepuConfigError(\"CONFIG_BAD_URL\", `${label} must be an http(s) URL.`);\n }\n return url;\n}\n\n/** Strip a trailing `/v2/paymaster/<token>` or `/paymaster/<token>` and slashes, leaving the service base. */\nexport function paymasterBaseOf(url: string): string {\n return url.replace(/\\/+$/, \"\").replace(/\\/(?:v2\\/)?paymaster\\/[^/]+$/, \"\");\n}\n\nfunction defaultEnv(): Record<string, string | undefined> {\n return typeof process !== \"undefined\" && process.env ? process.env : {};\n}\n\n/**\n * Resolve endpoints. Precedence per value: explicit option, then env\n * (server variable, then `NEXT_PUBLIC_` variable), then {@link PEPU_HOSTED}.\n * Throws PepuConfigError (CONFIG_BAD_URL) naming the variable, never its value.\n */\nexport function resolvePepuEndpoints(options: ResolvePepuEndpointsOptions = {}): PepuEndpoints {\n const env = options.env ?? defaultEnv();\n const rank = { explicit: 2, env: 1, \"hosted-default\": 0 } as const;\n let source: PepuEndpoints[\"source\"] = \"hosted-default\";\n const bump = (s: PepuEndpoints[\"source\"]): void => {\n if (rank[s] > rank[source]) source = s;\n };\n\n const pick = (key: keyof typeof PEPU_ENV, explicit: string | undefined, hosted: string | null): string | null => {\n const e = clean(explicit);\n if (e !== undefined) {\n bump(\"explicit\");\n return validate(e, `Option ${key}`);\n }\n for (const name of [PEPU_ENV[key], PEPU_PUBLIC_ENV[key]]) {\n const v = clean(env[name]);\n if (v !== undefined) {\n bump(\"env\");\n return validate(v, name);\n }\n }\n return hosted;\n };\n\n const rpcDefault = pepuMainnet.rpcUrls.default.http[0];\n const paymasterUrl = pick(\"paymasterUrl\", options.paymasterUrl, PEPU_HOSTED.paymasterUrl);\n return {\n rpcUrl: pick(\"rpcUrl\", options.rpcUrl, rpcDefault) ?? rpcDefault,\n bundlerUrl: pick(\"bundlerUrl\", options.bundlerUrl, PEPU_HOSTED.bundlerUrl),\n paymasterUrl,\n paymasterBaseUrl: paymasterUrl !== null ? paymasterBaseOf(paymasterUrl) : PEPU_HOSTED.paymasterBaseUrl,\n source,\n };\n}\n\n/** True once the hosted bundler and the hosted paymaster service have URLs in {@link PEPU_HOSTED}. */\nexport function isHostedSponsorshipLive(): boolean {\n return PEPU_HOSTED.bundlerUrl !== null && PEPU_HOSTED.paymasterBaseUrl !== null;\n}\n\n/** The public free-tier state route on the hosted paymaster (`GET`, no credentials). */\nexport function hostedFreeTierUrl(): string {\n if (PEPU_HOSTED.paymasterBaseUrl === null) {\n throw new PepuConfigError(\"CONFIG_MISSING_ENV\", \"No hosted paymaster base URL is set.\");\n }\n return `${PEPU_HOSTED.paymasterBaseUrl.replace(/\\/+$/, \"\")}/v2/free-tier`;\n}\n"]}
@@ -0,0 +1,82 @@
1
+ import { defineChain } from 'viem';
2
+
3
+ // src/chains.ts
4
+ var pepuMainnet = /* @__PURE__ */ defineChain({
5
+ id: 97741,
6
+ name: "Pepe Unchained V2",
7
+ nativeCurrency: {
8
+ name: "Pepe Unchained",
9
+ symbol: "PEPU",
10
+ decimals: 18
11
+ },
12
+ rpcUrls: {
13
+ default: {
14
+ http: ["https://rpc-pepu-v2-mainnet-0.t.conduit.xyz"]
15
+ }
16
+ },
17
+ blockExplorers: {
18
+ default: {
19
+ name: "PepuScan",
20
+ url: "https://pepuscan.com",
21
+ apiUrl: "https://pepuscan.com/api"
22
+ }
23
+ },
24
+ contracts: {
25
+ multicall3: {
26
+ address: "0x9CE19273Ae9c24437DFF512E8DFCAed4E4B001bd",
27
+ blockCreated: 10521048
28
+ }
29
+ },
30
+ // IMPORTANT: that Multicall3 address is PEPU-specific and deliberately
31
+ // NOT the canonical 0xcA11bde05977b3631167028862bE2a173976CA11.
32
+ //
33
+ // The canonical address is structurally unreachable on this chain: it
34
+ // was created elsewhere by a pre-signed CREATE transaction carrying a
35
+ // hardcoded 1,000,000 gas limit, and this Arbitrum Nitro chain needs
36
+ // ~14.3M gas for the same bytecode, so that transaction can never
37
+ // execute here. Conduit support confirmed there is no predeploy and
38
+ // that deploying our own is the supported path.
39
+ //
40
+ // Ours was built from the canonical mds1/multicall3 source (solc
41
+ // 0.8.12, optimizer 10,000,000 runs) and deployed through the CREATE2
42
+ // deterministic deployer with a zero salt, so the address is
43
+ // reproducible from the same inputs. It is verified on pepuscan, and
44
+ // viem's `multicall` has been confirmed working against it.
45
+ //
46
+ // Never substitute the canonical address here — viem/wagmi would call
47
+ // an address with no code and every batched read would fail.
48
+ testnet: false
49
+ });
50
+ var pepuTestnet = /* @__PURE__ */ defineChain({
51
+ id: 97740,
52
+ name: "Pepe Unchained V2 Testnet",
53
+ nativeCurrency: {
54
+ name: "Pepe Unchained",
55
+ symbol: "PEPU",
56
+ decimals: 18
57
+ },
58
+ rpcUrls: {
59
+ default: {
60
+ http: ["https://rpc-pepu-v2-testnet-vn4qxxp9og.t.conduit.xyz"]
61
+ }
62
+ },
63
+ // No `blockExplorers` entry: `pepuscan.com` is a Blockscout instance
64
+ // registered against mainnet (chain 97741) specifically. Blockscout
65
+ // instances index one chain each, so pointing the testnet definition at
66
+ // the mainnet explorer would silently produce wrong/empty links for
67
+ // testnet transactions and addresses. No verified Blockscout (or other)
68
+ // explorer for chain 97740 was available at the time this package was
69
+ // written. Add `blockExplorers.default` here once one is confirmed live.
70
+ // See the mainnet definition above: Multicall3 is not deployed at the
71
+ // canonical address on this chain either (no `contracts.multicall3`
72
+ // here), and must not be faked with a placeholder.
73
+ testnet: true
74
+ });
75
+ var pepuChains = [pepuMainnet, pepuTestnet];
76
+ function isPepuChain(chainId) {
77
+ return pepuChains.some((chain) => chain.id === chainId);
78
+ }
79
+
80
+ export { isPepuChain, pepuChains, pepuMainnet, pepuTestnet };
81
+ //# sourceMappingURL=chunk-VTQIHMF3.js.map
82
+ //# sourceMappingURL=chunk-VTQIHMF3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chains.ts"],"names":[],"mappings":";;;AAQO,IAAM,8BAA4B,WAAA,CAAY;AAAA,EACnD,EAAA,EAAI,KAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,6CAA6C;AAAA;AACtD,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,GAAA,EAAK,sBAAA;AAAA,MACL,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,4CAAA;AAAA,MACT,YAAA,EAAc;AAAA;AAChB,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAA,EAAS;AACX,CAAC;AAOM,IAAM,8BAA4B,WAAA,CAAY;AAAA,EACnD,EAAA,EAAI,KAAA;AAAA,EACJ,IAAA,EAAM,2BAAA;AAAA,EACN,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,sDAAsD;AAAA;AAC/D,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAA,EAAS;AACX,CAAC;AAGM,IAAM,UAAA,GAAa,CAAC,WAAA,EAAa,WAAW;AAe5C,SAAS,YAAY,OAAA,EAAyC;AACnE,EAAA,OAAO,WAAW,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,OAAO,CAAA;AACxD","file":"chunk-VTQIHMF3.js","sourcesContent":["import { defineChain } from \"viem\";\n\n/**\n * Pepe Unchained V2 — mainnet.\n *\n * Arbitrum Orbit / Nitro chain (ArbOS 51), hosted by Conduit, settling to\n * Ethereum L1 via AnyTrust. Verified against the live RPC endpoint.\n */\nexport const pepuMainnet = /*#__PURE__*/ defineChain({\n id: 97741,\n name: \"Pepe Unchained V2\",\n nativeCurrency: {\n name: \"Pepe Unchained\",\n symbol: \"PEPU\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc-pepu-v2-mainnet-0.t.conduit.xyz\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"PepuScan\",\n url: \"https://pepuscan.com\",\n apiUrl: \"https://pepuscan.com/api\",\n },\n },\n contracts: {\n multicall3: {\n address: \"0x9CE19273Ae9c24437DFF512E8DFCAed4E4B001bd\",\n blockCreated: 10521048,\n },\n },\n // IMPORTANT: that Multicall3 address is PEPU-specific and deliberately\n // NOT the canonical 0xcA11bde05977b3631167028862bE2a173976CA11.\n //\n // The canonical address is structurally unreachable on this chain: it\n // was created elsewhere by a pre-signed CREATE transaction carrying a\n // hardcoded 1,000,000 gas limit, and this Arbitrum Nitro chain needs\n // ~14.3M gas for the same bytecode, so that transaction can never\n // execute here. Conduit support confirmed there is no predeploy and\n // that deploying our own is the supported path.\n //\n // Ours was built from the canonical mds1/multicall3 source (solc\n // 0.8.12, optimizer 10,000,000 runs) and deployed through the CREATE2\n // deterministic deployer with a zero salt, so the address is\n // reproducible from the same inputs. It is verified on pepuscan, and\n // viem's `multicall` has been confirmed working against it.\n //\n // Never substitute the canonical address here — viem/wagmi would call\n // an address with no code and every batched read would fail.\n testnet: false,\n});\n\n/**\n * Pepe Unchained V2 — testnet.\n *\n * Same stack as mainnet; used for development and faucet-funded testing.\n */\nexport const pepuTestnet = /*#__PURE__*/ defineChain({\n id: 97740,\n name: \"Pepe Unchained V2 Testnet\",\n nativeCurrency: {\n name: \"Pepe Unchained\",\n symbol: \"PEPU\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc-pepu-v2-testnet-vn4qxxp9og.t.conduit.xyz\"],\n },\n },\n // No `blockExplorers` entry: `pepuscan.com` is a Blockscout instance\n // registered against mainnet (chain 97741) specifically. Blockscout\n // instances index one chain each, so pointing the testnet definition at\n // the mainnet explorer would silently produce wrong/empty links for\n // testnet transactions and addresses. No verified Blockscout (or other)\n // explorer for chain 97740 was available at the time this package was\n // written. Add `blockExplorers.default` here once one is confirmed live.\n // See the mainnet definition above: Multicall3 is not deployed at the\n // canonical address on this chain either (no `contracts.multicall3`\n // here), and must not be faked with a placeholder.\n testnet: true,\n});\n\n/** All Pepe Unchained V2 chain definitions, mainnet first. */\nexport const pepuChains = [pepuMainnet, pepuTestnet] as const;\n\n/** Union type of the two Pepe Unchained V2 chain definitions. */\nexport type PepuChain = (typeof pepuChains)[number];\n\n/** The chain ids this package knows about — {@link pepuMainnet}'s and {@link pepuTestnet}'s. */\nexport type PepuChainId = PepuChain[\"id\"];\n\n/**\n * Type guard: is `chainId` one of PEPU's chain ids (mainnet `97741` or\n * testnet `97740`)? Narrows `number` to {@link PepuChainId}, so a caller can\n * use it to guard which chain-specific helper (`getContract`,\n * `explorerUrl`, etc.) is safe to call without re-deriving the id list by\n * hand each time.\n */\nexport function isPepuChain(chainId: number): chainId is PepuChainId {\n return pepuChains.some((chain) => chain.id === chainId);\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { PepuConfigError } from './chunk-6DSZ4Z2N.js';
2
+
3
+ // src/internal/assert-server.ts
4
+ function assertServerOnly(entry) {
5
+ if (globalThis.window !== void 0) {
6
+ throw new PepuConfigError(
7
+ "CONFIG_SERVER_ONLY",
8
+ `${entry} is server-only and was imported in a browser bundle. Import it from a route handler, server action or script, never from client code.`
9
+ );
10
+ }
11
+ }
12
+
13
+ export { assertServerOnly };
14
+ //# sourceMappingURL=chunk-W3JN3YIW.js.map
15
+ //# sourceMappingURL=chunk-W3JN3YIW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/assert-server.ts"],"names":[],"mappings":";;;AAUO,SAAS,iBAAiB,KAAA,EAAqB;AACpD,EAAA,IAAK,UAAA,CAAoC,WAAW,MAAA,EAAW;AAC7D,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,oBAAA;AAAA,MACA,GAAG,KAAK,CAAA,sIAAA;AAAA,KACV;AAAA,EACF;AACF","file":"chunk-W3JN3YIW.js","sourcesContent":["import { PepuConfigError } from \"../errors.js\";\n\n/**\n * Called at import time by every server-only entry point\n * (`@pepu-chain/sdk/server`, `/privy/server`, `/session/server`,\n * `/paymaster/server`, `/combo`). Those entries sit next to secrets (Privy app\n * secret, authorization key, paymaster server keys) and must never be bundled\n * for the browser. A browser bundle that reaches one fails loudly here instead\n * of silently shipping the module.\n */\nexport function assertServerOnly(entry: string): void {\n if ((globalThis as { window?: unknown }).window !== undefined) {\n throw new PepuConfigError(\n \"CONFIG_SERVER_ONLY\",\n `${entry} is server-only and was imported in a browser bundle. Import it from a route handler, server action or script, never from client code.`,\n );\n }\n}\n"]}
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ var chunkYQL7NISX_cjs = require('./chunk-YQL7NISX.cjs');
4
+
5
+ // src/aa/describe.ts
6
+ var AA_HINTS = {
7
+ AA10: { code: "BUNDLER_AA_FAILED", hint: "The sender is already deployed but initCode was sent. Drop the factory fields." },
8
+ AA13: { code: "BUNDLER_AA_FAILED", hint: "initCode (account factory) reverted. Check the Kernel factory address and the owner." },
9
+ AA14: { code: "BUNDLER_AA_FAILED", hint: "initCode deployed a different address than the sender. Rebuild the account with the same owner and index." },
10
+ AA20: { code: "BUNDLER_AA_FAILED", hint: "The account is not deployed and no initCode was sent. Use a fresh account object so the factory fields are included." },
11
+ AA21: { code: "BUNDLER_AA_FAILED", hint: "The account cannot pay its prefund. Use the paymaster, or fund the account." },
12
+ AA22: { code: "BUNDLER_AA_FAILED", hint: "The UserOperation's validity window expired. Resend a fresh one." },
13
+ AA23: { code: "BUNDLER_AA_FAILED", hint: "Account validation reverted: wrong signer, wrong signature format, or a session policy rejected the call." },
14
+ AA24: { code: "BUNDLER_AA_FAILED", hint: "Signature rejected by the account. Sign with the owner the account was built for." },
15
+ AA25: { code: "BUNDLER_AA_FAILED", hint: "Invalid nonce: another UserOperation from this account is pending. Wait for it, then retry." },
16
+ AA26: { code: "BUNDLER_AA_FAILED", hint: "verificationGasLimit too low. Re-estimate gas." },
17
+ AA31: { code: "PAYMASTER_NO_BALANCE", paymaster: true, hint: "The paymaster's EntryPoint deposit is too low. Deposit more PEPU to the paymaster." },
18
+ AA32: { code: "PAYMASTER_DENIED", paymaster: true, hint: "The paymaster signature expired. Request paymaster data again." },
19
+ AA33: { code: "PAYMASTER_DENIED", paymaster: true, hint: "Paymaster validation reverted. Check the paymaster contract and that its signer matches the policy service." },
20
+ AA34: { code: "PAYMASTER_DENIED", paymaster: true, hint: "Paymaster signature rejected. The policy service signer does not match the paymaster contract." },
21
+ AA36: { code: "BUNDLER_AA_FAILED", paymaster: true, hint: "Paymaster gas limits too low. Re-estimate with the paymaster stub data." },
22
+ AA40: { code: "BUNDLER_AA_FAILED", hint: "Verification used more gas than verificationGasLimit. Re-estimate gas." },
23
+ AA41: { code: "BUNDLER_AA_FAILED", hint: "Paymaster verification used more gas than its limit. Re-estimate gas." },
24
+ AA50: { code: "BUNDLER_AA_FAILED", hint: "The postOp reverted. Check the paymaster's postOp path." },
25
+ AA51: { code: "BUNDLER_AA_FAILED", hint: "Prefund below actualGasCost. Re-estimate fees; PEPU needs fee headroom (the SDK applies 20%)." },
26
+ AA90: { code: "BUNDLER_AA_FAILED", hint: "Invalid beneficiary on handleOps. This is a bundler configuration problem." },
27
+ AA91: { code: "BUNDLER_AA_FAILED", hint: "Failed to send funds to the beneficiary. This is a bundler configuration problem." },
28
+ AA95: { code: "BUNDLER_AA_FAILED", hint: "Out of gas in handleOps. Raise the gas limits." }
29
+ };
30
+ function redactSecrets(text) {
31
+ return text.replace(/\/paymaster\/[^\s/"'`)\]?#]+/gi, "/paymaster/[redacted]").replace(/(bearer\s+)[A-Za-z0-9._~+/=-]+/gi, "$1[redacted]").replace(/(x-api-key["']?\s*[:=]\s*["']?)[^\s"',}]+/gi, "$1[redacted]").replace(/(privyAccessToken["']?\s*[:=]\s*["']?)[^\s"',}]+/gi, "$1[redacted]").replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*/g, "[redacted-jwt]").replace(/(https?:\/\/)[^\s/@]+:[^\s/@]+@/gi, "$1[redacted]@");
32
+ }
33
+ function collect(e) {
34
+ const seen = /* @__PURE__ */ new Set();
35
+ const parts = [];
36
+ let cur = e;
37
+ for (let d = 0; d < 8 && cur !== void 0 && cur !== null && !seen.has(cur); d++) {
38
+ seen.add(cur);
39
+ if (typeof cur === "object") {
40
+ const o = cur;
41
+ for (const k of ["shortMessage", "message", "details", "reason"]) {
42
+ const v = o[k];
43
+ if (typeof v === "string" && v.length > 0 && !parts.includes(v)) parts.push(v);
44
+ }
45
+ const data = o["data"];
46
+ if (data && typeof data === "object") {
47
+ const r = data["reason"];
48
+ if (typeof r === "string") parts.push(r);
49
+ }
50
+ cur = o["cause"];
51
+ } else {
52
+ parts.push(String(cur));
53
+ break;
54
+ }
55
+ }
56
+ return parts.join("\n");
57
+ }
58
+ function describeUserOpFailure(e) {
59
+ const text = redactSecrets(collect(e));
60
+ const headline = text.split("\n")[0]?.trim() || "UserOperation failed";
61
+ const opts = (hint) => ({ ...hint ? { hint } : {}, cause: e });
62
+ const aa = /\bAA(\d{2})\b/.exec(text);
63
+ if (aa) {
64
+ const key = `AA${aa[1]}`;
65
+ const info = AA_HINTS[key];
66
+ if (info) {
67
+ const msg = `${key}: ${headline}`;
68
+ return info.paymaster && info.code !== "BUNDLER_AA_FAILED" ? new chunkYQL7NISX_cjs.PepuPaymasterError(info.code, msg, opts(info.hint)) : new chunkYQL7NISX_cjs.PepuBundlerError(info.code, msg, opts(info.hint));
69
+ }
70
+ return new chunkYQL7NISX_cjs.PepuBundlerError("BUNDLER_AA_FAILED", `${key}: ${headline}`, opts());
71
+ }
72
+ const explained = chunkYQL7NISX_cjs.explainError(text);
73
+ if (explained.code.startsWith("PAYMASTER_")) {
74
+ return new chunkYQL7NISX_cjs.PepuPaymasterError(explained.code, headline, opts(explained.fix));
75
+ }
76
+ if (explained.code !== "UNKNOWN") {
77
+ return new chunkYQL7NISX_cjs.PepuBundlerError(explained.code, headline, opts(explained.fix));
78
+ }
79
+ const pe = chunkYQL7NISX_cjs.toPepuError(e);
80
+ if (pe.code !== "UNKNOWN") return new chunkYQL7NISX_cjs.PepuBundlerError(pe.code, redactSecrets(pe.message), opts(pe.hint));
81
+ return new chunkYQL7NISX_cjs.PepuBundlerError("UNKNOWN", headline, opts(chunkYQL7NISX_cjs.getErrorEntry("UNKNOWN").fix));
82
+ }
83
+
84
+ exports.describeUserOpFailure = describeUserOpFailure;
85
+ exports.redactSecrets = redactSecrets;
86
+ //# sourceMappingURL=chunk-WANILJZQ.cjs.map
87
+ //# sourceMappingURL=chunk-WANILJZQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/aa/describe.ts"],"names":["PepuPaymasterError","PepuBundlerError","explainError","toPepuError","getErrorEntry"],"mappings":"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","file":"chunk-WANILJZQ.cjs","sourcesContent":["import { PepuBundlerError, PepuPaymasterError, explainError, getErrorEntry, toPepuError } from \"../errors.js\";\nimport type { PepuErrorCode } from \"../errors.js\";\n\ninterface AaInfo {\n code: PepuErrorCode;\n paymaster?: boolean;\n hint: string;\n}\n\n/**\n * AAxx meaning, per the EntryPoint v0.7 revert reasons, with the PEPU-specific\n * fix. Ported from the sponsored-demo and sponsored-session-app runs.\n */\nconst AA_HINTS: Readonly<Record<string, AaInfo>> = {\n AA10: { code: \"BUNDLER_AA_FAILED\", hint: \"The sender is already deployed but initCode was sent. Drop the factory fields.\" },\n AA13: { code: \"BUNDLER_AA_FAILED\", hint: \"initCode (account factory) reverted. Check the Kernel factory address and the owner.\" },\n AA14: { code: \"BUNDLER_AA_FAILED\", hint: \"initCode deployed a different address than the sender. Rebuild the account with the same owner and index.\" },\n AA20: { code: \"BUNDLER_AA_FAILED\", hint: \"The account is not deployed and no initCode was sent. Use a fresh account object so the factory fields are included.\" },\n AA21: { code: \"BUNDLER_AA_FAILED\", hint: \"The account cannot pay its prefund. Use the paymaster, or fund the account.\" },\n AA22: { code: \"BUNDLER_AA_FAILED\", hint: \"The UserOperation's validity window expired. Resend a fresh one.\" },\n AA23: { code: \"BUNDLER_AA_FAILED\", hint: \"Account validation reverted: wrong signer, wrong signature format, or a session policy rejected the call.\" },\n AA24: { code: \"BUNDLER_AA_FAILED\", hint: \"Signature rejected by the account. Sign with the owner the account was built for.\" },\n AA25: { code: \"BUNDLER_AA_FAILED\", hint: \"Invalid nonce: another UserOperation from this account is pending. Wait for it, then retry.\" },\n AA26: { code: \"BUNDLER_AA_FAILED\", hint: \"verificationGasLimit too low. Re-estimate gas.\" },\n AA31: { code: \"PAYMASTER_NO_BALANCE\", paymaster: true, hint: \"The paymaster's EntryPoint deposit is too low. Deposit more PEPU to the paymaster.\" },\n AA32: { code: \"PAYMASTER_DENIED\", paymaster: true, hint: \"The paymaster signature expired. Request paymaster data again.\" },\n AA33: { code: \"PAYMASTER_DENIED\", paymaster: true, hint: \"Paymaster validation reverted. Check the paymaster contract and that its signer matches the policy service.\" },\n AA34: { code: \"PAYMASTER_DENIED\", paymaster: true, hint: \"Paymaster signature rejected. The policy service signer does not match the paymaster contract.\" },\n AA36: { code: \"BUNDLER_AA_FAILED\", paymaster: true, hint: \"Paymaster gas limits too low. Re-estimate with the paymaster stub data.\" },\n AA40: { code: \"BUNDLER_AA_FAILED\", hint: \"Verification used more gas than verificationGasLimit. Re-estimate gas.\" },\n AA41: { code: \"BUNDLER_AA_FAILED\", hint: \"Paymaster verification used more gas than its limit. Re-estimate gas.\" },\n AA50: { code: \"BUNDLER_AA_FAILED\", hint: \"The postOp reverted. Check the paymaster's postOp path.\" },\n AA51: { code: \"BUNDLER_AA_FAILED\", hint: \"Prefund below actualGasCost. Re-estimate fees; PEPU needs fee headroom (the SDK applies 20%).\" },\n AA90: { code: \"BUNDLER_AA_FAILED\", hint: \"Invalid beneficiary on handleOps. This is a bundler configuration problem.\" },\n AA91: { code: \"BUNDLER_AA_FAILED\", hint: \"Failed to send funds to the beneficiary. This is a bundler configuration problem.\" },\n AA95: { code: \"BUNDLER_AA_FAILED\", hint: \"Out of gas in handleOps. Raise the gas limits.\" },\n};\n\n/**\n * Remove anything credential-shaped from text that may reach a message:\n * `/paymaster/<token>` URL paths, bearer tokens, API keys, JWTs and URL\n * credentials.\n *\n * @example\n * redactSecrets(\"POST https://pm.example/paymaster/sk_live_123 failed\");\n * // \"POST https://pm.example/paymaster/[redacted] failed\"\n */\nexport function redactSecrets(text: string): string {\n return text\n .replace(/\\/paymaster\\/[^\\s/\"'`)\\]?#]+/gi, \"/paymaster/[redacted]\")\n .replace(/(bearer\\s+)[A-Za-z0-9._~+/=-]+/gi, \"$1[redacted]\")\n .replace(/(x-api-key[\"']?\\s*[:=]\\s*[\"']?)[^\\s\"',}]+/gi, \"$1[redacted]\")\n .replace(/(privyAccessToken[\"']?\\s*[:=]\\s*[\"']?)[^\\s\"',}]+/gi, \"$1[redacted]\")\n .replace(/\\beyJ[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9_-]*/g, \"[redacted-jwt]\")\n .replace(/(https?:\\/\\/)[^\\s/@]+:[^\\s/@]+@/gi, \"$1[redacted]@\");\n}\n\nfunction collect(e: unknown): string {\n const seen = new Set<unknown>();\n const parts: string[] = [];\n let cur: unknown = e;\n for (let d = 0; d < 8 && cur !== undefined && cur !== null && !seen.has(cur); d++) {\n seen.add(cur);\n if (typeof cur === \"object\") {\n const o = cur as Record<string, unknown>;\n for (const k of [\"shortMessage\", \"message\", \"details\", \"reason\"]) {\n const v = o[k];\n if (typeof v === \"string\" && v.length > 0 && !parts.includes(v)) parts.push(v);\n }\n const data = o[\"data\"];\n if (data && typeof data === \"object\") {\n const r = (data as Record<string, unknown>)[\"reason\"];\n if (typeof r === \"string\") parts.push(r);\n }\n cur = o[\"cause\"];\n } else {\n parts.push(String(cur));\n break;\n }\n }\n return parts.join(\"\\n\");\n}\n\n/**\n * Turn anything thrown by the bundler, paymaster or viem/Privy stack into a\n * typed PepuError. Walks the `cause` chain (viem's `details` is where the\n * paymaster's real denial reason lives; Privy's own log prints\n * `[object Error]`), maps `AA10`..`AA9x` to a fix, maps paymaster reason codes\n * through the error catalog, and redacts tokens and URL credentials.\n * Port of `templates/sponsored-demo/lib/describe-error.ts`.\n *\n * @example\n * try { await sendSponsored({ client, calls }); }\n * catch (e) { const err = describeUserOpFailure(e); console.log(err.code, err.hint); }\n */\nexport function describeUserOpFailure(e: unknown): PepuBundlerError | PepuPaymasterError {\n const text = redactSecrets(collect(e));\n const headline = text.split(\"\\n\")[0]?.trim() || \"UserOperation failed\";\n const opts = (hint?: string) => ({ ...(hint ? { hint } : {}), cause: e });\n\n const aa = /\\bAA(\\d{2})\\b/.exec(text);\n if (aa) {\n const key = `AA${aa[1]}`;\n const info = AA_HINTS[key];\n if (info) {\n const msg = `${key}: ${headline}`;\n return info.paymaster && info.code !== \"BUNDLER_AA_FAILED\"\n ? new PepuPaymasterError(info.code, msg, opts(info.hint))\n : new PepuBundlerError(info.code, msg, opts(info.hint));\n }\n return new PepuBundlerError(\"BUNDLER_AA_FAILED\", `${key}: ${headline}`, opts());\n }\n\n const explained = explainError(text);\n if (explained.code.startsWith(\"PAYMASTER_\")) {\n return new PepuPaymasterError(explained.code, headline, opts(explained.fix));\n }\n if (explained.code !== \"UNKNOWN\") {\n return new PepuBundlerError(explained.code, headline, opts(explained.fix));\n }\n const pe = toPepuError(e);\n if (pe.code !== \"UNKNOWN\") return new PepuBundlerError(pe.code, redactSecrets(pe.message), opts(pe.hint));\n return new PepuBundlerError(\"UNKNOWN\", headline, opts(getErrorEntry(\"UNKNOWN\").fix));\n}\n"]}
@@ -0,0 +1,86 @@
1
+ import { pepuMainnet } from './chunk-VTQIHMF3.js';
2
+ import { PepuConfigError } from './chunk-6DSZ4Z2N.js';
3
+
4
+ // src/endpoints.ts
5
+ var PEPU_HOSTED = {
6
+ bundlerUrl: "https://bundler.pepeunchained.com",
7
+ paymasterBaseUrl: "https://paymaster.pepeunchained.com",
8
+ paymasterUrl: null
9
+ };
10
+ var PEPU_ENV = {
11
+ bundlerUrl: "PEPU_BUNDLER_URL",
12
+ paymasterUrl: "PEPU_PAYMASTER_URL",
13
+ rpcUrl: "PEPU_RPC_URL"
14
+ };
15
+ var PEPU_PUBLIC_ENV = {
16
+ bundlerUrl: "NEXT_PUBLIC_PEPU_BUNDLER_URL",
17
+ paymasterUrl: "NEXT_PUBLIC_PEPU_PAYMASTER_URL",
18
+ rpcUrl: "NEXT_PUBLIC_PEPU_RPC_URL"
19
+ };
20
+ function clean(value) {
21
+ const v = value?.trim();
22
+ return v === void 0 || v === "" ? void 0 : v;
23
+ }
24
+ function validate(url, label) {
25
+ let parsed;
26
+ try {
27
+ parsed = new URL(url);
28
+ } catch {
29
+ throw new PepuConfigError("CONFIG_BAD_URL", `${label} is not a valid URL.`);
30
+ }
31
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
32
+ throw new PepuConfigError("CONFIG_BAD_URL", `${label} must be an http(s) URL.`);
33
+ }
34
+ return url;
35
+ }
36
+ function paymasterBaseOf(url) {
37
+ return url.replace(/\/+$/, "").replace(/\/(?:v2\/)?paymaster\/[^/]+$/, "");
38
+ }
39
+ function defaultEnv() {
40
+ return typeof process !== "undefined" && process.env ? process.env : {};
41
+ }
42
+ function resolvePepuEndpoints(options = {}) {
43
+ const env = options.env ?? defaultEnv();
44
+ const rank = { explicit: 2, env: 1, "hosted-default": 0 };
45
+ let source = "hosted-default";
46
+ const bump = (s) => {
47
+ if (rank[s] > rank[source]) source = s;
48
+ };
49
+ const pick = (key, explicit, hosted) => {
50
+ const e = clean(explicit);
51
+ if (e !== void 0) {
52
+ bump("explicit");
53
+ return validate(e, `Option ${key}`);
54
+ }
55
+ for (const name of [PEPU_ENV[key], PEPU_PUBLIC_ENV[key]]) {
56
+ const v = clean(env[name]);
57
+ if (v !== void 0) {
58
+ bump("env");
59
+ return validate(v, name);
60
+ }
61
+ }
62
+ return hosted;
63
+ };
64
+ const rpcDefault = pepuMainnet.rpcUrls.default.http[0];
65
+ const paymasterUrl = pick("paymasterUrl", options.paymasterUrl, PEPU_HOSTED.paymasterUrl);
66
+ return {
67
+ rpcUrl: pick("rpcUrl", options.rpcUrl, rpcDefault) ?? rpcDefault,
68
+ bundlerUrl: pick("bundlerUrl", options.bundlerUrl, PEPU_HOSTED.bundlerUrl),
69
+ paymasterUrl,
70
+ paymasterBaseUrl: paymasterUrl !== null ? paymasterBaseOf(paymasterUrl) : PEPU_HOSTED.paymasterBaseUrl,
71
+ source
72
+ };
73
+ }
74
+ function isHostedSponsorshipLive() {
75
+ return PEPU_HOSTED.bundlerUrl !== null && PEPU_HOSTED.paymasterBaseUrl !== null;
76
+ }
77
+ function hostedFreeTierUrl() {
78
+ if (PEPU_HOSTED.paymasterBaseUrl === null) {
79
+ throw new PepuConfigError("CONFIG_MISSING_ENV", "No hosted paymaster base URL is set.");
80
+ }
81
+ return `${PEPU_HOSTED.paymasterBaseUrl.replace(/\/+$/, "")}/v2/free-tier`;
82
+ }
83
+
84
+ export { PEPU_ENV, PEPU_HOSTED, PEPU_PUBLIC_ENV, hostedFreeTierUrl, isHostedSponsorshipLive, paymasterBaseOf, resolvePepuEndpoints };
85
+ //# sourceMappingURL=chunk-XC4IBCI2.js.map
86
+ //# sourceMappingURL=chunk-XC4IBCI2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endpoints.ts"],"names":[],"mappings":"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","file":"chunk-XC4IBCI2.js","sourcesContent":["import { pepuMainnet } from \"./chains.js\";\nimport { PepuConfigError } from \"./errors.js\";\n\n/**\n * Hosted-URL swap point. The hosted PEPU bundler and paymaster service run at\n * bundler.pepeunchained.com and paymaster.pepeunchained.com. Set here, the SDK,\n * MCP server and docs flip together. Apps can still point at their own\n * services with the env vars below.\n *\n * - `bundlerUrl` is a complete JSON-RPC URL.\n * - `paymasterBaseUrl` is the paymaster SERVICE base (REST API, `/health`,\n * `/v2/free-tier`). It is NOT an ERC-7677 URL: v2 serves ERC-7677 at\n * `<base>/v2/paymaster/<client token>`, so build that with\n * `hostedErc7677Url` (or `buildErc7677Url`).\n * - `paymasterUrl` is the default complete ERC-7677 URL. It stays `null`\n * because every ERC-7677 URL embeds a per-project token; set\n * `PEPU_PAYMASTER_URL` (or pass a token) to supply one.\n */\nexport const PEPU_HOSTED: {\n readonly bundlerUrl: string | null;\n readonly paymasterBaseUrl: string | null;\n readonly paymasterUrl: string | null;\n} = {\n bundlerUrl: \"https://bundler.pepeunchained.com\",\n paymasterBaseUrl: \"https://paymaster.pepeunchained.com\",\n paymasterUrl: null,\n};\n\n/** Server-side (and script) environment variable names. */\nexport const PEPU_ENV = {\n bundlerUrl: \"PEPU_BUNDLER_URL\",\n paymasterUrl: \"PEPU_PAYMASTER_URL\",\n rpcUrl: \"PEPU_RPC_URL\",\n} as const;\n\n/** Browser-exposed variants (Next.js `NEXT_PUBLIC_` convention). */\nexport const PEPU_PUBLIC_ENV = {\n bundlerUrl: \"NEXT_PUBLIC_PEPU_BUNDLER_URL\",\n paymasterUrl: \"NEXT_PUBLIC_PEPU_PAYMASTER_URL\",\n rpcUrl: \"NEXT_PUBLIC_PEPU_RPC_URL\",\n} as const;\n\nexport interface ResolvePepuEndpointsOptions {\n bundlerUrl?: string;\n paymasterUrl?: string;\n rpcUrl?: string;\n /**\n * Environment to read. Defaults to `process.env` when it exists. In browser\n * bundles frameworks only inline literal `process.env.NEXT_PUBLIC_X`\n * accesses, so pass them explicitly there.\n */\n env?: Record<string, string | undefined>;\n}\n\nexport interface PepuEndpoints {\n rpcUrl: string;\n bundlerUrl: string | null;\n /** Complete ERC-7677 URL from the option or env, else `null` (it needs a project token). */\n paymasterUrl: string | null;\n /**\n * Paymaster service base for the REST API, probes and ERC-7677 URL building.\n * From the option or env (a full ERC-7677 URL is reduced to its base), else the hosted base.\n */\n paymasterBaseUrl: string | null;\n /** Highest-precedence origin used for any of the three values. */\n source: \"explicit\" | \"env\" | \"hosted-default\";\n}\n\nfunction clean(value: string | undefined): string | undefined {\n const v = value?.trim();\n return v === undefined || v === \"\" ? undefined : v;\n}\n\nfunction validate(url: string, label: string): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new PepuConfigError(\"CONFIG_BAD_URL\", `${label} is not a valid URL.`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new PepuConfigError(\"CONFIG_BAD_URL\", `${label} must be an http(s) URL.`);\n }\n return url;\n}\n\n/** Strip a trailing `/v2/paymaster/<token>` or `/paymaster/<token>` and slashes, leaving the service base. */\nexport function paymasterBaseOf(url: string): string {\n return url.replace(/\\/+$/, \"\").replace(/\\/(?:v2\\/)?paymaster\\/[^/]+$/, \"\");\n}\n\nfunction defaultEnv(): Record<string, string | undefined> {\n return typeof process !== \"undefined\" && process.env ? process.env : {};\n}\n\n/**\n * Resolve endpoints. Precedence per value: explicit option, then env\n * (server variable, then `NEXT_PUBLIC_` variable), then {@link PEPU_HOSTED}.\n * Throws PepuConfigError (CONFIG_BAD_URL) naming the variable, never its value.\n */\nexport function resolvePepuEndpoints(options: ResolvePepuEndpointsOptions = {}): PepuEndpoints {\n const env = options.env ?? defaultEnv();\n const rank = { explicit: 2, env: 1, \"hosted-default\": 0 } as const;\n let source: PepuEndpoints[\"source\"] = \"hosted-default\";\n const bump = (s: PepuEndpoints[\"source\"]): void => {\n if (rank[s] > rank[source]) source = s;\n };\n\n const pick = (key: keyof typeof PEPU_ENV, explicit: string | undefined, hosted: string | null): string | null => {\n const e = clean(explicit);\n if (e !== undefined) {\n bump(\"explicit\");\n return validate(e, `Option ${key}`);\n }\n for (const name of [PEPU_ENV[key], PEPU_PUBLIC_ENV[key]]) {\n const v = clean(env[name]);\n if (v !== undefined) {\n bump(\"env\");\n return validate(v, name);\n }\n }\n return hosted;\n };\n\n const rpcDefault = pepuMainnet.rpcUrls.default.http[0];\n const paymasterUrl = pick(\"paymasterUrl\", options.paymasterUrl, PEPU_HOSTED.paymasterUrl);\n return {\n rpcUrl: pick(\"rpcUrl\", options.rpcUrl, rpcDefault) ?? rpcDefault,\n bundlerUrl: pick(\"bundlerUrl\", options.bundlerUrl, PEPU_HOSTED.bundlerUrl),\n paymasterUrl,\n paymasterBaseUrl: paymasterUrl !== null ? paymasterBaseOf(paymasterUrl) : PEPU_HOSTED.paymasterBaseUrl,\n source,\n };\n}\n\n/** True once the hosted bundler and the hosted paymaster service have URLs in {@link PEPU_HOSTED}. */\nexport function isHostedSponsorshipLive(): boolean {\n return PEPU_HOSTED.bundlerUrl !== null && PEPU_HOSTED.paymasterBaseUrl !== null;\n}\n\n/** The public free-tier state route on the hosted paymaster (`GET`, no credentials). */\nexport function hostedFreeTierUrl(): string {\n if (PEPU_HOSTED.paymasterBaseUrl === null) {\n throw new PepuConfigError(\"CONFIG_MISSING_ENV\", \"No hosted paymaster base URL is set.\");\n }\n return `${PEPU_HOSTED.paymasterBaseUrl.replace(/\\/+$/, \"\")}/v2/free-tier`;\n}\n"]}