@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 @@
1
+ {"version":3,"sources":["../src/privy/requirements.ts"],"names":[],"mappings":";;;AAMO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO,0BAAA;AAAA,EACP,SAAA,EAAW,kBAAA;AAAA,EACX,gBAAA,EAAkB,yBAAA;AAAA,EAClB,WAAA,EAAa;AACf;AAMO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,KAAA,EAAO,CAAC,cAAc,CAAA;AAAA,EACtB,WAAW,EAAC;AAAA,EACZ,kBAAkB,EAAC;AAAA,EACnB,WAAA,EAAa,CAAC,qBAAqB;AACrC;AAuCA,IAAM,UAAA,GAAa,uCAAA;AAEnB,IAAM,UAAA,GAAa,CAAC,CAAA,KAAsB,CAAA,CAAE,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,WAAA,EAAY;AAY5E,IAAM,uBAAA,GAAuD;AAAA,EAClE;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,KAAK,CAAA,OAAA,CAAA;AAAA,IACzB,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAA,EAAS,SAAA,EAAW,SAAS,CAAA;AAAA,IACvC,GAAA,EAAK,CAAA,iEAAA,EAAoE,SAAA,CAAU,KAAK,CAAA,CAAA,CAAA;AAAA,IACxF,OAAA,EAAS,GAAG,UAAU,CAAA,OAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,CAAA,EAAG,SAAA,CAAU,SAAS,CAAA,qBAAA,CAAA;AAAA,IAC7B,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAA,EAAS,SAAA,EAAW,SAAS,CAAA;AAAA,IACvC,GAAA,EAAK,CAAA,0DAAA,EAA6D,SAAA,CAAU,SAAS,CAAA,oCAAA,CAAA;AAAA,IACrF,OAAA,EAAS,GAAG,UAAU,CAAA,WAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,iBAAA;AAAA,IACJ,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,4DAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAA,EAAS,SAAA,EAAW,SAAS,CAAA;AAAA,IACvC,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,KAAQ;AACnB,MAAA,IAAI,CAAC,IAAI,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,QAAQ,+BAAA,EAAgC;AACjF,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,EAAG;AACvC,QAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,MAAA,EAAQ,uCAAA,EAAwC;AAAA,MAC1E;AACA,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,KAAM,IAAA,IAAQ,UAAA,CAAW,CAAC,MAAM,GAAG,CAAA;AAC3F,MAAA,OAAO,MACH,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,GAAG,GAAA,CAAI,MAAM,CAAA,YAAA,CAAA,EAAe,GAChD,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,2BAAA,CAAA,EAA8B;AAAA,IACtE,CAAA;AAAA,IACA,GAAA,EAAK,mKAAA;AAAA,IACL,OAAA,EAAS,GAAG,UAAU,CAAA,gBAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,sCAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,IACjB,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAG;AACrC,QAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,MAAA,EAAQ,qCAAA,EAAsC;AAAA,MACxE;AACA,MAAA,OAAO,GAAA,CAAI,cAAc,MAAA,GAAS,CAAA,GAC9B,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA,SAAA,EAAY,GAAA,CAAI,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,EAAI,GAChE,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,+BAAA,EAAgC;AAAA,IAC3D,CAAA;AAAA,IACA,GAAA,EAAK,kKAAA;AAAA,IACL,OAAA,EAAS,GAAG,UAAU,CAAA,cAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,sBAAA;AAAA,IACJ,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,IACjB,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAG;AACrC,QAAA,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,MAAA,EAAQ,qCAAA,EAAsC;AAAA,MACxE;AACA,MAAA,OAAO,GAAA,CAAI,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,KAAM,QAAA,IAAY,MAAM,cAAc,CAAA,GACvE,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,0BAAA,EAA2B,GAC/C,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,8BAAA,EAA+B;AAAA,IAC1D,CAAA;AAAA,IACA,GAAA,EAAK,gFAAA;AAAA,IACL,OAAA,EAAS,GAAG,UAAU,CAAA,OAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,2CAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAA,EAAS,SAAA,EAAW,SAAS,CAAA;AAAA,IACvC,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,MAAA,MAAM,GAAA,GAAM,IAAI,sBAAA,EAAwB,QAAA;AACxC,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,EAAA,EAAI,SAAA,EAAW,QAAQ,2DAAA,EAA4D;AACtG,MAAA,MAAM,OAAO,GAAA,CAAI,eAAA;AACjB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,QACE,OAAO,IAAA,KAAS,QAAA,GACZ,CAAA,8BAAA,EAAiC,IAAI,CAAA,kEAAA,CAAA,GACrC;AAAA,OACR;AAAA,IACF,CAAA;AAAA,IACA,GAAA,EAAK,gJAAA;AAAA,IACL,OAAA,EAAS,GAAG,UAAU,CAAA,iBAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,mBAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,sCAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,IACjB,GAAA,EAAK,qIAAA;AAAA,IACL,OAAA,EAAS,GAAG,UAAU,CAAA,SAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,0BAAA;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,OAAO,CAAA,EAAG,SAAA,CAAU,gBAAgB,CAAA,YAAA,EAAe,UAAU,WAAW,CAAA,qBAAA,CAAA;AAAA,IACxE,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,IACnB,KAAK,CAAA,4EAAA,EAA+E,SAAA,CAAU,gBAAgB,CAAA,0BAAA,EAA6B,UAAU,WAAW,CAAA,gFAAA,CAAA;AAAA,IAChK,OAAA,EAAS,GAAG,UAAU,CAAA,WAAA;AAAA,GACxB;AAAA,EACA;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,2FAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,IACnB,OAAO,CAAC,GAAA,KACN,GAAA,CAAI,mBAAA,KAAwB,SACxB,EAAE,EAAA,EAAI,SAAA,EAAW,MAAA,EAAQ,+CAA8C,GACvE,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,oCAAA,EAAqC;AAAA,IAC/D,GAAA,EAAK,+LAAA;AAAA,IACL,OAAA,EAAS,GAAG,UAAU,CAAA,cAAA;AAAA;AAE1B;AASA,IAAM,oBAAA,GAAuB,oCAAA;AA0B7B,eAAsB,0BAA0B,CAAA,EAIe;AAC7D,EAAA,MAAM,OAAO,uBAAA,CAAwB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW,CAAA;AAC1E,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,MAAuE;AAAA,IACzF,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAI,SAAA,EAAW,MAAA,EAAQ,GAAA,EAAK,CAAA,CAAE,KAAI,CAAE;AAAA,GAC1E,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,IAAA,EAAK,IAAK,EAAA;AACjC,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,WAAW,CAAA,EAAG,SAAA,CAAU,KAAK,CAAA,uCAAA,CAAyC,CAAA;AAEzF,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,KAAA,IAAS,UAAA,CAAW,KAAA;AACtC,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,CAAA,EAAG,oBAAoB,CAAA,EAAG,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA,EAAI;AAAA,MAC/E,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,KAAA;AAAA,QAChB,GAAI,EAAE,MAAA,GAAS,EAAE,QAAQ,CAAA,CAAE,MAAA,KAAW;AAAC;AACzC,KACD,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,OAAO,WAAW,CAAA,wCAAA,EAA2C,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACvF,IAAA,MAAM,IAAA,GAAgB,MAAM,GAAA,CAAI,IAAA,EAAK;AACrC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,EAAM,OAAO,WAAW,8CAA8C,CAAA;AAC/G,IAAA,GAAA,GAAM,IAAA;AAAA,EACR,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,WAAW,4DAA4D,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAA+B;AACrD,IAAA,IAAI,MAAA,GAAiC,EAAE,EAAA,EAAI,SAAA,EAAW,QAAQ,qBAAA,EAAsB;AACpF,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,CAAA,CAAE,MAAA,KAAW,KAAA,CAAA,GAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,GAAI,EAAE,CAAA;AAAA,MAC1E,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,EAAE,EAAA,EAAI,SAAA,EAAW,MAAA,EAAQ,4CAAA,EAA6C;AAAA,MACjF;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,EAAA,KAAO,IAAA,GACjB,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,MAAA,KACrC,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI;AAAA,EACnE,CAAC,CAAA;AAED,EAAA,MAAM,KAAK,CAAC,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,KAAA,IAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,EAAE,GAAG,QAAQ,CAAA;AACzF,EAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AACrB;AA2BA,eAAsB,sBAAsB,KAAA,EAMZ;AAC9B,EAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B;AAAA,IAC7C,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,GAAI,MAAM,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAAI;AAAC,GAC9D,CAAA;AACD,EAAA,OAAO,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAA0B;AAC1D,IAAA,MAAM,EAAA,GAAK,SAAS,GAAG,CAAA,CAAA;AACvB,IAAA,MAAM,MAAM,uBAAA,CAAwB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,GAAG,CAAA;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,EAAE,IAAI,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA,+BAAA,EAAkC,GAAG,CAAA,EAAA,CAAA,EAAM,GAAA,EAAK,yCAAA,EAA0C;AAAA,IAClI;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,WAAA,EAAa;AAC7B,MAAA,OAAO,EAAE,IAAI,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,oDAAA,CAAA,EAAuD;AAAA,IAC3G;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,GAAG,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,EAAA,KAAO,SAAA,EAAW;AAClC,MAAA,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,GAAG,GAAA,CAAI,KAAK,CAAA,yBAAA,EAA4B,IAAA,EAAM,UAAU,EAAE,CAAA,CAAA,CAAG,MAAK,EAAG,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,IAC1H;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,GACR,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG,GAC9D,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,EAClF,CAAC,CAAA;AACH","file":"chunk-C2XW44FI.cjs","sourcesContent":["/**\n * Privy requirements table and dashboard check (`@pepu-chain/sdk/privy`).\n * Client-safe: no secrets, no Privy packages. Re-exported from `config.ts`.\n */\n\n/** Environment variable names the Privy layer reads. Names only, never values. */\nexport const PRIVY_ENV = {\n appId: \"NEXT_PUBLIC_PRIVY_APP_ID\",\n appSecret: \"PRIVY_APP_SECRET\",\n authorizationKey: \"PRIVY_AUTHORIZATION_KEY\",\n keyQuorumId: \"NEXT_PUBLIC_PRIVY_KEY_QUORUM_ID\",\n} as const;\n\n/**\n * Accepted fallback names, read only when the canonical {@link PRIVY_ENV} name\n * is empty. The canonical name is what docs, the doctor and error messages use.\n */\nexport const PRIVY_ENV_ALIASES = {\n appId: [\"PRIVY_APP_ID\"],\n appSecret: [],\n authorizationKey: [],\n keyQuorumId: [\"PRIVY_KEY_QUORUM_ID\"],\n} as const satisfies Record<keyof typeof PRIVY_ENV, readonly string[]>;\n\n/**\n * The subset of Privy's public app-config response this SDK looks at. Every\n * field is optional: the endpoint is undocumented, so a missing field means\n * \"unknown\", never \"wrong\".\n */\nexport interface PrivyPublicAppConfig {\n /** Origins the dashboard allows (scheme, host and port). */\n allowed_domains?: string[];\n /** Enabled login methods, e.g. `\"google_oauth\"`, `\"email\"`, `\"wallet\"`. */\n login_methods?: string[];\n embedded_wallet_config?: {\n ethereum?: { create_on_login?: string };\n [key: string]: unknown;\n };\n smart_wallet_config?: unknown;\n [key: string]: unknown;\n}\n\n/** Result of one requirement check. `\"unknown\"` means it could not be verified. */\nexport interface PrivyRequirementResult {\n ok: boolean | \"unknown\";\n detail: string;\n}\n\n/** One row of {@link PEPU_PRIVY_REQUIREMENTS}. */\nexport interface PrivyRequirement {\n id: string;\n where: \"dashboard\" | \"env\" | \"code\";\n label: string;\n required: boolean;\n pillars: (\"login\" | \"session\" | \"sponsor\")[];\n /** Only dashboard rows have a check, and it only sees Privy's public app config. */\n check?: (cfg: PrivyPublicAppConfig, ctx: { origin?: string }) => PrivyRequirementResult;\n fix: string;\n docsUrl: string;\n}\n\nconst PRIVY_DOCS = \"https://guide.pepeunchained.com/privy\";\n\nconst normOrigin = (o: string): string => o.trim().replace(/\\/+$/, \"\").toLowerCase();\n\n/**\n * Everything a PEPU app needs from Privy, as one data table. It feeds the docs,\n * the MCP `pepu_check_privy_config` tool, the CLI `doctor` and in-app notices.\n *\n * @example\n * ```ts\n * import { PEPU_PRIVY_REQUIREMENTS } from \"@pepu-chain/sdk/privy\";\n * const forSessions = PEPU_PRIVY_REQUIREMENTS.filter((r) => r.pillars.includes(\"session\"));\n * ```\n */\nexport const PEPU_PRIVY_REQUIREMENTS: readonly PrivyRequirement[] = [\n {\n id: \"app-id\",\n where: \"env\",\n label: `${PRIVY_ENV.appId} is set`,\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n fix: `Copy the App ID from the Privy dashboard (Settings, Basics) into ${PRIVY_ENV.appId}.`,\n docsUrl: `${PRIVY_DOCS}#app-id`,\n },\n {\n id: \"app-secret\",\n where: \"env\",\n label: `${PRIVY_ENV.appSecret} is set (server only)`,\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n fix: `Create an app secret in the Privy dashboard and put it in ${PRIVY_ENV.appSecret}. Never prefix it with NEXT_PUBLIC_.`,\n docsUrl: `${PRIVY_DOCS}#app-secret`,\n },\n {\n id: \"allowed-origins\",\n where: \"dashboard\",\n label: \"The page origin (including the port) is in Allowed origins\",\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n check: (cfg, ctx) => {\n if (!ctx.origin) return { ok: \"unknown\", detail: \"No origin was given to check.\" };\n if (!Array.isArray(cfg.allowed_domains)) {\n return { ok: \"unknown\", detail: \"Privy did not report allowed origins.\" };\n }\n const want = normOrigin(ctx.origin);\n const hit = cfg.allowed_domains.some((d) => normOrigin(d) === want || normOrigin(d) === \"*\");\n return hit\n ? { ok: true, detail: `${ctx.origin} is allowed.` }\n : { ok: false, detail: `${ctx.origin} is not in Allowed origins.` };\n },\n fix: \"Add the exact origin, scheme, host and port, to Privy dashboard, Configuration, App settings, Allowed origins. A different dev port counts as a different origin.\",\n docsUrl: `${PRIVY_DOCS}#allowed-origins`,\n },\n {\n id: \"login-methods\",\n where: \"dashboard\",\n label: \"At least one login method is enabled\",\n required: true,\n pillars: [\"login\"],\n check: (cfg) => {\n if (!Array.isArray(cfg.login_methods)) {\n return { ok: \"unknown\", detail: \"Privy did not report login methods.\" };\n }\n return cfg.login_methods.length > 0\n ? { ok: true, detail: `Enabled: ${cfg.login_methods.join(\", \")}.` }\n : { ok: false, detail: \"No login methods are enabled.\" };\n },\n fix: \"Enable the methods you list in loginMethods under Privy dashboard, User management, Authentication. Methods not enabled there are hidden even if listed in code.\",\n docsUrl: `${PRIVY_DOCS}#login-methods`,\n },\n {\n id: \"login-methods.google\",\n where: \"dashboard\",\n label: \"Google login is enabled\",\n required: false,\n pillars: [\"login\"],\n check: (cfg) => {\n if (!Array.isArray(cfg.login_methods)) {\n return { ok: \"unknown\", detail: \"Privy did not report login methods.\" };\n }\n return cfg.login_methods.some((m) => m === \"google\" || m === \"google_oauth\")\n ? { ok: true, detail: \"Google login is enabled.\" }\n : { ok: false, detail: \"Google login is not enabled.\" };\n },\n fix: \"Enable Google under Privy dashboard, User management, Authentication, Socials.\",\n docsUrl: `${PRIVY_DOCS}#google`,\n },\n {\n id: \"embedded-wallets\",\n where: \"dashboard\",\n label: \"Embedded wallets are enabled for Ethereum\",\n required: true,\n pillars: [\"login\", \"session\", \"sponsor\"],\n check: (cfg) => {\n const eth = cfg.embedded_wallet_config?.ethereum;\n if (!eth) return { ok: \"unknown\", detail: \"Privy did not report the Ethereum embedded wallet config.\" };\n const mode = eth.create_on_login;\n return {\n ok: true,\n detail:\n typeof mode === \"string\"\n ? `Dashboard create-on-login is \"${mode}\". The SDK provisions wallets server-side either way (WalletGate).`\n : \"Ethereum embedded wallets are configured.\",\n };\n },\n fix: \"Turn on embedded wallets for Ethereum in Privy dashboard, Wallets. Wallet creation itself is handled server-side by createEnsureWalletRoute().\",\n docsUrl: `${PRIVY_DOCS}#embedded-wallets`,\n },\n {\n id: \"coinbase-eoa-only\",\n where: \"code\",\n label: \"Coinbase Wallet is pinned to eoaOnly\",\n required: true,\n pillars: [\"login\"],\n fix: \"Build the Privy config with createPepuPrivyConfig() (or use PepuPrivyProvider). Coinbase Smart Wallet does not support chain 97741.\",\n docsUrl: `${PRIVY_DOCS}#coinbase`,\n },\n {\n id: \"authorization-key-quorum\",\n where: \"env\",\n label: `${PRIVY_ENV.authorizationKey} is set and ${PRIVY_ENV.keyQuorumId} is its key quorum id`,\n required: false,\n pillars: [\"session\"],\n fix: `Create an authorization key in the Privy dashboard, put the private half in ${PRIVY_ENV.authorizationKey} and its key quorum id in ${PRIVY_ENV.keyQuorumId}. A mismatch gives \"No valid authorization keys or user signing keys available\".`,\n docsUrl: `${PRIVY_DOCS}#key-quorum`,\n },\n {\n id: \"smart-wallets\",\n where: \"dashboard\",\n label: \"Smart wallets are enabled with the PEPU bundler and paymaster URLs (Privy transport only)\",\n required: false,\n pillars: [\"sponsor\"],\n check: (cfg) =>\n cfg.smart_wallet_config === undefined\n ? { ok: \"unknown\", detail: \"Privy did not report smart wallet settings.\" }\n : { ok: true, detail: \"Smart wallet settings are present.\" },\n fix: \"Only needed for the Privy Smart Wallets transport: add the PEPU chain with bundler and paymaster URLs under Privy dashboard, Wallets, Smart wallets. The direct transport does not need this.\",\n docsUrl: `${PRIVY_DOCS}#smart-wallets`,\n },\n];\n\n/**\n * Privy's public app-config endpoint, the one the browser SDK calls itself.\n * Confirmed live: an unknown app id returns HTTP 400\n * `missing_or_invalid_privy_app_id`. The response fields below are NOT\n * verified against a real app (no app id was available when this was written),\n * so every field is treated as optional and maps to \"unknown\" when absent.\n */\nconst PRIVY_APP_CONFIG_URL = \"https://auth.privy.io/api/v1/apps/\";\n\n/** One row of a {@link checkPrivyDashboardConfig} result. */\nexport interface PrivyDashboardCheckItem {\n id: string;\n ok: boolean | \"unknown\";\n detail: string;\n fix?: string;\n}\n\n/**\n * Check the Privy dashboard settings that can be read without a secret, by\n * calling the public app-config endpoint the browser SDK itself uses. Best\n * effort and never throws: anything that cannot be verified (network error,\n * non-200, field missing) is reported as `\"unknown\"`, not as a failure.\n *\n * Only `where: \"dashboard\"` requirements are returned. Env and code\n * requirements cannot be checked from here.\n *\n * @example\n * ```ts\n * import { checkPrivyDashboardConfig } from \"@pepu-chain/sdk/privy\";\n * const r = await checkPrivyDashboardConfig({ appId: \"cl...\", origin: \"http://localhost:3001\" });\n * for (const i of r.items.filter((i) => i.ok === false)) console.log(i.id, i.fix);\n * ```\n */\nexport async function checkPrivyDashboardConfig(o: {\n appId: string;\n origin?: string;\n fetch?: typeof fetch;\n}): Promise<{ ok: boolean; items: PrivyDashboardCheckItem[] }> {\n const rows = PEPU_PRIVY_REQUIREMENTS.filter((r) => r.where === \"dashboard\");\n const unknownAll = (detail: string): { ok: boolean; items: PrivyDashboardCheckItem[] } => ({\n ok: true,\n items: rows.map((r) => ({ id: r.id, ok: \"unknown\", detail, fix: r.fix })),\n });\n\n const appId = o.appId?.trim() ?? \"\";\n if (!appId) return unknownAll(`${PRIVY_ENV.appId} is empty, so nothing could be checked.`);\n\n let cfg: PrivyPublicAppConfig;\n try {\n const doFetch = o.fetch ?? globalThis.fetch;\n const res = await doFetch(`${PRIVY_APP_CONFIG_URL}${encodeURIComponent(appId)}`, {\n headers: {\n \"privy-app-id\": appId,\n ...(o.origin ? { origin: o.origin } : {}),\n },\n });\n if (!res.ok) return unknownAll(`Privy's public app config returned HTTP ${res.status}.`);\n const json: unknown = await res.json();\n if (typeof json !== \"object\" || json === null) return unknownAll(\"Privy's public app config was not an object.\");\n cfg = json as PrivyPublicAppConfig;\n } catch {\n return unknownAll(\"Could not reach Privy's public app config (network error).\");\n }\n\n const items = rows.map((r): PrivyDashboardCheckItem => {\n let result: PrivyRequirementResult = { ok: \"unknown\", detail: \"No automatic check.\" };\n if (r.check) {\n try {\n result = r.check(cfg, o.origin !== undefined ? { origin: o.origin } : {});\n } catch {\n result = { ok: \"unknown\", detail: \"The check could not read Privy's response.\" };\n }\n }\n return result.ok === true\n ? { id: r.id, ok: true, detail: result.detail }\n : { id: r.id, ok: result.ok, detail: result.detail, fix: r.fix };\n });\n // Only a definite failure of a required row fails the report.\n const ok = !items.some((i) => i.ok === false && rows.find((r) => r.id === i.id)?.required);\n return { ok, items };\n}\n\n/**\n * Structurally identical to `DoctorCheck` in `@pepu-chain/sdk/doctor`\n * (defined locally so `/privy` does not import `/doctor`).\n */\nexport interface PrivyDoctorCheck {\n id: string;\n status: \"pass\" | \"fail\" | \"warn\" | \"skip\";\n message: string;\n fix?: string;\n}\n\n/**\n * Adapter matching `PrivyDashboardChecker` from `@pepu-chain/sdk/doctor`, so the\n * doctor can run the Privy dashboard checks: pass it as the doctor's injected\n * checker. Unknown keys fail, env and code rows are skipped (the doctor's env\n * check covers them), and anything Privy did not report is a warning, not a\n * failure. `appSecret` is accepted for signature compatibility and never used\n * or logged. Messages contain no URLs or values.\n *\n * @example\n * ```ts\n * import { privyDashboardChecker } from \"@pepu-chain/sdk/privy\";\n * const checks = await privyDashboardChecker({ appId, requirementKeys: [\"login-methods\"], fetch });\n * ```\n */\nexport async function privyDashboardChecker(input: {\n appId: string;\n requirementKeys: string[];\n appSecret?: string;\n fetch: typeof fetch;\n origin?: string;\n}): Promise<PrivyDoctorCheck[]> {\n const report = await checkPrivyDashboardConfig({\n appId: input.appId,\n fetch: input.fetch,\n ...(input.origin !== undefined ? { origin: input.origin } : {}),\n });\n return input.requirementKeys.map((key): PrivyDoctorCheck => {\n const id = `privy.${key}`;\n const row = PEPU_PRIVY_REQUIREMENTS.find((r) => r.id === key);\n if (!row) {\n return { id, status: \"fail\", message: `Unknown Privy requirement key \"${key}\".`, fix: \"Use a key from PEPU_PRIVY_REQUIREMENTS.\" };\n }\n if (row.where !== \"dashboard\") {\n return { id, status: \"skip\", message: `${row.label}: checked by the env/code checks, not the dashboard.` };\n }\n const item = report.items.find((i) => i.id === key);\n if (!item || item.ok === \"unknown\") {\n return { id, status: \"warn\", message: `${row.label}: could not be verified. ${item?.detail ?? \"\"}`.trim(), fix: row.fix };\n }\n return item.ok\n ? { id, status: \"pass\", message: `${row.label}: ${item.detail}` }\n : { id, status: \"fail\", message: `${row.label}: ${item.detail}`, fix: row.fix };\n });\n}\n"]}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var viem = require('viem');
4
+
5
+ // src/client.ts
6
+ function getPublicClient(chain, options) {
7
+ const transport = options?.transport ?? viem.http();
8
+ return viem.createPublicClient({ chain, transport });
9
+ }
10
+
11
+ exports.getPublicClient = getPublicClient;
12
+ //# sourceMappingURL=chunk-C7IC36XS.cjs.map
13
+ //# sourceMappingURL=chunk-C7IC36XS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":["http","createPublicClient"],"mappings":";;;;;AAWO,SAAS,eAAA,CACd,OACA,OAAA,EACoC;AAIpC,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAaA,SAAA,EAAK;AAC7C,EAAA,OAAOC,uBAAA,CAAmB,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAChD","file":"chunk-C7IC36XS.cjs","sourcesContent":["import { type PublicClient, type Transport, createPublicClient, http } from \"viem\";\n\nimport type { PepuChain } from \"./chains.js\";\n\n/**\n * Create a viem `PublicClient` for a Pepe Unchained V2 chain, defaulting\n * its transport to the chain's first `rpcUrls.default.http` entry.\n *\n * Pass `transport` to use a different RPC endpoint (e.g. an authenticated\n * provider URL) while keeping the rest of the chain definition.\n */\nexport function getPublicClient(\n chain: PepuChain,\n options?: { transport?: Transport },\n): PublicClient<Transport, PepuChain> {\n // `http()` with no URL falls back to `chain.rpcUrls.default.http[0]`\n // internally (see viem's `http` transport), so the chain definition\n // stays the single source of truth for the default RPC endpoint.\n const transport = options?.transport ?? http();\n return createPublicClient({ chain, transport });\n}\n"]}
@@ -0,0 +1,84 @@
1
+ import { PepuPaymasterError, PepuBundlerError, explainError, toPepuError, getErrorEntry } from './chunk-6DSZ4Z2N.js';
2
+
3
+ // src/aa/describe.ts
4
+ var AA_HINTS = {
5
+ AA10: { code: "BUNDLER_AA_FAILED", hint: "The sender is already deployed but initCode was sent. Drop the factory fields." },
6
+ AA13: { code: "BUNDLER_AA_FAILED", hint: "initCode (account factory) reverted. Check the Kernel factory address and the owner." },
7
+ AA14: { code: "BUNDLER_AA_FAILED", hint: "initCode deployed a different address than the sender. Rebuild the account with the same owner and index." },
8
+ 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." },
9
+ AA21: { code: "BUNDLER_AA_FAILED", hint: "The account cannot pay its prefund. Use the paymaster, or fund the account." },
10
+ AA22: { code: "BUNDLER_AA_FAILED", hint: "The UserOperation's validity window expired. Resend a fresh one." },
11
+ AA23: { code: "BUNDLER_AA_FAILED", hint: "Account validation reverted: wrong signer, wrong signature format, or a session policy rejected the call." },
12
+ AA24: { code: "BUNDLER_AA_FAILED", hint: "Signature rejected by the account. Sign with the owner the account was built for." },
13
+ AA25: { code: "BUNDLER_AA_FAILED", hint: "Invalid nonce: another UserOperation from this account is pending. Wait for it, then retry." },
14
+ AA26: { code: "BUNDLER_AA_FAILED", hint: "verificationGasLimit too low. Re-estimate gas." },
15
+ AA31: { code: "PAYMASTER_NO_BALANCE", paymaster: true, hint: "The paymaster's EntryPoint deposit is too low. Deposit more PEPU to the paymaster." },
16
+ AA32: { code: "PAYMASTER_DENIED", paymaster: true, hint: "The paymaster signature expired. Request paymaster data again." },
17
+ AA33: { code: "PAYMASTER_DENIED", paymaster: true, hint: "Paymaster validation reverted. Check the paymaster contract and that its signer matches the policy service." },
18
+ AA34: { code: "PAYMASTER_DENIED", paymaster: true, hint: "Paymaster signature rejected. The policy service signer does not match the paymaster contract." },
19
+ AA36: { code: "BUNDLER_AA_FAILED", paymaster: true, hint: "Paymaster gas limits too low. Re-estimate with the paymaster stub data." },
20
+ AA40: { code: "BUNDLER_AA_FAILED", hint: "Verification used more gas than verificationGasLimit. Re-estimate gas." },
21
+ AA41: { code: "BUNDLER_AA_FAILED", hint: "Paymaster verification used more gas than its limit. Re-estimate gas." },
22
+ AA50: { code: "BUNDLER_AA_FAILED", hint: "The postOp reverted. Check the paymaster's postOp path." },
23
+ AA51: { code: "BUNDLER_AA_FAILED", hint: "Prefund below actualGasCost. Re-estimate fees; PEPU needs fee headroom (the SDK applies 20%)." },
24
+ AA90: { code: "BUNDLER_AA_FAILED", hint: "Invalid beneficiary on handleOps. This is a bundler configuration problem." },
25
+ AA91: { code: "BUNDLER_AA_FAILED", hint: "Failed to send funds to the beneficiary. This is a bundler configuration problem." },
26
+ AA95: { code: "BUNDLER_AA_FAILED", hint: "Out of gas in handleOps. Raise the gas limits." }
27
+ };
28
+ function redactSecrets(text) {
29
+ 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]@");
30
+ }
31
+ function collect(e) {
32
+ const seen = /* @__PURE__ */ new Set();
33
+ const parts = [];
34
+ let cur = e;
35
+ for (let d = 0; d < 8 && cur !== void 0 && cur !== null && !seen.has(cur); d++) {
36
+ seen.add(cur);
37
+ if (typeof cur === "object") {
38
+ const o = cur;
39
+ for (const k of ["shortMessage", "message", "details", "reason"]) {
40
+ const v = o[k];
41
+ if (typeof v === "string" && v.length > 0 && !parts.includes(v)) parts.push(v);
42
+ }
43
+ const data = o["data"];
44
+ if (data && typeof data === "object") {
45
+ const r = data["reason"];
46
+ if (typeof r === "string") parts.push(r);
47
+ }
48
+ cur = o["cause"];
49
+ } else {
50
+ parts.push(String(cur));
51
+ break;
52
+ }
53
+ }
54
+ return parts.join("\n");
55
+ }
56
+ function describeUserOpFailure(e) {
57
+ const text = redactSecrets(collect(e));
58
+ const headline = text.split("\n")[0]?.trim() || "UserOperation failed";
59
+ const opts = (hint) => ({ ...hint ? { hint } : {}, cause: e });
60
+ const aa = /\bAA(\d{2})\b/.exec(text);
61
+ if (aa) {
62
+ const key = `AA${aa[1]}`;
63
+ const info = AA_HINTS[key];
64
+ if (info) {
65
+ const msg = `${key}: ${headline}`;
66
+ return info.paymaster && info.code !== "BUNDLER_AA_FAILED" ? new PepuPaymasterError(info.code, msg, opts(info.hint)) : new PepuBundlerError(info.code, msg, opts(info.hint));
67
+ }
68
+ return new PepuBundlerError("BUNDLER_AA_FAILED", `${key}: ${headline}`, opts());
69
+ }
70
+ const explained = explainError(text);
71
+ if (explained.code.startsWith("PAYMASTER_")) {
72
+ return new PepuPaymasterError(explained.code, headline, opts(explained.fix));
73
+ }
74
+ if (explained.code !== "UNKNOWN") {
75
+ return new PepuBundlerError(explained.code, headline, opts(explained.fix));
76
+ }
77
+ const pe = toPepuError(e);
78
+ if (pe.code !== "UNKNOWN") return new PepuBundlerError(pe.code, redactSecrets(pe.message), opts(pe.hint));
79
+ return new PepuBundlerError("UNKNOWN", headline, opts(getErrorEntry("UNKNOWN").fix));
80
+ }
81
+
82
+ export { describeUserOpFailure, redactSecrets };
83
+ //# sourceMappingURL=chunk-D52PADVY.js.map
84
+ //# sourceMappingURL=chunk-D52PADVY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/aa/describe.ts"],"names":[],"mappings":"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","file":"chunk-D52PADVY.js","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,272 @@
1
+ 'use strict';
2
+
3
+ var chunkNE3QKDOB_cjs = require('./chunk-NE3QKDOB.cjs');
4
+ var chunkC2XW44FI_cjs = require('./chunk-C2XW44FI.cjs');
5
+ var chunkYQL7NISX_cjs = require('./chunk-YQL7NISX.cjs');
6
+ var react = require('react');
7
+ var reactAuth = require('@privy-io/react-auth');
8
+
9
+ // src/privy/ensure-client.ts
10
+ var DEFAULT_ENSURE_ENDPOINT = "/api/wallet/ensure";
11
+ var DEFAULT_ENSURE_REQUEST_TIMEOUT_MS = 2e4;
12
+ var DEFAULT_ENSURE_APPEAR_TIMEOUT_MS = 8e3;
13
+ var KNOWN_CODES = new Set(chunkYQL7NISX_cjs.PEPU_ERROR_CATALOG.map((e) => e.code));
14
+ var isRecord = (v) => typeof v === "object" && v !== null;
15
+ function errorFromEnsureResponse(status, body) {
16
+ const err = isRecord(body) ? body["error"] : void 0;
17
+ if (isRecord(err)) {
18
+ const code = typeof err["code"] === "string" && KNOWN_CODES.has(err["code"]) ? err["code"] : "UNKNOWN";
19
+ const message2 = typeof err["message"] === "string" ? err["message"] : `Wallet setup failed (HTTP ${status}).`;
20
+ const hint = typeof err["hint"] === "string" ? err["hint"] : void 0;
21
+ const opts = { status, ...hint !== void 0 ? { hint } : {} };
22
+ return status === 401 ? new chunkYQL7NISX_cjs.PepuAuthError(code, message2, opts) : new chunkYQL7NISX_cjs.PepuError(code, message2, opts);
23
+ }
24
+ const message = typeof err === "string" ? err : `Wallet setup failed (HTTP ${status}).`;
25
+ if (status === 401) return new chunkYQL7NISX_cjs.PepuAuthError("AUTH_INVALID_TOKEN", message, { status });
26
+ return new chunkYQL7NISX_cjs.PepuError("WALLET_NOT_PROVISIONED", message, { status });
27
+ }
28
+ async function requestEnsureWallet(o) {
29
+ const token = await o.getAccessToken();
30
+ if (!token) {
31
+ throw new chunkYQL7NISX_cjs.PepuAuthError(
32
+ "AUTH_INVALID_TOKEN",
33
+ "Could not get a Privy access token for this session. Try signing in again."
34
+ );
35
+ }
36
+ const controller = new AbortController();
37
+ const timeoutMs = o.timeoutMs ?? DEFAULT_ENSURE_REQUEST_TIMEOUT_MS;
38
+ let timedOut = false;
39
+ const timer = setTimeout(() => {
40
+ timedOut = true;
41
+ controller.abort();
42
+ }, timeoutMs);
43
+ const onAbort = () => controller.abort();
44
+ o.signal?.addEventListener("abort", onAbort);
45
+ try {
46
+ const doFetch = o.fetch ?? globalThis.fetch;
47
+ let response;
48
+ try {
49
+ response = await doFetch(o.endpoint ?? DEFAULT_ENSURE_ENDPOINT, {
50
+ method: "POST",
51
+ headers: { Authorization: `Bearer ${token}` },
52
+ signal: controller.signal
53
+ });
54
+ } catch (e) {
55
+ if (timedOut) {
56
+ throw new chunkYQL7NISX_cjs.PepuError("WALLET_NOT_PROVISIONED", "Wallet setup timed out. Please try again.", {
57
+ retryable: true,
58
+ cause: e
59
+ });
60
+ }
61
+ throw chunkYQL7NISX_cjs.toPepuError(e, { op: "ensure wallet" });
62
+ }
63
+ const body = await response.json().catch(() => null);
64
+ if (!response.ok) throw errorFromEnsureResponse(response.status, body);
65
+ const address = isRecord(body) ? body["address"] : void 0;
66
+ if (typeof address !== "string" || !/^0x[0-9a-fA-F]{40}$/.test(address)) {
67
+ throw new chunkYQL7NISX_cjs.PepuError("WALLET_NOT_PROVISIONED", "The ensure-wallet route did not return a wallet address.", {
68
+ status: 502
69
+ });
70
+ }
71
+ return { address, created: isRecord(body) && body["created"] === true };
72
+ } finally {
73
+ clearTimeout(timer);
74
+ o.signal?.removeEventListener("abort", onAbort);
75
+ }
76
+ }
77
+
78
+ // src/privy/react.ts
79
+ function composeProviders(layers, leaves = []) {
80
+ return function ComposedProviders({ children }) {
81
+ let node = react.createElement(
82
+ react.Fragment,
83
+ null,
84
+ ...leaves.map((Leaf, i) => react.createElement(Leaf, { key: `leaf-${i}` })),
85
+ children
86
+ );
87
+ for (let i = layers.length - 1; i >= 0; i--) {
88
+ const layer = layers[i];
89
+ if (!layer) continue;
90
+ node = react.createElement(layer[0], layer[1], node);
91
+ }
92
+ return node;
93
+ };
94
+ }
95
+ function PepuPrivyProvider(props) {
96
+ const { appId, config, fallback, wrapper, children } = props;
97
+ if (!appId) {
98
+ return react.createElement(
99
+ react.Fragment,
100
+ null,
101
+ fallback ?? react.createElement(
102
+ "div",
103
+ { role: "alert" },
104
+ `Missing ${chunkC2XW44FI_cjs.PRIVY_ENV.appId}. Set it to your Privy app id and restart the dev server.`
105
+ )
106
+ );
107
+ }
108
+ const inner = wrapper ? react.createElement(wrapper, null, children) : children;
109
+ return react.createElement(reactAuth.PrivyProvider, {
110
+ appId,
111
+ config: chunkNE3QKDOB_cjs.createPepuPrivyConfig(config),
112
+ children: inner
113
+ });
114
+ }
115
+ function useEmbeddedWallet() {
116
+ const { wallets, ready } = reactAuth.useWallets();
117
+ const wallet = reactAuth.getEmbeddedConnectedWallet(wallets);
118
+ const external = wallets.filter((w) => w !== wallet);
119
+ return wallet ? { ready, wallet, address: wallet.address, external } : { ready, wallet: null, external };
120
+ }
121
+ function shouldPinEmbeddedWallet(o) {
122
+ if (!o.enabled || !o.ready || !o.embeddedAddress) return false;
123
+ return o.activeAddress?.toLowerCase() !== o.embeddedAddress.toLowerCase();
124
+ }
125
+ function usePinEmbeddedWallet(o) {
126
+ const { enabled, activeAddress, setActiveWallet } = o;
127
+ const { wallets, ready } = reactAuth.useWallets();
128
+ const embedded = reactAuth.getEmbeddedConnectedWallet(wallets);
129
+ const embeddedAddress = embedded?.address;
130
+ react.useEffect(() => {
131
+ if (!embedded) return;
132
+ if (!shouldPinEmbeddedWallet({ enabled, ready, embeddedAddress, activeAddress })) return;
133
+ void setActiveWallet(embedded);
134
+ }, [enabled, ready, embedded, embeddedAddress, activeAddress, setActiveWallet]);
135
+ }
136
+ function useEnsureWallet(o = {}) {
137
+ const endpoint = o.endpoint ?? DEFAULT_ENSURE_ENDPOINT;
138
+ const requestTimeoutMs = o.requestTimeoutMs ?? DEFAULT_ENSURE_REQUEST_TIMEOUT_MS;
139
+ const appearTimeoutMs = o.appearTimeoutMs ?? DEFAULT_ENSURE_APPEAR_TIMEOUT_MS;
140
+ const { ready: privyReady, authenticated, getAccessToken } = reactAuth.usePrivy();
141
+ const { wallets, ready: walletsReady } = reactAuth.useWallets();
142
+ const { refreshUser } = reactAuth.useUser();
143
+ const [error, setError] = react.useState(null);
144
+ const [requesting, setRequesting] = react.useState(false);
145
+ const [confirmed, setConfirmed] = react.useState(null);
146
+ const [stalled, setStalled] = react.useState(false);
147
+ const [attempt, setAttempt] = react.useState(0);
148
+ const settledFor = react.useRef(-1);
149
+ const getAccessTokenRef = react.useRef(getAccessToken);
150
+ const refreshUserRef = react.useRef(refreshUser);
151
+ getAccessTokenRef.current = getAccessToken;
152
+ refreshUserRef.current = refreshUser;
153
+ const embedded = reactAuth.getEmbeddedConnectedWallet(wallets);
154
+ const hasWallet = embedded !== null;
155
+ react.useEffect(() => {
156
+ if (!privyReady || !authenticated || !walletsReady || hasWallet) return;
157
+ if (settledFor.current === attempt) return;
158
+ let cancelled = false;
159
+ const controller = new AbortController();
160
+ setRequesting(true);
161
+ void (async () => {
162
+ try {
163
+ const { address } = await requestEnsureWallet({
164
+ getAccessToken: () => getAccessTokenRef.current(),
165
+ endpoint,
166
+ timeoutMs: requestTimeoutMs,
167
+ signal: controller.signal
168
+ });
169
+ await refreshUserRef.current();
170
+ if (cancelled) return;
171
+ settledFor.current = attempt;
172
+ setConfirmed(address);
173
+ } catch (e) {
174
+ if (cancelled) return;
175
+ settledFor.current = attempt;
176
+ setError(chunkYQL7NISX_cjs.toPepuError(e, { op: "ensure wallet" }));
177
+ } finally {
178
+ if (!cancelled) setRequesting(false);
179
+ }
180
+ })();
181
+ return () => {
182
+ cancelled = true;
183
+ controller.abort();
184
+ };
185
+ }, [privyReady, authenticated, walletsReady, hasWallet, attempt, endpoint, requestTimeoutMs]);
186
+ react.useEffect(() => {
187
+ if (!confirmed || hasWallet) return;
188
+ const id = setTimeout(() => setStalled(true), appearTimeoutMs);
189
+ return () => {
190
+ clearTimeout(id);
191
+ setStalled(false);
192
+ };
193
+ }, [confirmed, hasWallet, appearTimeoutMs]);
194
+ const retry = react.useCallback(() => {
195
+ setError(null);
196
+ setConfirmed(null);
197
+ setStalled(false);
198
+ setRequesting(false);
199
+ setAttempt((n) => n + 1);
200
+ }, []);
201
+ if (hasWallet) return { status: "ready", address: embedded.address, retry };
202
+ if (!privyReady || !authenticated || !walletsReady) return { status: "idle", retry };
203
+ if (error) return { status: "error", error, retry };
204
+ if (stalled && confirmed) return { status: "stalled", address: confirmed, retry };
205
+ if (confirmed) return { status: "checking", address: confirmed, retry };
206
+ return { status: requesting ? "creating" : "checking", retry };
207
+ }
208
+ function WalletGate(p) {
209
+ const ensure = useEnsureWallet(p.endpoint !== void 0 ? { endpoint: p.endpoint } : {});
210
+ if (ensure.status === "ready") return react.createElement(react.Fragment, null, p.children);
211
+ if (ensure.status === "error" && ensure.error) {
212
+ const { error, retry } = ensure;
213
+ return react.createElement(
214
+ react.Fragment,
215
+ null,
216
+ p.error ? p.error(error, retry) : react.createElement(
217
+ "div",
218
+ { role: "alert" },
219
+ react.createElement("p", null, "Could not create your wallet."),
220
+ react.createElement("p", null, error.message),
221
+ react.createElement("button", { type: "button", onClick: retry }, "Try again")
222
+ )
223
+ );
224
+ }
225
+ if (ensure.status === "stalled" && ensure.address) {
226
+ const a = ensure.address;
227
+ const reload = () => globalThis.location.reload();
228
+ if (p.stalled) return react.createElement(react.Fragment, null, p.stalled(a, reload));
229
+ return react.createElement(
230
+ "div",
231
+ { role: "status" },
232
+ react.createElement("p", null, `Your wallet was created (${a.slice(0, 6)}\u2026${a.slice(-4)}), but it has not appeared in this session yet.`),
233
+ react.createElement("p", null, "This is a client sync delay, not a lost wallet. Reloading usually fixes it."),
234
+ react.createElement("button", { type: "button", onClick: reload }, "Reload")
235
+ );
236
+ }
237
+ return react.createElement(
238
+ react.Fragment,
239
+ null,
240
+ p.loading ?? react.createElement("div", { role: "status", "aria-label": "Loading" }, "Setting up your wallet\u2026")
241
+ );
242
+ }
243
+ function usePepuAuthFetch() {
244
+ const { getAccessToken } = reactAuth.usePrivy();
245
+ return react.useCallback(
246
+ async (input, init) => {
247
+ const token = await getAccessToken();
248
+ if (!token) {
249
+ throw new chunkYQL7NISX_cjs.PepuAuthError(
250
+ "AUTH_INVALID_TOKEN",
251
+ "No Privy access token for this session. Sign in again."
252
+ );
253
+ }
254
+ const headers = new Headers(init?.headers);
255
+ headers.set("Authorization", `Bearer ${token}`);
256
+ return fetch(input, { ...init, headers });
257
+ },
258
+ [getAccessToken]
259
+ );
260
+ }
261
+
262
+ exports.PepuPrivyProvider = PepuPrivyProvider;
263
+ exports.WalletGate = WalletGate;
264
+ exports.composeProviders = composeProviders;
265
+ exports.requestEnsureWallet = requestEnsureWallet;
266
+ exports.shouldPinEmbeddedWallet = shouldPinEmbeddedWallet;
267
+ exports.useEmbeddedWallet = useEmbeddedWallet;
268
+ exports.useEnsureWallet = useEnsureWallet;
269
+ exports.usePepuAuthFetch = usePepuAuthFetch;
270
+ exports.usePinEmbeddedWallet = usePinEmbeddedWallet;
271
+ //# sourceMappingURL=chunk-DH6BFNVJ.cjs.map
272
+ //# sourceMappingURL=chunk-DH6BFNVJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/privy/ensure-client.ts","../src/privy/react.ts"],"names":["PEPU_ERROR_CATALOG","message","PepuAuthError","PepuError","toPepuError","createElement","Fragment","PRIVY_ENV","PrivyProvider","createPepuPrivyConfig","useWallets","getEmbeddedConnectedWallet","useEffect","usePrivy","useUser","useState","useRef","useCallback"],"mappings":"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","file":"chunk-DH6BFNVJ.cjs","sourcesContent":["import type { Address } from \"viem\";\nimport { PEPU_ERROR_CATALOG, PepuAuthError, PepuError, toPepuError } from \"../errors.js\";\nimport type { PepuErrorCode } from \"../errors.js\";\n\n/**\n * Framework-free client for the ensure-wallet route. No React, no Privy: the\n * hooks in `./react.ts` wrap it, and tests drive it directly.\n *\n * Ported from templates/consumer-app/components/wallet-gate.tsx (request,\n * timeout and response handling).\n */\n\n/** Default route path, matching `createEnsureWalletRoute()`. */\nexport const DEFAULT_ENSURE_ENDPOINT = \"/api/wallet/ensure\";\n/** Bound on the request itself (consumer-app: ENSURE_REQUEST_TIMEOUT_MS). */\nexport const DEFAULT_ENSURE_REQUEST_TIMEOUT_MS = 20_000;\n/** Bound on waiting for the wallet to show up client-side (consumer-app: APPEAR_IN_CLIENT_TIMEOUT_MS). */\nexport const DEFAULT_ENSURE_APPEAR_TIMEOUT_MS = 8_000;\n\nconst KNOWN_CODES: ReadonlySet<string> = new Set(PEPU_ERROR_CATALOG.map((e) => e.code));\n\nconst isRecord = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null;\n\n/**\n * Turn a non-2xx response body into a typed error. Understands the SDK shape\n * `{ error: { code, message, hint } }` and the legacy `{ error: \"text\" }`.\n */\nexport function errorFromEnsureResponse(status: number, body: unknown): PepuError {\n const err = isRecord(body) ? body[\"error\"] : undefined;\n if (isRecord(err)) {\n const code = typeof err[\"code\"] === \"string\" && KNOWN_CODES.has(err[\"code\"]) ? (err[\"code\"] as PepuErrorCode) : \"UNKNOWN\";\n const message = typeof err[\"message\"] === \"string\" ? err[\"message\"] : `Wallet setup failed (HTTP ${status}).`;\n const hint = typeof err[\"hint\"] === \"string\" ? err[\"hint\"] : undefined;\n const opts = { status, ...(hint !== undefined ? { hint } : {}) };\n return status === 401 ? new PepuAuthError(code, message, opts) : new PepuError(code, message, opts);\n }\n const message = typeof err === \"string\" ? err : `Wallet setup failed (HTTP ${status}).`;\n if (status === 401) return new PepuAuthError(\"AUTH_INVALID_TOKEN\", message, { status });\n return new PepuError(\"WALLET_NOT_PROVISIONED\", message, { status });\n}\n\n/**\n * POST to the ensure-wallet route with the user's Privy access token and return\n * the wallet address. Bounded by a timeout. Never leaks the token in errors.\n *\n * @example\n * ```ts\n * const { address } = await requestEnsureWallet({ getAccessToken, endpoint: \"/api/wallet/ensure\" });\n * ```\n */\nexport async function requestEnsureWallet(o: {\n getAccessToken: () => Promise<string | null>;\n endpoint?: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n signal?: AbortSignal;\n}): Promise<{ address: Address; created: boolean }> {\n const token = await o.getAccessToken();\n if (!token) {\n throw new PepuAuthError(\n \"AUTH_INVALID_TOKEN\",\n \"Could not get a Privy access token for this session. Try signing in again.\",\n );\n }\n const controller = new AbortController();\n const timeoutMs = o.timeoutMs ?? DEFAULT_ENSURE_REQUEST_TIMEOUT_MS;\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n const onAbort = (): void => controller.abort();\n o.signal?.addEventListener(\"abort\", onAbort);\n try {\n const doFetch = o.fetch ?? globalThis.fetch;\n let response: Response;\n try {\n response = await doFetch(o.endpoint ?? DEFAULT_ENSURE_ENDPOINT, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${token}` },\n signal: controller.signal,\n });\n } catch (e) {\n if (timedOut) {\n throw new PepuError(\"WALLET_NOT_PROVISIONED\", \"Wallet setup timed out. Please try again.\", {\n retryable: true,\n cause: e,\n });\n }\n throw toPepuError(e, { op: \"ensure wallet\" });\n }\n const body: unknown = await response.json().catch(() => null);\n if (!response.ok) throw errorFromEnsureResponse(response.status, body);\n const address = isRecord(body) ? body[\"address\"] : undefined;\n if (typeof address !== \"string\" || !/^0x[0-9a-fA-F]{40}$/.test(address)) {\n throw new PepuError(\"WALLET_NOT_PROVISIONED\", \"The ensure-wallet route did not return a wallet address.\", {\n status: 502,\n });\n }\n return { address: address as Address, created: isRecord(body) && body[\"created\"] === true };\n } finally {\n clearTimeout(timer);\n o.signal?.removeEventListener(\"abort\", onAbort);\n }\n}\n","import { createElement, Fragment, useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ComponentType, ReactElement, ReactNode } from \"react\";\nimport { getEmbeddedConnectedWallet, PrivyProvider, usePrivy, useUser, useWallets } from \"@privy-io/react-auth\";\nimport type { ConnectedWallet, PrivyClientConfig } from \"@privy-io/react-auth\";\nimport type { Address } from \"viem\";\nimport { PepuAuthError, PepuError, toPepuError } from \"../errors.js\";\nimport { createPepuPrivyConfig, PRIVY_ENV } from \"./config.js\";\nimport type { CreatePepuPrivyConfigOptions } from \"./config.js\";\nimport {\n DEFAULT_ENSURE_APPEAR_TIMEOUT_MS,\n DEFAULT_ENSURE_ENDPOINT,\n DEFAULT_ENSURE_REQUEST_TIMEOUT_MS,\n requestEnsureWallet,\n} from \"./ensure-client.js\";\n\n/**\n * `@pepu-chain/sdk/privy/react` (browser). Provider, embedded-wallet\n * detection, wallet provisioning and the gate. Add `\"use client\"` in the file\n * where you import these from a Next.js server component.\n *\n * `react` and `@privy-io/react-auth` are optional peers of this entry only.\n */\n\nexport { requestEnsureWallet } from \"./ensure-client.js\";\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface PepuPrivyProviderProps {\n /** Privy app id. When missing, `fallback` renders instead of throwing deep inside Privy. */\n appId: string | undefined;\n /** Overrides for {@link createPepuPrivyConfig}. */\n config?: Partial<CreatePepuPrivyConfigOptions> | undefined;\n /** Shown when `appId` is empty. Defaults to a short notice naming the env variable. */\n fallback?: ReactNode;\n /**\n * Extra providers rendered inside PrivyProvider (used by `/privy/wagmi`).\n * Build one with {@link composeProviders}.\n */\n wrapper?: ComponentType<{ children?: ReactNode }> | undefined;\n children?: ReactNode;\n}\n\n/**\n * Compose providers (outermost first) into one wrapper component, with optional\n * leaf components rendered next to `children` in the innermost position. A\n * building block for `/privy/wagmi`; it keeps `react` imports in this entry.\n *\n * @example\n * ```ts\n * const Wrapper = composeProviders([[QueryClientProvider, { client }]], [MyEffectOnlyComponent]);\n * ```\n */\nexport function composeProviders(\n layers: readonly (readonly [ComponentType<any>, Record<string, unknown>])[], // eslint-disable-line @typescript-eslint/no-explicit-any\n leaves: readonly ComponentType<Record<string, never>>[] = [],\n): ComponentType<{ children?: ReactNode }> {\n return function ComposedProviders({ children }: { children?: ReactNode }): ReactElement {\n let node: ReactElement = createElement(\n Fragment,\n null,\n ...leaves.map((Leaf, i) => createElement(Leaf as ComponentType<{ key?: string }>, { key: `leaf-${i}` })),\n children,\n );\n for (let i = layers.length - 1; i >= 0; i--) {\n const layer = layers[i];\n if (!layer) continue;\n node = createElement(layer[0], layer[1], node);\n }\n return node;\n };\n}\n\n/**\n * `<PrivyProvider>` preconfigured for PEPU: mainnet only, Coinbase pinned to\n * `eoaOnly`, wallet creation off (the server provisions it, see\n * {@link WalletGate}). Renders `fallback` instead of crashing when `appId` is\n * missing.\n *\n * Ported from templates/consumer-app/app/providers.tsx.\n *\n * @example\n * ```tsx\n * <PepuPrivyProvider appId={process.env.NEXT_PUBLIC_PRIVY_APP_ID} config={{ loginMethods: [\"email\", \"google\"] }}>\n * <App />\n * </PepuPrivyProvider>\n * ```\n */\nexport function PepuPrivyProvider(props: PepuPrivyProviderProps): ReactElement {\n const { appId, config, fallback, wrapper, children } = props;\n if (!appId) {\n return createElement(\n Fragment,\n null,\n fallback ??\n createElement(\n \"div\",\n { role: \"alert\" },\n `Missing ${PRIVY_ENV.appId}. Set it to your Privy app id and restart the dev server.`,\n ),\n );\n }\n const inner: ReactNode = wrapper ? createElement(wrapper, null, children) : children;\n return createElement(PrivyProvider, {\n appId,\n config: createPepuPrivyConfig(config) as unknown as PrivyClientConfig,\n children: inner,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Embedded wallet\n// ---------------------------------------------------------------------------\n\n/**\n * This user's Privy embedded wallet, separated from any external wallet Privy\n * is tracking (an installed MetaMask or Phantom). Never re-implements the\n * embedded filter: it calls Privy's `getEmbeddedConnectedWallet`.\n *\n * Ported from templates/consumer-app/lib/wallet.ts (`useWalletSnapshot`).\n *\n * @example\n * ```tsx\n * const { ready, address, external } = useEmbeddedWallet();\n * ```\n */\nexport function useEmbeddedWallet(): {\n ready: boolean;\n wallet: ConnectedWallet | null;\n address?: Address;\n external: ConnectedWallet[];\n} {\n const { wallets, ready } = useWallets();\n const wallet = getEmbeddedConnectedWallet(wallets);\n const external = wallets.filter((w) => w !== wallet);\n return wallet\n ? { ready, wallet, address: wallet.address as Address, external }\n : { ready, wallet: null, external };\n}\n\n/**\n * Pure decision behind the pin hooks: pin only when enabled, hydrated, an\n * embedded wallet exists and the active account is not already it. The address\n * comparison is what prevents a render loop.\n *\n * @example\n * ```ts\n * shouldPinEmbeddedWallet({ enabled: true, ready: true, embeddedAddress: \"0xA\", activeAddress: \"0xB\" }); // true\n * ```\n */\nexport function shouldPinEmbeddedWallet(o: {\n enabled: boolean;\n ready: boolean;\n embeddedAddress: string | undefined;\n activeAddress: string | undefined;\n}): boolean {\n if (!o.enabled || !o.ready || !o.embeddedAddress) return false;\n return o.activeAddress?.toLowerCase() !== o.embeddedAddress.toLowerCase();\n}\n\n/**\n * Generic half of the active-wallet pin: re-asserts the embedded wallet whenever\n * the active account drifts away from it. `useActiveWalletPin` in\n * `/privy/wagmi` supplies wagmi's active address and `setActiveWallet`.\n *\n * Ported from templates/consumer-app/lib/wallet.ts (`useActiveWalletSync`).\n * A user with no embedded wallet is left alone on purpose.\n *\n * @example\n * ```ts\n * usePinEmbeddedWallet({ enabled: true, activeAddress, setActiveWallet });\n * ```\n */\nexport function usePinEmbeddedWallet(o: {\n enabled: boolean;\n activeAddress: string | undefined;\n setActiveWallet: (wallet: ConnectedWallet) => Promise<unknown> | void;\n}): void {\n const { enabled, activeAddress, setActiveWallet } = o;\n const { wallets, ready } = useWallets();\n const embedded = getEmbeddedConnectedWallet(wallets);\n const embeddedAddress = embedded?.address;\n useEffect(() => {\n if (!embedded) return;\n if (!shouldPinEmbeddedWallet({ enabled, ready, embeddedAddress, activeAddress })) return;\n void setActiveWallet(embedded);\n }, [enabled, ready, embedded, embeddedAddress, activeAddress, setActiveWallet]);\n}\n\n// ---------------------------------------------------------------------------\n// Ensure wallet\n// ---------------------------------------------------------------------------\n\ntype FetchInput = Parameters<typeof fetch>[0];\n\nexport type EnsureWalletStatus = \"idle\" | \"checking\" | \"creating\" | \"ready\" | \"stalled\" | \"error\";\n\n/**\n * Provision this user's embedded wallet through the ensure-wallet route (see\n * `createEnsureWalletRoute` in `/privy/server`), not Privy's client-side\n * creation, which hangs for apps with the dashboard's creation setting off.\n * Gates on the EMBEDDED wallet, never on \"any connected wallet\".\n *\n * Ported from templates/consumer-app/components/wallet-gate.tsx.\n *\n * @example\n * ```tsx\n * const { status, address, error, retry } = useEnsureWallet();\n * ```\n */\nexport function useEnsureWallet(o: { endpoint?: string; requestTimeoutMs?: number; appearTimeoutMs?: number } = {}): {\n status: EnsureWalletStatus;\n address?: Address;\n error?: PepuError;\n retry(): void;\n} {\n const endpoint = o.endpoint ?? DEFAULT_ENSURE_ENDPOINT;\n const requestTimeoutMs = o.requestTimeoutMs ?? DEFAULT_ENSURE_REQUEST_TIMEOUT_MS;\n const appearTimeoutMs = o.appearTimeoutMs ?? DEFAULT_ENSURE_APPEAR_TIMEOUT_MS;\n\n const { ready: privyReady, authenticated, getAccessToken } = usePrivy();\n const { wallets, ready: walletsReady } = useWallets();\n const { refreshUser } = useUser();\n\n const [error, setError] = useState<PepuError | null>(null);\n const [requesting, setRequesting] = useState(false);\n const [confirmed, setConfirmed] = useState<Address | null>(null);\n const [stalled, setStalled] = useState(false);\n const [attempt, setAttempt] = useState(0);\n // The attempt number whose request already settled. An unsettled attempt is\n // restarted if the effect re-runs (React StrictMode mounts effects twice), a\n // settled one never is, so a re-render cannot trigger a second POST.\n const settledFor = useRef(-1);\n // Latest Privy callbacks, kept out of the effect deps so a new function\n // identity never cancels an in-flight request.\n const getAccessTokenRef = useRef(getAccessToken);\n const refreshUserRef = useRef(refreshUser);\n getAccessTokenRef.current = getAccessToken;\n refreshUserRef.current = refreshUser;\n\n const embedded = getEmbeddedConnectedWallet(wallets);\n const hasWallet = embedded !== null;\n\n useEffect(() => {\n if (!privyReady || !authenticated || !walletsReady || hasWallet) return;\n if (settledFor.current === attempt) return;\n\n let cancelled = false;\n const controller = new AbortController();\n setRequesting(true);\n void (async () => {\n try {\n const { address } = await requestEnsureWallet({\n getAccessToken: () => getAccessTokenRef.current(),\n endpoint,\n timeoutMs: requestTimeoutMs,\n signal: controller.signal,\n });\n // Pull the server-side change into Privy's client state without a reload.\n await refreshUserRef.current();\n if (cancelled) return;\n settledFor.current = attempt;\n setConfirmed(address);\n } catch (e) {\n if (cancelled) return;\n settledFor.current = attempt;\n setError(toPepuError(e, { op: \"ensure wallet\" }));\n } finally {\n if (!cancelled) setRequesting(false);\n }\n })();\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [privyReady, authenticated, walletsReady, hasWallet, attempt, endpoint, requestTimeoutMs]);\n\n // Bounded safety net: the server confirmed the wallet, the client never saw it.\n useEffect(() => {\n if (!confirmed || hasWallet) return;\n const id = setTimeout(() => setStalled(true), appearTimeoutMs);\n return () => {\n clearTimeout(id);\n setStalled(false);\n };\n }, [confirmed, hasWallet, appearTimeoutMs]);\n\n const retry = useCallback((): void => {\n setError(null);\n setConfirmed(null);\n setStalled(false);\n setRequesting(false);\n setAttempt((n) => n + 1);\n }, []);\n\n if (hasWallet) return { status: \"ready\", address: embedded.address as Address, retry };\n if (!privyReady || !authenticated || !walletsReady) return { status: \"idle\", retry };\n if (error) return { status: \"error\", error, retry };\n if (stalled && confirmed) return { status: \"stalled\", address: confirmed, retry };\n if (confirmed) return { status: \"checking\", address: confirmed, retry };\n return { status: requesting ? \"creating\" : \"checking\", retry };\n}\n\n/**\n * Renders `children` once the user's embedded wallet exists, provisioning it\n * first through the ensure-wallet route. Shows `loading`, an error (with\n * retry) or a reload prompt when the wallet exists but has not synced yet.\n * Each of the three states takes a render prop (`loading`, `error`, `stalled`)\n * so an app can use the gate directly with its own markup and classes.\n *\n * Ported from templates/consumer-app/components/wallet-gate.tsx.\n *\n * @example\n * ```tsx\n * <WalletGate\n * loading={<Spinner />}\n * error={(e, retry) => <button onClick={retry}>{e.message}</button>}\n * stalled={(address, reload) => <button onClick={reload}>Reload ({address})</button>}\n * >\n * <Dashboard />\n * </WalletGate>\n * ```\n */\nexport function WalletGate(p: {\n endpoint?: string;\n loading?: ReactNode;\n error?: (e: PepuError, retry: () => void) => ReactNode;\n /**\n * The server confirmed the wallet but this session has not seen it after a\n * bounded wait (a client sync delay). `reload` reloads the page.\n */\n stalled?: (address: Address, reload: () => void) => ReactNode;\n children: ReactNode;\n}): ReactElement {\n const ensure = useEnsureWallet(p.endpoint !== undefined ? { endpoint: p.endpoint } : {});\n if (ensure.status === \"ready\") return createElement(Fragment, null, p.children);\n\n if (ensure.status === \"error\" && ensure.error) {\n const { error, retry } = ensure;\n return createElement(\n Fragment,\n null,\n p.error\n ? p.error(error, retry)\n : createElement(\n \"div\",\n { role: \"alert\" },\n createElement(\"p\", null, \"Could not create your wallet.\"),\n createElement(\"p\", null, error.message),\n createElement(\"button\", { type: \"button\", onClick: retry }, \"Try again\"),\n ),\n );\n }\n\n if (ensure.status === \"stalled\" && ensure.address) {\n const a = ensure.address;\n const reload = (): void => (globalThis as unknown as { location: { reload(): void } }).location.reload();\n if (p.stalled) return createElement(Fragment, null, p.stalled(a, reload));\n return createElement(\n \"div\",\n { role: \"status\" },\n createElement(\"p\", null, `Your wallet was created (${a.slice(0, 6)}…${a.slice(-4)}), but it has not appeared in this session yet.`),\n createElement(\"p\", null, \"This is a client sync delay, not a lost wallet. Reloading usually fixes it.\"),\n createElement(\"button\", { type: \"button\", onClick: reload }, \"Reload\"),\n );\n }\n\n return createElement(\n Fragment,\n null,\n p.loading ?? createElement(\"div\", { role: \"status\", \"aria-label\": \"Loading\" }, \"Setting up your wallet…\"),\n );\n}\n\n// ---------------------------------------------------------------------------\n// Authenticated fetch\n// ---------------------------------------------------------------------------\n\n/**\n * A `fetch` that attaches `Authorization: Bearer <Privy access token>`. Throws\n * {@link PepuAuthError} when there is no token (signed out or expired).\n *\n * @example\n * ```tsx\n * const authFetch = usePepuAuthFetch();\n * const res = await authFetch(\"/api/session/status\");\n * ```\n */\nexport function usePepuAuthFetch(): (input: FetchInput, init?: RequestInit) => Promise<Response> {\n const { getAccessToken } = usePrivy();\n return useCallback(\n async (input: FetchInput, init?: RequestInit): Promise<Response> => {\n const token = await getAccessToken();\n if (!token) {\n throw new PepuAuthError(\n \"AUTH_INVALID_TOKEN\",\n \"No Privy access token for this session. Sign in again.\",\n );\n }\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", `Bearer ${token}`);\n return fetch(input, { ...init, headers });\n },\n [getAccessToken],\n );\n}\n"]}
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ var viem = require('viem');
4
+
5
+ // src/chains.ts
6
+ var pepuMainnet = /* @__PURE__ */ viem.defineChain({
7
+ id: 97741,
8
+ name: "Pepe Unchained V2",
9
+ nativeCurrency: {
10
+ name: "Pepe Unchained",
11
+ symbol: "PEPU",
12
+ decimals: 18
13
+ },
14
+ rpcUrls: {
15
+ default: {
16
+ http: ["https://rpc-pepu-v2-mainnet-0.t.conduit.xyz"]
17
+ }
18
+ },
19
+ blockExplorers: {
20
+ default: {
21
+ name: "PepuScan",
22
+ url: "https://pepuscan.com",
23
+ apiUrl: "https://pepuscan.com/api"
24
+ }
25
+ },
26
+ contracts: {
27
+ multicall3: {
28
+ address: "0x9CE19273Ae9c24437DFF512E8DFCAed4E4B001bd",
29
+ blockCreated: 10521048
30
+ }
31
+ },
32
+ // IMPORTANT: that Multicall3 address is PEPU-specific and deliberately
33
+ // NOT the canonical 0xcA11bde05977b3631167028862bE2a173976CA11.
34
+ //
35
+ // The canonical address is structurally unreachable on this chain: it
36
+ // was created elsewhere by a pre-signed CREATE transaction carrying a
37
+ // hardcoded 1,000,000 gas limit, and this Arbitrum Nitro chain needs
38
+ // ~14.3M gas for the same bytecode, so that transaction can never
39
+ // execute here. Conduit support confirmed there is no predeploy and
40
+ // that deploying our own is the supported path.
41
+ //
42
+ // Ours was built from the canonical mds1/multicall3 source (solc
43
+ // 0.8.12, optimizer 10,000,000 runs) and deployed through the CREATE2
44
+ // deterministic deployer with a zero salt, so the address is
45
+ // reproducible from the same inputs. It is verified on pepuscan, and
46
+ // viem's `multicall` has been confirmed working against it.
47
+ //
48
+ // Never substitute the canonical address here — viem/wagmi would call
49
+ // an address with no code and every batched read would fail.
50
+ testnet: false
51
+ });
52
+ var pepuTestnet = /* @__PURE__ */ viem.defineChain({
53
+ id: 97740,
54
+ name: "Pepe Unchained V2 Testnet",
55
+ nativeCurrency: {
56
+ name: "Pepe Unchained",
57
+ symbol: "PEPU",
58
+ decimals: 18
59
+ },
60
+ rpcUrls: {
61
+ default: {
62
+ http: ["https://rpc-pepu-v2-testnet-vn4qxxp9og.t.conduit.xyz"]
63
+ }
64
+ },
65
+ // No `blockExplorers` entry: `pepuscan.com` is a Blockscout instance
66
+ // registered against mainnet (chain 97741) specifically. Blockscout
67
+ // instances index one chain each, so pointing the testnet definition at
68
+ // the mainnet explorer would silently produce wrong/empty links for
69
+ // testnet transactions and addresses. No verified Blockscout (or other)
70
+ // explorer for chain 97740 was available at the time this package was
71
+ // written. Add `blockExplorers.default` here once one is confirmed live.
72
+ // See the mainnet definition above: Multicall3 is not deployed at the
73
+ // canonical address on this chain either (no `contracts.multicall3`
74
+ // here), and must not be faked with a placeholder.
75
+ testnet: true
76
+ });
77
+ var pepuChains = [pepuMainnet, pepuTestnet];
78
+ function isPepuChain(chainId) {
79
+ return pepuChains.some((chain) => chain.id === chainId);
80
+ }
81
+
82
+ exports.isPepuChain = isPepuChain;
83
+ exports.pepuChains = pepuChains;
84
+ exports.pepuMainnet = pepuMainnet;
85
+ exports.pepuTestnet = pepuTestnet;
86
+ //# sourceMappingURL=chunk-DPCZJLB3.cjs.map
87
+ //# sourceMappingURL=chunk-DPCZJLB3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chains.ts"],"names":["defineChain"],"mappings":";;;;;AAQO,IAAM,8BAA4BA,gBAAA,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,8BAA4BA,gBAAA,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-DPCZJLB3.cjs","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"]}