@oakagentkit/core 0.3.4 → 0.3.5

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 (247) hide show
  1. package/build/dist/api/history.js +1 -1
  2. package/build/dist/api/modules/borro/index.js +1 -1
  3. package/build/dist/api/modules/borro/positions.js +1 -1
  4. package/build/dist/api/modules/borro/reader.js +1 -1
  5. package/build/dist/api/modules/chop/actions.d.ts +13 -1
  6. package/build/dist/api/modules/chop/actions.js +1 -1
  7. package/build/dist/api/modules/chop/checks.js +1 -1
  8. package/build/dist/api/modules/chop/copy.d.ts +1 -0
  9. package/build/dist/api/modules/chop/copy.js +1 -1
  10. package/build/dist/api/modules/chop/display.d.ts +36 -0
  11. package/build/dist/api/modules/chop/display.js +1 -0
  12. package/build/dist/api/modules/chop/guard.js +1 -1
  13. package/build/dist/api/modules/chop/index.js +1 -1
  14. package/build/dist/api/modules/chop/pins.d.ts +1 -0
  15. package/build/dist/api/modules/chop/pins.js +1 -1
  16. package/build/dist/api/modules/chop/positions.js +1 -1
  17. package/build/dist/api/modules/chop/reader.d.ts +6 -1
  18. package/build/dist/api/modules/chop/reader.js +1 -1
  19. package/build/dist/api/modules/chop/types.d.ts +7 -0
  20. package/build/dist/api/modules/chop/unfarm.d.ts +16 -0
  21. package/build/dist/api/modules/chop/unfarm.js +1 -0
  22. package/build/dist/api/modules/clanker/index.js +1 -1
  23. package/build/dist/api/modules/earn/index.js +1 -1
  24. package/build/dist/api/modules/erc8004/index.js +1 -1
  25. package/build/dist/api/modules/factor/actions.js +1 -1
  26. package/build/dist/api/modules/factor/api.js +1 -1
  27. package/build/dist/api/modules/factor/checks.js +1 -1
  28. package/build/dist/api/modules/factor/copy.d.ts +11 -11
  29. package/build/dist/api/modules/factor/copy.js +1 -1
  30. package/build/dist/api/modules/factor/guard.js +1 -1
  31. package/build/dist/api/modules/factor/index.js +1 -1
  32. package/build/dist/api/modules/factor/reader.js +1 -1
  33. package/build/dist/api/modules/fobo/client.js +1 -1
  34. package/build/dist/api/modules/fobo/index.js +1 -1
  35. package/build/dist/api/modules/gloam/index.js +1 -1
  36. package/build/dist/api/modules/grove/index.js +1 -1
  37. package/build/dist/api/modules/heyresearch/builder-feed.js +1 -1
  38. package/build/dist/api/modules/heyresearch/index.js +1 -1
  39. package/build/dist/api/modules/heyresearch/public-reads.js +1 -1
  40. package/build/dist/api/modules/heyresearch/scan.js +1 -1
  41. package/build/dist/api/modules/heyresearch/token-facts.js +1 -1
  42. package/build/dist/api/modules/hoodlock/airdrop.js +1 -1
  43. package/build/dist/api/modules/hoodlock/fee.js +1 -1
  44. package/build/dist/api/modules/hoodlock/guard.js +1 -1
  45. package/build/dist/api/modules/hoodlock/index.js +1 -1
  46. package/build/dist/api/modules/hoodlock/lifecycle.js +1 -1
  47. package/build/dist/api/modules/hoodlock/locks-burn.js +1 -1
  48. package/build/dist/api/modules/hoodlock/public.js +1 -1
  49. package/build/dist/api/modules/hookr/actions.js +1 -1
  50. package/build/dist/api/modules/hookr/create-cancel.js +1 -1
  51. package/build/dist/api/modules/hookr/discovery.js +1 -1
  52. package/build/dist/api/modules/hookr/fill-bounty.js +1 -1
  53. package/build/dist/api/modules/hookr/index.js +1 -1
  54. package/build/dist/api/modules/hookr/launch-receipt.js +1 -1
  55. package/build/dist/api/modules/hookr/launch.js +1 -1
  56. package/build/dist/api/modules/hookr/liquidity.js +1 -1
  57. package/build/dist/api/modules/hookr/lp-positions.js +1 -1
  58. package/build/dist/api/modules/hookr/lp-reads.js +1 -1
  59. package/build/dist/api/modules/hookr/lp-receipt.js +1 -1
  60. package/build/dist/api/modules/hookr/lp-state.js +1 -1
  61. package/build/dist/api/modules/hookr/public-reads.js +1 -1
  62. package/build/dist/api/modules/hookr/relay.js +1 -1
  63. package/build/dist/api/modules/layerbank/actions.js +1 -1
  64. package/build/dist/api/modules/layerbank/index.js +1 -1
  65. package/build/dist/api/modules/layerbank/reader.js +1 -1
  66. package/build/dist/api/modules/longbow/administration.js +1 -1
  67. package/build/dist/api/modules/longbow/fixed.js +1 -1
  68. package/build/dist/api/modules/longbow/index.js +1 -1
  69. package/build/dist/api/modules/meridian/index.js +1 -1
  70. package/build/dist/api/modules/merkl/discovery.js +1 -1
  71. package/build/dist/api/modules/merkl/index.js +1 -1
  72. package/build/dist/api/modules/merkl/manage.js +1 -1
  73. package/build/dist/api/modules/morpho/bundles.js +1 -1
  74. package/build/dist/api/modules/morpho/in-kind.js +1 -1
  75. package/build/dist/api/modules/morpho/index.js +1 -1
  76. package/build/dist/api/modules/morpho/local-guard.js +1 -1
  77. package/build/dist/api/modules/morpho/midnight.js +1 -1
  78. package/build/dist/api/modules/morpho/protocol.js +1 -1
  79. package/build/dist/api/modules/morpho/vault-tools.js +1 -1
  80. package/build/dist/api/modules/netnet/card-plan.js +1 -1
  81. package/build/dist/api/modules/netnet/card-read.js +1 -1
  82. package/build/dist/api/modules/netnet/card-recovery.js +1 -1
  83. package/build/dist/api/modules/netnet/desk-action.js +1 -1
  84. package/build/dist/api/modules/netnet/financial.js +1 -1
  85. package/build/dist/api/modules/netnet/index.js +1 -1
  86. package/build/dist/api/modules/pendle/index.js +1 -1
  87. package/build/dist/api/modules/pendle/reader.js +1 -1
  88. package/build/dist/api/modules/pendle/trade.js +1 -1
  89. package/build/dist/api/modules/pons/index.js +1 -1
  90. package/build/dist/api/modules/priors/coverage.js +1 -1
  91. package/build/dist/api/modules/priors/discovery.js +1 -1
  92. package/build/dist/api/modules/priors/index.js +1 -1
  93. package/build/dist/api/modules/priors/integration.js +1 -1
  94. package/build/dist/api/modules/priors/stock-swap.js +1 -1
  95. package/build/dist/api/modules/raeto/index.js +1 -1
  96. package/build/dist/api/modules/relay/index.js +1 -1
  97. package/build/dist/api/modules/relay/outbound-status.js +1 -1
  98. package/build/dist/api/modules/spark/index.js +1 -1
  99. package/build/dist/api/modules/steakhouse/index.js +1 -1
  100. package/build/dist/api/modules/steakhouse/local-guard.js +1 -1
  101. package/build/dist/api/modules/steakhouse/management.js +1 -1
  102. package/build/dist/api/modules/steakhouse/v2-exit.js +1 -1
  103. package/build/dist/api/modules/tickerspring/basket-routes.js +1 -1
  104. package/build/dist/api/modules/tickerspring/contract-reads.js +1 -1
  105. package/build/dist/api/modules/tickerspring/exit-preview.js +1 -1
  106. package/build/dist/api/modules/tickerspring/guards.js +1 -1
  107. package/build/dist/api/modules/tickerspring/index.js +1 -1
  108. package/build/dist/api/modules/tickerspring/journeys.js +1 -1
  109. package/build/dist/api/modules/tickerspring/ladder.js +1 -1
  110. package/build/dist/api/modules/tickerspring/maker.js +1 -1
  111. package/build/dist/api/modules/tickerspring/order-accounting.js +1 -1
  112. package/build/dist/api/modules/tickerspring/research.js +1 -1
  113. package/build/dist/api/modules/tickerspring/strategies.js +1 -1
  114. package/build/dist/api/modules/uniswap/auction-create.js +1 -1
  115. package/build/dist/api/modules/uniswap/auction.js +1 -1
  116. package/build/dist/api/modules/uniswap/batch.js +1 -1
  117. package/build/dist/api/modules/uniswap/common.js +1 -1
  118. package/build/dist/api/modules/uniswap/fees.js +1 -1
  119. package/build/dist/api/modules/uniswap/index.js +1 -1
  120. package/build/dist/api/modules/uniswap/local-guard.js +1 -1
  121. package/build/dist/api/modules/uniswap/oracle.js +1 -1
  122. package/build/dist/api/modules/uniswap/pool-math.js +1 -1
  123. package/build/dist/api/modules/uniswap/pools.js +1 -1
  124. package/build/dist/api/modules/uniswap/position.js +1 -1
  125. package/build/dist/api/modules/uniswap/protocol.js +1 -1
  126. package/build/dist/api/modules/uniswap/quote-guard.js +1 -1
  127. package/build/dist/api/modules/uniswap/token-jar.js +1 -1
  128. package/build/dist/api/modules/uniswap/trade-batch.js +1 -1
  129. package/build/dist/api/modules/uniswap/trade.js +1 -1
  130. package/build/dist/api/modules/uniswap/v2.js +1 -1
  131. package/build/dist/api/modules/uniswap/v3.js +1 -1
  132. package/build/dist/api/modules/uniswap/v4.js +1 -1
  133. package/build/dist/api/modules/uniswap/wrap.js +1 -1
  134. package/build/dist/api/modules/upoch/index.js +1 -1
  135. package/build/dist/api/modules/upoch/reads.js +1 -1
  136. package/build/dist/api/modules/wormhole/index.js +1 -1
  137. package/build/dist/api/prices.d.ts +5 -0
  138. package/build/dist/api/prices.js +1 -1
  139. package/build/dist/api/send.js +1 -1
  140. package/build/dist/api/signing-registry.js +1 -1
  141. package/build/dist/api/tokens.d.ts +1 -0
  142. package/build/dist/api/tokens.js +1 -1
  143. package/build/dist/api/usd-estimate.d.ts +2 -0
  144. package/build/dist/api/usd-estimate.js +1 -1
  145. package/build/dist/chunks/{UBVE2U6X.js → 2FOI2625.js} +1 -1
  146. package/build/dist/chunks/{5OTQCE2E.js → 2I7XHRTI.js} +1 -1
  147. package/build/dist/chunks/{SGHSCK22.js → 2PS4GCOZ.js} +1 -1
  148. package/build/dist/chunks/3BQ5XHDJ.js +1 -0
  149. package/build/dist/chunks/{PRBIC3UK.js → 3YH5B5NQ.js} +1 -1
  150. package/build/dist/chunks/{RUSXMQSJ.js → 4HQEJHCD.js} +1 -1
  151. package/build/dist/chunks/{ZFRTBBIW.js → 4IOHSX3Z.js} +1 -1
  152. package/build/dist/chunks/5H7NVE6O.js +1 -0
  153. package/build/dist/chunks/{JJGZ7W3V.js → 6AS3TGOX.js} +1 -1
  154. package/build/dist/chunks/{RK3PPFRX.js → 6CKCZJ3F.js} +1 -1
  155. package/build/dist/chunks/{HU2JXDLH.js → 6LVHN33V.js} +1 -1
  156. package/build/dist/chunks/7OOCAZBE.js +1 -0
  157. package/build/dist/chunks/{O3XWE4FO.js → 7TRO6MBQ.js} +1 -1
  158. package/build/dist/chunks/{WX7OYCNS.js → A4FLWHLP.js} +1 -1
  159. package/build/dist/chunks/{FP7DHVK2.js → A4K5GXVO.js} +1 -1
  160. package/build/dist/chunks/{AOX6DKYU.js → AL6UXNGH.js} +1 -1
  161. package/build/dist/chunks/{FQTO7VJG.js → C57DITTF.js} +1 -1
  162. package/build/dist/chunks/{ZTX4WT62.js → CFPJDLTZ.js} +1 -1
  163. package/build/dist/chunks/{SRHVSNPX.js → CNDIAF3P.js} +1 -1
  164. package/build/dist/chunks/{LEHBRAZX.js → CW37EGPL.js} +1 -1
  165. package/build/dist/chunks/{PQG3ULRT.js → DBOGRUPS.js} +1 -1
  166. package/build/dist/chunks/{T3QEN3S6.js → E47UYYK4.js} +1 -1
  167. package/build/dist/chunks/EPOIAXCV.js +3 -0
  168. package/build/dist/chunks/{DWQJ7NSX.js → FCVH4FYH.js} +1 -1
  169. package/build/dist/chunks/{V6EVQWAL.js → FHB7QYJO.js} +1 -1
  170. package/build/dist/chunks/FRT6AC6M.js +1 -0
  171. package/build/dist/chunks/{Z5YI6KLN.js → FRVCSDKU.js} +1 -1
  172. package/build/dist/chunks/{EIE2U4OX.js → G5AMH4IP.js} +1 -1
  173. package/build/dist/chunks/{EQEMI54U.js → GDUKZYE2.js} +1 -1
  174. package/build/dist/chunks/{GNOHIL4Q.js → GKUPC4DO.js} +1 -1
  175. package/build/dist/chunks/{K7HTDKAT.js → GMMTHTCP.js} +1 -1
  176. package/build/dist/chunks/{XHFAF5PZ.js → HDBZZOHJ.js} +1 -1
  177. package/build/dist/chunks/{Q4HSQL65.js → HPS4KOU4.js} +1 -1
  178. package/build/dist/chunks/IZP3EKKS.js +1 -0
  179. package/build/dist/chunks/{P6MPKIU2.js → J7OZLXSG.js} +1 -1
  180. package/build/dist/chunks/{PXUML7HJ.js → JDHPMS7X.js} +1 -1
  181. package/build/dist/chunks/{MOZBDCVV.js → JJSCDDQO.js} +1 -1
  182. package/build/dist/chunks/{EFESPGA2.js → KCZUJ57H.js} +1 -1
  183. package/build/dist/chunks/{2ILYVUFA.js → KKTOBXIT.js} +1 -1
  184. package/build/dist/chunks/{L6CVMDWQ.js → KO7ANIKY.js} +1 -1
  185. package/build/dist/chunks/{2T6O77QZ.js → LKUZAJPZ.js} +1 -1
  186. package/build/dist/chunks/{5GQJVKVY.js → LZM3DO5Q.js} +1 -1
  187. package/build/dist/chunks/M6JNGU4E.js +1 -0
  188. package/build/dist/chunks/{MEB727X5.js → M7OVMIIE.js} +1 -1
  189. package/build/dist/chunks/{RKM62HC5.js → MJGEGNDU.js} +1 -1
  190. package/build/dist/chunks/{SYERFEJ4.js → MQXSCNUL.js} +1 -1
  191. package/build/dist/chunks/N624NR7Y.js +1 -0
  192. package/build/dist/chunks/{X3YEDVRN.js → N65J3L2H.js} +1 -1
  193. package/build/dist/chunks/{2TX7HP6M.js → N742W5KX.js} +1 -1
  194. package/build/dist/chunks/{365B4YEV.js → NIWAVMDR.js} +1 -1
  195. package/build/dist/chunks/O2QBSINK.js +1 -0
  196. package/build/dist/chunks/{FA3GBXQP.js → O4P5IQCP.js} +1 -1
  197. package/build/dist/chunks/{HUKDISRE.js → OB3YMTDI.js} +1 -1
  198. package/build/dist/chunks/{WXZ4LAKO.js → PV7FEVBD.js} +1 -1
  199. package/build/dist/chunks/{4M6XBG6X.js → Q3Q3YHEX.js} +1 -1
  200. package/build/dist/chunks/QA6Z2CYP.js +2 -0
  201. package/build/dist/chunks/{BDLV42SD.js → QBNASL3T.js} +1 -1
  202. package/build/dist/chunks/{AHUCYDBC.js → QKIQ7ZKD.js} +1 -1
  203. package/build/dist/chunks/{7FYM7FJA.js → QMIH6HXH.js} +1 -1
  204. package/build/dist/chunks/{2QP6WGKZ.js → QQD4PV64.js} +1 -1
  205. package/build/dist/chunks/{KNBNKG7P.js → R66NSNNQ.js} +1 -1
  206. package/build/dist/chunks/{VQJXQLFW.js → RP5VCG54.js} +1 -1
  207. package/build/dist/chunks/{OKXKDDBX.js → RUHNLNVX.js} +1 -1
  208. package/build/dist/chunks/{VKNKVUAA.js → S37D7HOK.js} +1 -1
  209. package/build/dist/chunks/S47M3IPR.js +1 -0
  210. package/build/dist/chunks/S65KXMZ7.js +3 -0
  211. package/build/dist/chunks/{NYHKIXJR.js → SX5YNFHG.js} +1 -1
  212. package/build/dist/chunks/{MHONMLF6.js → TGXEKBLV.js} +1 -1
  213. package/build/dist/chunks/{VHK5AYC2.js → TJU644I7.js} +1 -1
  214. package/build/dist/chunks/{O56EZB5Y.js → TOIKOIY6.js} +1 -1
  215. package/build/dist/chunks/{YR44GQG4.js → TZ7S5KRB.js} +1 -1
  216. package/build/dist/chunks/UEOS6SHR.js +1 -0
  217. package/build/dist/chunks/{USZCTSPI.js → USGMGKAG.js} +1 -1
  218. package/build/dist/chunks/{W5FM2OVB.js → UUF4Z6K6.js} +1 -1
  219. package/build/dist/chunks/{PMFR47H3.js → VREGY7E6.js} +1 -1
  220. package/build/dist/chunks/{2YYKQGJZ.js → W7BFM6CK.js} +1 -1
  221. package/build/dist/chunks/{3D7FXI6G.js → WQ2XTDHO.js} +1 -1
  222. package/build/dist/chunks/WRA3ZC6W.js +1 -0
  223. package/build/dist/chunks/{K3TZYPSV.js → XADHV2DT.js} +1 -1
  224. package/build/dist/chunks/{LVFI74ST.js → XNJ6NDQQ.js} +1 -1
  225. package/build/dist/chunks/{DD47RZFU.js → XTXXWRN2.js} +1 -1
  226. package/build/dist/chunks/{CZ66MYKR.js → XWC6IC5E.js} +1 -1
  227. package/build/dist/chunks/{DMB64UIN.js → YWVPK3DV.js} +1 -1
  228. package/build/dist/chunks/{WNWRF4HE.js → YZHJ4BAP.js} +1 -1
  229. package/build/dist/chunks/{4PB6MSGZ.js → ZKBOPZH5.js} +1 -1
  230. package/build/dist/chunks/{5ZVIAGLX.js → ZQPC54J5.js} +1 -1
  231. package/build/dist/chunks/{HDBDBKEA.js → ZVY7GGSP.js} +1 -1
  232. package/build/dist/chunks/{LQSPWRHN.js → ZX43P4BK.js} +1 -1
  233. package/build/dist/chunks/{PQOWIRKQ.js → ZXFJKW6H.js} +1 -1
  234. package/build/dist/chunks/{N6PHSHBE.js → ZXRIJG6H.js} +1 -1
  235. package/package.json +1 -1
  236. package/build/dist/chunks/3AOTYJPX.js +0 -1
  237. package/build/dist/chunks/4E7FJQLL.js +0 -1
  238. package/build/dist/chunks/4J245N3F.js +0 -1
  239. package/build/dist/chunks/BA66J5YQ.js +0 -1
  240. package/build/dist/chunks/BIY2F6MO.js +0 -1
  241. package/build/dist/chunks/DGCJZ3HO.js +0 -1
  242. package/build/dist/chunks/DHX3Q5RV.js +0 -2
  243. package/build/dist/chunks/EFUACKDK.js +0 -1
  244. package/build/dist/chunks/JW7GLNLB.js +0 -3
  245. package/build/dist/chunks/MIKQWF6Q.js +0 -3
  246. package/build/dist/chunks/P7C3TYI4.js +0 -1
  247. package/build/dist/chunks/ZNX3YVF2.js +0 -1
@@ -1 +1 @@
1
- import{b as s}from"./NYHKIXJR.js";import{a as o,c as t}from"./VXCGMALF.js";import{getAddress as i}from"viem";var f=new Set(["priors_status",...s,...t.filter(r=>r.read).map(r=>r.name),"priors_ethos_status","priors_request_borrow","priors_request_repay","priors_request_stock","priors_request_backing","priors_pt_quote","priors_pt_position","priors_stock_quote","priors_savings_liquidity","priors_market_origin","priors_market_pins","priors_capabilities"]),p=new Set(["priors_sign_consent",...t.filter(r=>r.consentRoot).map(r=>r.name)]),u=new Set([...p,"priors_starter_line"]),R=new Set([...t.filter(r=>!r.read).map(r=>r.name),"priors_root_offer","priors_autopay_on","priors_autopay_off","priors_pt_buy","priors_pt_sell","priors_pt_redeem","priors_savings_force_withdraw","priors_stock_swap","priors_market_clear_bid_budget","priors_market_revoke_nft","priors_x_link"]),S=["priors_lend","priors_withdraw","priors_borrow","priors_repay","priors_starter_line","priors_close_line","priors_release_bond"];function c(r){let _=t.find(e=>e.name===r);return _?[o[_.contract],..._.approval==="bid"?[o.bidSpender]:[]]:r==="priors_root_offer"?[o.pool]:r==="priors_autopay_on"||r==="priors_autopay_off"?[o.autopay]:r==="priors_savings_force_withdraw"?[o.savings]:r==="priors_stock_swap"?[i("0xCaf681a66D020601342297493863E78C959E5cb2"),i("0x7Cd4E04E433E69e588728c86A3832753B5F846d4")]:r==="priors_pt_buy"||r==="priors_pt_sell"||r==="priors_pt_redeem"?[i("0x888888888889758F76e7103c6CbF23ABbF58F946")]:r==="priors_market_clear_bid_budget"?[o.bidSpender]:r==="priors_market_revoke_nft"?[o.registry,"0x0000000000000000000000000000000000000000"]:r==="priors_x_link"?[o.registry]:[]}export{f as a,p as b,u as c,R as d,S as e,c as f};
1
+ import{b as s}from"./SX5YNFHG.js";import{a as o,c as t}from"./VXCGMALF.js";import{getAddress as i}from"viem";var f=new Set(["priors_status",...s,...t.filter(r=>r.read).map(r=>r.name),"priors_ethos_status","priors_request_borrow","priors_request_repay","priors_request_stock","priors_request_backing","priors_pt_quote","priors_pt_position","priors_stock_quote","priors_savings_liquidity","priors_market_origin","priors_market_pins","priors_capabilities"]),p=new Set(["priors_sign_consent",...t.filter(r=>r.consentRoot).map(r=>r.name)]),u=new Set([...p,"priors_starter_line"]),R=new Set([...t.filter(r=>!r.read).map(r=>r.name),"priors_root_offer","priors_autopay_on","priors_autopay_off","priors_pt_buy","priors_pt_sell","priors_pt_redeem","priors_savings_force_withdraw","priors_stock_swap","priors_market_clear_bid_budget","priors_market_revoke_nft","priors_x_link"]),S=["priors_lend","priors_withdraw","priors_borrow","priors_repay","priors_starter_line","priors_close_line","priors_release_bond"];function c(r){let _=t.find(e=>e.name===r);return _?[o[_.contract],..._.approval==="bid"?[o.bidSpender]:[]]:r==="priors_root_offer"?[o.pool]:r==="priors_autopay_on"||r==="priors_autopay_off"?[o.autopay]:r==="priors_savings_force_withdraw"?[o.savings]:r==="priors_stock_swap"?[i("0xCaf681a66D020601342297493863E78C959E5cb2"),i("0x7Cd4E04E433E69e588728c86A3832753B5F846d4")]:r==="priors_pt_buy"||r==="priors_pt_sell"||r==="priors_pt_redeem"?[i("0x888888888889758F76e7103c6CbF23ABbF58F946")]:r==="priors_market_clear_bid_budget"?[o.bidSpender]:r==="priors_market_revoke_nft"?[o.registry,"0x0000000000000000000000000000000000000000"]:r==="priors_x_link"?[o.registry]:[]}export{f as a,p as b,u as c,R as d,S as e,c as f};
@@ -1,4 +1,4 @@
1
- import{e as i}from"./NWNYJ26T.js";import{a as P}from"./XSD5NL7J.js";import{a as O}from"./JXOEJPJ4.js";var E="https://mcp.fobo.fun/mcp",k="2025-03-26",F=4*1024*1024,t=m=>new P(`FOBO ${m}. Nothing was signed. Please try again.`);function q(m={}){let v=m.fetch??globalThis.fetch,y=m.endpoint??E,b=m.timeoutMs??3e4;if(!Number.isSafeInteger(b)||b<=0)throw t("timeout must be a positive number of milliseconds");let d,c=k,x=0,h=!1,a,n=new Set;async function w(o,s,e,l="POST",r=!1){let u=new AbortController;n.add(u);let S,C=++x,A=new Promise((g,f)=>{S=setTimeout(()=>{f(t("request timed out")),u.abort()},b)});try{return await Promise.race([A,(async()=>{let g={"Content-Type":"application/json",Accept:"application/json, text/event-stream","MCP-Protocol-Version":c};e&&(g["Mcp-Session-Id"]=e);let f=await v(y,{method:l,headers:g,signal:u.signal,...l==="POST"?{body:JSON.stringify({jsonrpc:"2.0",...r?{}:{id:C},method:o,params:s})}:{}});if(l==="DELETE"&&(f.ok||f.status===405||f.status===404))return{};if(r){if(!f.ok)throw t("session initialization was refused");return await f.body?.cancel(),{}}let R=await M(f,C);if(!f.ok&&R.error?.code!==-32e3)throw t("service is unavailable");return{rpc:R,session:f.headers.get("Mcp-Session-Id")??void 0}})()])}catch(g){throw g instanceof P?g:t("could not be reached")}finally{clearTimeout(S),n.delete(u),u.abort()}}async function T(){if(h)throw t("client is closed");d||(a||(a=(async()=>{let o=await w("initialize",{protocolVersion:k,capabilities:{},clientInfo:{name:"oak",version:"0.3.4"}});if(o.rpc?.error||!o.session||!i(o.rpc?.result))throw t("did not provide an MCP session");let s=o.rpc.result.protocolVersion;if(typeof s=="string"){if(!["2025-03-26","2025-06-18","2025-11-25"].includes(s))throw t("MCP protocol version is unsupported");c=s}if(h)throw t("client is closed");await w("notifications/initialized",{},o.session,"POST",!0),d=o.session})().finally(()=>{a=void 0})),await a)}async function p(o,s){await T();for(let e=0;e<2;e++){if(h)throw t("client is closed");let l=d,{rpc:r}=await w(o,s,l);if(r?.error?.code===-32e3){if(e===1)throw t("session expired");d===l&&(d=void 0),await T();continue}if(!r||r.error)throw t("request was refused");return r.result}throw t("session expired")}return{async listTools(){let o=[],s=new Set,e;for(let l=0;l<20;l++){let r=await p("tools/list",e?{cursor:e}:{});if(!i(r)||!Array.isArray(r.tools))throw t("returned an invalid tool list");for(let u of r.tools){if(!i(u)||typeof u.name!="string"||!i(u.inputSchema))throw t("returned an invalid tool schema");o.push({name:u.name,inputSchema:u.inputSchema})}if(r.nextCursor===void 0)return o;if(typeof r.nextCursor!="string"||!r.nextCursor||s.has(r.nextCursor))throw t("returned an invalid tool list cursor");e=r.nextCursor,s.add(e)}throw t("tool list has too many pages")},async call(o,s){let e=await p("tools/call",{name:o,arguments:s});if(i(e)&&e.isError===!0){let l=Array.isArray(e.content)?e.content.filter(i).filter(r=>r.type==="text"&&typeof r.text=="string").map(r=>r.text).join(" "):"";throw new P(`FOBO refused the request: ${O(l||"The tool returned an error.")}. Nothing was signed. Ask for a fresh summary.`)}if(i(e)&&i(e.structuredContent))return e.structuredContent;if(i(e)&&"content"in e){if(!Array.isArray(e.content)||e.content.length!==1||!i(e.content[0])||e.content[0].type!=="text"||typeof e.content[0].text!="string")throw t("returned an unsupported tool answer");try{return JSON.parse(e.content[0].text)}catch{throw t("returned an unreadable tool answer")}}return e},async close(){if(h)return;h=!0;for(let s of n)s.abort();let o=d;d=void 0,o&&await w("",{},o,"DELETE")}}}async function M(m,v){let y=m.body?.getReader();if(!y)throw t("returned an empty response");let b=new TextDecoder,d=m.headers.get("Content-Type")?.includes("text/event-stream"),c="",x=0,h=a=>{let n;try{n=JSON.parse(a)}catch{throw t("returned an unreadable response")}if(!i(n)||n.jsonrpc!=="2.0")throw t("returned an invalid response");if(!(d&&!("id"in n)&&typeof n.method=="string")){if(n.id!==v||"result"in n=="error"in n||"error"in n&&(!i(n.error)||typeof n.error.code!="number"))throw t("returned an invalid response");return n}};try{for(;;){let a=await y.read();if(x+=a.value?.length??0,x>F)throw t("response is too large");if(c+=b.decode(a.value,{stream:!a.done}),d){c=c.replace(/\r\n/g,`
1
+ import{e as i}from"./NWNYJ26T.js";import{a as P}from"./XSD5NL7J.js";import{a as O}from"./JXOEJPJ4.js";var E="https://mcp.fobo.fun/mcp",k="2025-03-26",F=4*1024*1024,t=m=>new P(`FOBO ${m}. Nothing was signed. Please try again.`);function q(m={}){let v=m.fetch??globalThis.fetch,y=m.endpoint??E,b=m.timeoutMs??3e4;if(!Number.isSafeInteger(b)||b<=0)throw t("timeout must be a positive number of milliseconds");let d,c=k,x=0,h=!1,a,n=new Set;async function w(o,s,e,l="POST",r=!1){let u=new AbortController;n.add(u);let S,C=++x,A=new Promise((g,f)=>{S=setTimeout(()=>{f(t("request timed out")),u.abort()},b)});try{return await Promise.race([A,(async()=>{let g={"Content-Type":"application/json",Accept:"application/json, text/event-stream","MCP-Protocol-Version":c};e&&(g["Mcp-Session-Id"]=e);let f=await v(y,{method:l,headers:g,signal:u.signal,...l==="POST"?{body:JSON.stringify({jsonrpc:"2.0",...r?{}:{id:C},method:o,params:s})}:{}});if(l==="DELETE"&&(f.ok||f.status===405||f.status===404))return{};if(r){if(!f.ok)throw t("session initialization was refused");return await f.body?.cancel(),{}}let R=await M(f,C);if(!f.ok&&R.error?.code!==-32e3)throw t("service is unavailable");return{rpc:R,session:f.headers.get("Mcp-Session-Id")??void 0}})()])}catch(g){throw g instanceof P?g:t("could not be reached")}finally{clearTimeout(S),n.delete(u),u.abort()}}async function T(){if(h)throw t("client is closed");d||(a||(a=(async()=>{let o=await w("initialize",{protocolVersion:k,capabilities:{},clientInfo:{name:"oak",version:"0.3.5"}});if(o.rpc?.error||!o.session||!i(o.rpc?.result))throw t("did not provide an MCP session");let s=o.rpc.result.protocolVersion;if(typeof s=="string"){if(!["2025-03-26","2025-06-18","2025-11-25"].includes(s))throw t("MCP protocol version is unsupported");c=s}if(h)throw t("client is closed");await w("notifications/initialized",{},o.session,"POST",!0),d=o.session})().finally(()=>{a=void 0})),await a)}async function p(o,s){await T();for(let e=0;e<2;e++){if(h)throw t("client is closed");let l=d,{rpc:r}=await w(o,s,l);if(r?.error?.code===-32e3){if(e===1)throw t("session expired");d===l&&(d=void 0),await T();continue}if(!r||r.error)throw t("request was refused");return r.result}throw t("session expired")}return{async listTools(){let o=[],s=new Set,e;for(let l=0;l<20;l++){let r=await p("tools/list",e?{cursor:e}:{});if(!i(r)||!Array.isArray(r.tools))throw t("returned an invalid tool list");for(let u of r.tools){if(!i(u)||typeof u.name!="string"||!i(u.inputSchema))throw t("returned an invalid tool schema");o.push({name:u.name,inputSchema:u.inputSchema})}if(r.nextCursor===void 0)return o;if(typeof r.nextCursor!="string"||!r.nextCursor||s.has(r.nextCursor))throw t("returned an invalid tool list cursor");e=r.nextCursor,s.add(e)}throw t("tool list has too many pages")},async call(o,s){let e=await p("tools/call",{name:o,arguments:s});if(i(e)&&e.isError===!0){let l=Array.isArray(e.content)?e.content.filter(i).filter(r=>r.type==="text"&&typeof r.text=="string").map(r=>r.text).join(" "):"";throw new P(`FOBO refused the request: ${O(l||"The tool returned an error.")}. Nothing was signed. Ask for a fresh summary.`)}if(i(e)&&i(e.structuredContent))return e.structuredContent;if(i(e)&&"content"in e){if(!Array.isArray(e.content)||e.content.length!==1||!i(e.content[0])||e.content[0].type!=="text"||typeof e.content[0].text!="string")throw t("returned an unsupported tool answer");try{return JSON.parse(e.content[0].text)}catch{throw t("returned an unreadable tool answer")}}return e},async close(){if(h)return;h=!0;for(let s of n)s.abort();let o=d;d=void 0,o&&await w("",{},o,"DELETE")}}}async function M(m,v){let y=m.body?.getReader();if(!y)throw t("returned an empty response");let b=new TextDecoder,d=m.headers.get("Content-Type")?.includes("text/event-stream"),c="",x=0,h=a=>{let n;try{n=JSON.parse(a)}catch{throw t("returned an unreadable response")}if(!i(n)||n.jsonrpc!=="2.0")throw t("returned an invalid response");if(!(d&&!("id"in n)&&typeof n.method=="string")){if(n.id!==v||"result"in n=="error"in n||"error"in n&&(!i(n.error)||typeof n.error.code!="number"))throw t("returned an invalid response");return n}};try{for(;;){let a=await y.read();if(x+=a.value?.length??0,x>F)throw t("response is too large");if(c+=b.decode(a.value,{stream:!a.done}),d){c=c.replace(/\r\n/g,`
2
2
  `);let n;for(;(n=c.indexOf(`
3
3
 
4
4
  `))!==-1;){let w=c.slice(0,n);c=c.slice(n+2);let T=w.split(`
@@ -1 +1 @@
1
- import{h as w}from"./2GXHYI23.js";import{c as A,d as B}from"./V6EVQWAL.js";import{a as g,c as v,d}from"./4CEV4FDG.js";import{ia as u}from"./HHYE42JG.js";import{h as y}from"./NWNYJ26T.js";import{a as c}from"./XSD5NL7J.js";import{erc20Abi as C}from"viem";async function I(a,n,o,l){if(!o.length)return[];let t=await a.multicall({allowFailure:!1,contracts:o.map(p=>({address:p,abi:C,functionName:"balanceOf",args:[n]})),blockNumber:l});if(!Array.isArray(t)||t.length!==o.length)throw new c("Borro share balances could not be read completely. Please try again.");return t.map(d)}async function T(a,n,o={}){v(n);let l=()=>{if(o.signal?.aborted)throw new c("Borro read was cancelled.")};l();let t=a.clientFor(4663),s=await(o.discoverVaults??A(a,o).discoverVaults)(t,{wallet:n,heldOnly:!0,...o.signal?{signal:o.signal}:{}});if(s.incomplete)throw new c("Borro discovery is incomplete, so these positions cannot be shown as complete. Please try again.");let h=s.shareBalances?.map(e=>e.vault)??[...new Set([...s.vaults.map(e=>e.vault),...s.refused.flatMap(e=>e.vault?[e.vault]:[])])],b=s.shareBalances?.map(e=>d(BigInt(e.amount)))??await I(t,n,h,BigInt(s.measuredAtBlock));l();let P=h.flatMap((e,i)=>b[i]>0n?[{vault:e,balance:b[i]}]:[]);return Promise.all(P.map(async({vault:e,balance:i})=>{let r=s.vaults.find(O=>y(O.vault,e));if(!r)throw new c("This wallet holds Borro shares whose vault could not be verified. Check the vault address before withdrawing.");let m=d(await t.readContract({address:e,abi:g,functionName:"convertToAssets",args:[i],blockNumber:BigInt(s.measuredAtBlock)}));l();let k={address:e,symbol:r.vaultSymbol,decimals:18,chainId:4663},f={address:r.asset,symbol:r.symbol,decimals:r.assetDecimals,chainId:4663};return{module:"borro",id:`4663:${e}`,chainId:4663,assets:[B(k,i)],oakNotice:u(),economics:{principal:m===0n?[]:[w("redeemable",{token:f,amount:m.toString(),source:"borro.convertToAssets",heldAs:e,measuredAtBlock:s.measuredAtBlock})],debt:[],rewards:[],backing:[],coverage:{complete:!0}},description:`${a.formatAmount(i.toString(),18)} ${r.vaultSymbol} = about ${a.formatAmount(m.toString(),r.assetDecimals)} ${f.symbol} lent through Borro. ${u()}`}}))}export{I as a,T as b};
1
+ import{h as w}from"./2GXHYI23.js";import{c as A,d as B}from"./FHB7QYJO.js";import{a as g,c as v,d}from"./4CEV4FDG.js";import{ia as u}from"./HHYE42JG.js";import{h as y}from"./NWNYJ26T.js";import{a as c}from"./XSD5NL7J.js";import{erc20Abi as C}from"viem";async function I(a,n,o,l){if(!o.length)return[];let t=await a.multicall({allowFailure:!1,contracts:o.map(p=>({address:p,abi:C,functionName:"balanceOf",args:[n]})),blockNumber:l});if(!Array.isArray(t)||t.length!==o.length)throw new c("Borro share balances could not be read completely. Please try again.");return t.map(d)}async function T(a,n,o={}){v(n);let l=()=>{if(o.signal?.aborted)throw new c("Borro read was cancelled.")};l();let t=a.clientFor(4663),s=await(o.discoverVaults??A(a,o).discoverVaults)(t,{wallet:n,heldOnly:!0,...o.signal?{signal:o.signal}:{}});if(s.incomplete)throw new c("Borro discovery is incomplete, so these positions cannot be shown as complete. Please try again.");let h=s.shareBalances?.map(e=>e.vault)??[...new Set([...s.vaults.map(e=>e.vault),...s.refused.flatMap(e=>e.vault?[e.vault]:[])])],b=s.shareBalances?.map(e=>d(BigInt(e.amount)))??await I(t,n,h,BigInt(s.measuredAtBlock));l();let P=h.flatMap((e,i)=>b[i]>0n?[{vault:e,balance:b[i]}]:[]);return Promise.all(P.map(async({vault:e,balance:i})=>{let r=s.vaults.find(O=>y(O.vault,e));if(!r)throw new c("This wallet holds Borro shares whose vault could not be verified. Check the vault address before withdrawing.");let m=d(await t.readContract({address:e,abi:g,functionName:"convertToAssets",args:[i],blockNumber:BigInt(s.measuredAtBlock)}));l();let k={address:e,symbol:r.vaultSymbol,decimals:18,chainId:4663},f={address:r.asset,symbol:r.symbol,decimals:r.assetDecimals,chainId:4663};return{module:"borro",id:`4663:${e}`,chainId:4663,assets:[B(k,i)],oakNotice:u(),economics:{principal:m===0n?[]:[w("redeemable",{token:f,amount:m.toString(),source:"borro.convertToAssets",heldAs:e,measuredAtBlock:s.measuredAtBlock})],debt:[],rewards:[],backing:[],coverage:{complete:!0}},description:`${a.formatAmount(i.toString(),18)} ${r.vaultSymbol} = about ${a.formatAmount(m.toString(),r.assetDecimals)} ${f.symbol} lent through Borro. ${u()}`}}))}export{I as a,T as b};
@@ -1 +1 @@
1
- var a={registry:{address:"0xF2A26110396b4162d48A16eE8683372a6A2c3b76",codeHash:"0xb08c7571b87c9a5d1d0d32b2a9accb4e4e923f191127a733072d99b00f463479"},helper:{address:"0x88BfFDf0ce9EB8889577924Cf802B2237bf8aD79",codeHash:"0xa33bd7460219439ad0e659548b6f08a71b3aab40ac02109ab69b364a00a5f036"},whitelist:{address:"0xab74612eB2ef5642fa804A52529fEDC6D98f6Cbd",codeHash:"0x335b0b4210eaa3c3d8956b16e2326851b54918bf85266b1fbf9c04461ea2a512"},beacon:{address:"0x5413041ebddd006f8b50a03a05236eade8fa884e",codeHash:"0xa0693b5efe62447f561c327fb56d7d1ab0930a5bb147a0f8844461a6b976b7f7"},implementation:{address:"0x1570a79aa494043DC01Ecc96405d5A8b45d24bDa",codeHash:"0xd3a1db41d5c42de3d2b6ff176e8603b9b825ff5603de555ed8f41cb270d71985"},staking:{codeHash:"0x533bcf9a4518b33b2bb541af1c1daa06f69ab6092cfd84944c1d57ebec825a69"},rewards:{address:"0x20DBb6906B3A7c04d9bA5258Eacaaa6CEdaDDdb0",codeHash:"0x6a482e5367e1aced7f5448e31e40140e4b899959376d040e0be502c37ce739b1"},oakLog:{address:"0x715DeAD3a80f8461d29aA6F9F7B39554c1294075",codeHash:"0x813f4e3ccc34b924559faf1f81706763c9649bad4c4f6c07547acd5713f481b9"},proxy:{codeHash:"0x813f4e3ccc34b924559faf1f81706763c9649bad4c4f6c07547acd5713f481b9"},stakingBeacon:{address:"0x9df506ae33dad46c83d226be462849c3071f63ac",codeHash:"0xa0693b5efe62447f561c327fb56d7d1ab0930a5bb147a0f8844461a6b976b7f7"},stakingImplementation:{address:"0x4c6b1D5377e353C6959C65d389aAe3127a84EC4e",codeHash:"0x30c917d96f73c2075d7d0cca801cd34c459060567ec90dfdb30b361bf29dd2ed"},rewardsBeacon:{address:"0x4768574074cf48b025457b14d109983079952134",codeHash:"0xa0693b5efe62447f561c327fb56d7d1ab0930a5bb147a0f8844461a6b976b7f7"},rewardsImplementation:{address:"0x15a8Ef0EA82c5D087BD8D89b5D10BA85FfD3BefE",codeHash:"0x2cdf99c071739c5bbde722901ab43a9085674c99647372d6d66ad2bec10ee3db"},oak:"0x6511c233790Ec10f7d673c64DC82C3F941D57828",dormantOak:"0x38fE199550E677Fa9caC196495460dfF97BCe28F",chop:"0x100765a16f42636Bd84EE1e86Bc5107b84bCdBA3",chainId:4663,measuredAtBlock:"106718816",source:"https://rpc.mainnet.chain.robinhood.com"},d={poolId:"0x8111082d181841cbd123e82bced032b1331140332b6ce3da37f53a6b24ed736c",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",key:{currency0:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",currency1:"0x100765a16f42636Bd84EE1e86Bc5107b84bCdBA3",fee:8388608,tickSpacing:200,hooks:"0x4e3468951D49f2EEa976eD0D6e75fFCb44a9a544"},dustV2Pool:"0x32c9b1748b914fd740054518d9322240a14b8aec"};export{a,d as b};
1
+ var a={registry:{address:"0xF2A26110396b4162d48A16eE8683372a6A2c3b76",codeHash:"0xb08c7571b87c9a5d1d0d32b2a9accb4e4e923f191127a733072d99b00f463479"},helper:{address:"0x88BfFDf0ce9EB8889577924Cf802B2237bf8aD79",codeHash:"0xa33bd7460219439ad0e659548b6f08a71b3aab40ac02109ab69b364a00a5f036"},whitelist:{address:"0xab74612eB2ef5642fa804A52529fEDC6D98f6Cbd",codeHash:"0x335b0b4210eaa3c3d8956b16e2326851b54918bf85266b1fbf9c04461ea2a512"},beacon:{address:"0x5413041ebddd006f8b50a03a05236eade8fa884e",codeHash:"0xa0693b5efe62447f561c327fb56d7d1ab0930a5bb147a0f8844461a6b976b7f7"},implementation:{address:"0x1570a79aa494043DC01Ecc96405d5A8b45d24bDa",codeHash:"0xd3a1db41d5c42de3d2b6ff176e8603b9b825ff5603de555ed8f41cb270d71985"},staking:{codeHash:"0x533bcf9a4518b33b2bb541af1c1daa06f69ab6092cfd84944c1d57ebec825a69"},rewards:{address:"0x20DBb6906B3A7c04d9bA5258Eacaaa6CEdaDDdb0",codeHash:"0x6a482e5367e1aced7f5448e31e40140e4b899959376d040e0be502c37ce739b1"},oakLog:{address:"0x715DeAD3a80f8461d29aA6F9F7B39554c1294075",codeHash:"0x813f4e3ccc34b924559faf1f81706763c9649bad4c4f6c07547acd5713f481b9"},proxy:{codeHash:"0x813f4e3ccc34b924559faf1f81706763c9649bad4c4f6c07547acd5713f481b9"},stakingBeacon:{address:"0x9df506ae33dad46c83d226be462849c3071f63ac",codeHash:"0xa0693b5efe62447f561c327fb56d7d1ab0930a5bb147a0f8844461a6b976b7f7"},stakingImplementation:{address:"0x4c6b1D5377e353C6959C65d389aAe3127a84EC4e",codeHash:"0x30c917d96f73c2075d7d0cca801cd34c459060567ec90dfdb30b361bf29dd2ed"},rewardsBeacon:{address:"0x4768574074cf48b025457b14d109983079952134",codeHash:"0xa0693b5efe62447f561c327fb56d7d1ab0930a5bb147a0f8844461a6b976b7f7"},rewardsImplementation:{address:"0x15a8Ef0EA82c5D087BD8D89b5D10BA85FfD3BefE",codeHash:"0x2cdf99c071739c5bbde722901ab43a9085674c99647372d6d66ad2bec10ee3db"},oak:"0x6511c233790Ec10f7d673c64DC82C3F941D57828",dormantOak:"0x38fE199550E677Fa9caC196495460dfF97BCe28F",chop:"0x100765a16f42636Bd84EE1e86Bc5107b84bCdBA3",chainId:4663,measuredAtBlock:"106718816",source:"https://rpc.mainnet.chain.robinhood.com"},d="0x4d7b4223144e14Ca1FB1324e28753b43277fD9F3",e={poolId:"0x8111082d181841cbd123e82bced032b1331140332b6ce3da37f53a6b24ed736c",stateView:"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b",poolManager:"0x8366a39cc670b4001a1121b8f6a443a643e40951",key:{currency0:"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",currency1:"0x100765a16f42636Bd84EE1e86Bc5107b84bCdBA3",fee:8388608,tickSpacing:200,hooks:"0x4e3468951D49f2EEa976eD0D6e75fFCb44a9a544"},dustV2Pool:"0x32c9b1748b914fd740054518d9322240a14b8aec"};export{a,d as b,e as c};
@@ -1 +1 @@
1
- import{a as q}from"./NCQFWPAW.js";import{a as v}from"./RUTSEGGD.js";import{L as A}from"./SYERFEJ4.js";import{c as k}from"./4J245N3F.js";import{a as $}from"./43LI5NKJ.js";import{a as I}from"./66F5ZH34.js";import{d as M,g as F,i as G,m as U}from"./NWNYJ26T.js";import{b as y}from"./TI727O2H.js";import{a as o}from"./XSD5NL7J.js";import{encodeFunctionData as L,erc20Abi as R,getAddress as N,zeroAddress as j}from"viem";var C={genesis:N("0x575b7B7c97Ef3E21C82DAeB427899d583e1E913f"),bond:N("0xff32a969A0c567129eECD926D04657728E1980C1"),inverse:N("0x92166e94Eea5B7799b761653881692f881dFC4C9"),treasury:N("0x04822Ea321A0DEE6F40656172F29312104855d66"),pteam:N("0x650F58079dAa17ee28928c2F92d22291d038B2B0"),rwa:N("0x99B6eE6eDe47d9a8a9bfd03F728a99B789df1961"),premium:N("0x346e1a31171A0f7aC73909010b5435768d3B5462"),tax:N("0x086C58400b8708Ef993f256E12e752dcF0AC918e")},z=N("0x59F95461E68e0c77605299791E1449f175165B54"),O={genesis:["purchase","finalize","refund","claim"],bond:["deposit","redeem"],inverse:["swap"],treasury:["rebalanceToMorpho","rebalanceFromMorpho","mintNet","spendUsdg"],pteam:["exercise"],rwa:["redeem","depositInventory","pokeHwm","setDiscount","setInventoryMax","setHalt","setMenu","skim"],premium:["execute"],tax:["convert"]},V={genesis:["wired","finalized","finalizeTime","saleStart","saleDeadline","raisedRaw","totalRaised","registryLength"],bond:["wired","enabled","startTime","marketCount"],inverse:["active","price","capacityRemaining","spreadBps"],treasury:["wired","rfv","backingPerToken","liquidUsdg","morphoAssets","polRfv","morphoCapBps","morphoVault","canonicalPair"],pteam:["wired","holder","vestedFraction","exercisableNow","exercised","strikeWad","capBps","circulatingSupply","excludedFromFloat"],rwa:["manager","halted","inventory","inventoryMax","owedNet","bHwm","deskDiscountBps","VEST","MAX_DISCOUNT_BPS","INVENTORY_HARD_CAP","menu","routerSource","sleeve"],premium:["active","clipSize","lastExecuteAt","premiumThresholdWad","router","pairContract"],tax:["wired","pendingNet","teamBps","treasuryBps","teamWallet","router","pairContract"]},T=h=>JSON.parse(JSON.stringify(h,(P,S)=>typeof S=="bigint"?S.toString():S));function g(h){return G(h,"Provide a checksummed address.",M)}var oe=h=>{async function P(t){if(typeof t!="string"||!Object.hasOwn(C,t))throw new o("Choose a published NetNet financial product.");let c=t,e=C[c],r=q[c],u=h.clientFor(y);if(await u.getChainId()!==y)throw new o("NetNet requires chain 4663.");let n=await u.getBlock(),a=(w,x=[])=>u.readContract({address:e,abi:r,functionName:w,args:x,blockNumber:n.number}),[i,s,l,p]=await Promise.all([a("net"),a("usdg"),u.readContract({address:v.address,abi:R,functionName:"decimals",blockNumber:n.number}),u.readContract({address:k.address,abi:R,functionName:"decimals",blockNumber:n.number})]);if(g(i)!==v.address||g(s)!==k.address||l!==v.decimals||p!==k.decimals)throw new o("NetNet financial token pins or decimals do not match the deployment.");return{product:c,contract:e,abi:r,rpc:u,block:n,read:a}}async function S(t){$(t);let c=(e,r)=>({module:"netnet",id:`4663:${C.bond.toLowerCase()}:${e}`,chainId:y,incomplete:!0,assets:[],description:`NetNet bond notes unreadable: ${h.plainError(r)} Use netnet_financial_status with product bond to inspect notes.`});try{let e=await P("bond"),r=U(await e.read("noteCount",[t]),"Invalid NetNet bond note count."),u=r<50n?Number(r):50,n=[];for(let a=0;a<u;a++)try{let i=await e.read("notes",[t,BigInt(a)]);if(!Array.isArray(i)||i.length!==4)throw new o("Invalid NetNet bond note.");let[s,l,p,w]=i.map(B=>U(B,"Invalid NetNet bond note amount or timestamp."));if(l>s||w<=p||w>=1n<<64n)throw new o("Invalid NetNet bond note vesting or claimed amount.");let x=s-l;if(x===0n)continue;let E=e.block.timestamp>=w?s:e.block.timestamp<=p?0n:s*(e.block.timestamp-p)/(w-p),D=E>l?E-l:0n;n.push({module:"netnet",id:`4663:${e.contract.toLowerCase()}:${a}`,chainId:y,matured:e.block.timestamp>=w,assets:[{token:v,amount:x.toString()}],description:`NetNet bond note ${a}: ${x} NET base units outstanding; ${D} claimable now, vesting ends at Unix ${w}. Redeem vested NET with netnet_financial_action product bond operation redeem. Payment cannot be withdrawn. Block ${e.block.number}.`})}catch(i){n.push(c(String(a),i))}return r>BigInt(u)&&n.push({module:"netnet",id:`4663:${e.contract.toLowerCase()}:coverage`,chainId:y,incomplete:!0,assets:[],description:`NetNet bond positions checked the first ${u} of ${r} notes. Use netnet_financial_status product bond offset ${u} to read the remaining notes.`}),n}catch(e){return[c("unreadable",e)]}}let _=(t,c,e,r)=>({name:t,inputSchema:{type:"object",properties:c,required:e,additionalProperties:!1},execute:async(u,n)=>{try{if($(n),Object.keys(u).some(a=>!Object.hasOwn(c,a)))throw new o("Unsupported NetNet financial argument.");return await r(u,n)}catch(a){throw new o(h.plainError(a))}}}),W={type:"string",enum:Object.keys(C),description:"NetNet financial product: genesis (founding sale), bond, inverse (NET buyback), treasury, pteam (team option), rwa (equity desk), premium (premium keeper) or tax (tax collector)."};return{positions:S,tools:[_("netnet_financial_status",{product:W,offset:{type:"integer",minimum:0,description:"Index of the first wallet note to return (bond and rwa products only). Default 0."},limit:{type:"integer",minimum:1,maximum:50,description:"Maximum notes to return, 1 to 50 (default 20; bond and rwa products only)."}},["product"],async(t,c)=>{let e=await P(t.product),r=V[e.product],u=t.offset??0,n=t.limit??20;if(!Number.isSafeInteger(u)||Number(u)<0||!Number.isSafeInteger(n)||Number(n)<1||Number(n)>50)throw new o("Use a nonnegative offset and limit 1..50.");let a=await Promise.all(r.map(async s=>{try{return[s,{value:T(await e.read(s))}]}catch(l){return[s,{unavailable:h.plainError(l)}]}})),i={};if(e.product==="genesis")for(let s of["purchasedRaw","purchasedNetOf","claimedNet","claimableNetOf"])i[s]=T(await e.read(s,[c]));if(e.product==="bond"||e.product==="rwa"){i.pending=T(await e.read("pendingFor",[c]));let s=await e.read("noteCount",[c]);if(typeof s!="bigint"||s<0n)throw new o("Invalid NetNet note count.");let l=s<BigInt(Number(u)+Number(n))?s:BigInt(Number(u)+Number(n));i.noteCount=s.toString(),i.notes=await Promise.all(Array.from({length:Math.max(0,Number(l-BigInt(Number(u))))},async(p,w)=>({id:String(Number(u)+w),note:T(await e.read(e.product==="bond"?"notes":"noteAt",[c,BigInt(Number(u)+w)]))}))),i.nextOffset=l<s?l.toString():null,e.product==="bond"&&(i.markets=await Promise.all([0n,1n].map(async p=>{try{return{id:p.toString(),quoteToken:g(await e.read("quoteToken",[p])),priceWad:String(await e.read("bondPrice",[p]))}}catch(w){return{id:p.toString(),unavailable:h.plainError(w)}}})))}return e.product==="treasury"&&(i.isMinter=await e.read("isMinter",[c]),i.isSpender=await e.read("isSpender",[c])),{chainId:y,contract:e.contract,product:e.product,blockNumber:String(e.block.number),tokens:[v,k],metrics:Object.fromEntries(a),wallet:i,units:"Raw token amounts use each token\u2019s decimals. Prices, NAV, reserve values and capacityRemaining use 18-decimal USDG WAD. Note timestamps are Unix seconds.",operations:O[e.product],caveat:"An unavailable metric is not zero. Formulaic eligibility, oracle liveness, caps and vesting are checked by the action preview. RWA entry/router calldata and initial deployment wiring remain unsupported."}}),_("netnet_financial_action",{product:W,operation:{type:"string",enum:[...new Set(Object.values(O).flat())],description:"Action to run; it must be one the chosen product supports, for example bond deposit or redeem, genesis purchase or claim, inverse swap."},amount:I('Amount in base units of the token the operation spends or moves: USDG has 6 decimals, NET 9 ("1000000" = 1 USDG, "1000000000" = 1 NET).'),minAmountOut:I('Least output you must receive, in base units of the output token (USDG 6 decimals, NET 9). Example: "1000000" = 1 USDG.'),maxPriceWad:I("Highest bond price you accept, as an 18-decimal wad of USDG per NET in base units (1e18 = 1 USDG). Bond deposit only."),maxPayment:I('Most USDG you will pay to exercise, in USDG base units (6 decimals). Example: "1000000" = 1 USDG. pteam exercise only.'),marketId:{type:"integer",enum:[0,1],description:"Bond market: 0 pays with USDG, 1 pays with the canonical NET/USDG LP token. Bond deposit only."},recipient:{type:"string",description:"Address that receives the minted NET or spent USDG. Treasury mintNet and spendUsdg only; use the intended address."},halted:{type:"boolean",description:"rwa setHalt only: true halts the desk, false resumes it."},token:{type:"string",description:"Address of the stray token to sweep (0x + 40 hex digits). rwa skim only."},noteIds:{type:"array",maxItems:50,description:"Bond note ids to redeem, unique decimal strings (rwa redeem only); omit to redeem every vested note.",items:I('Note id (index of the wallet note), as a decimal string. Example: "0".')},menu:{type:"array",maxItems:32,description:"Complete replacement RWA equity menu (rwa setMenu only): up to 32 entries; target weights must sum to 10000 basis points.",items:{type:"object",description:"Menu entry with token and feed addresses, targetWeightBps (10000 = 100%) and active (boolean)."}}},["product","operation"],async(t,c)=>{let e=await P(t.product),r=t.operation;if(typeof r!="string"||!O[e.product].includes(r))throw new o("This operation is not supported by the selected financial product.");let u=new Set(["product","operation"]),n=[],a,i=0n,s="",l=(...d)=>d.forEach(m=>u.add(m)),p=()=>(l("amount"),A(t.amount)),w=()=>(l("minAmountOut"),A(t.minAmountOut));if(e.product==="genesis"){if(r==="purchase"&&(i=p(),a=k,n=[i],s="Founding subscription; NET is claimable only after successful finalization and vesting. A failed sale requires refund."),r==="claim"&&await e.read("claimableNetOf",[c])===0n)throw new o("No vested founding NET is claimable by this wallet.")}else if(e.product==="bond")if(r==="deposit"){if(l("marketId","maxPriceWad"),t.marketId!==0&&t.marketId!==1)throw new o("Bond marketId must be 0 (USDG) or 1 (canonical LP).");let d=BigInt(t.marketId);if(g(await e.read("quoteToken",[d]))!==(d===0n?k.address:z))throw new o("Bond quote token is not the pinned USDG or canonical LP.");i=p(),a=d===0n?k:{address:z,decimals:18,symbol:"NET/USDG LP",chainId:y};let f=A(t.maxPriceWad),b=await e.read("bondPrice",[d]);if(typeof b!="bigint"||b===0n||b>f)throw new o("Bond price exceeds maxPriceWad or is invalid.");n=[d,i,f,c],s="Payment is exchanged for a non-transferable NET note with two-day linear vesting. Redeem vested NET with the same product; payment cannot be withdrawn."}else n=[c];else if(e.product==="inverse"){if(i=p(),a=v,n=[i,w()],s="Purchased NET is burned permanently; USDG pays directly to this wallet. Capacity is denominated in USDG WAD, not raw USDG.",await e.read("active")!==!0)throw new o("NetNet buyback is inactive: oracle, finalization or capacity is unavailable.")}else if(e.product==="pteam"){if(g(await e.read("holder"))!==N(c))throw new o("This wallet is not the immutable pTEAM holder.");let d=p();if(l("maxPayment"),d>await e.read("exercisableNow"))throw new o("The NET exercise amount exceeds the vested cap.");let m=await e.read("strikeWad");if(i=(d*m/10n**BigInt(v.decimals)+10n**12n-1n)/10n**12n,i===0n||i>A(t.maxPayment))throw new o("The exercise payment exceeds maxPayment or rounds to zero.");a=k,n=[d],s=`Exercise pays ${i} USDG base units into treasury reserves and mints ${d} NET base units to the immutable holder. No withdrawal or exercise reversal exists.`}else if(e.product==="treasury"){let d=p();if(r==="mintNet"||r==="spendUsdg"){l("recipient");let m=g(t.recipient);if(await e.read(r==="mintNet"?"isMinter":"isSpender",[c])!==!0)throw new o("This wallet lacks the fixed NetNet treasury minter/spender role.");n=[m,d],s=`Protocol treasury operation sends ${d} base units to ${m}; it does not deposit into this wallet\u2019s savings.`}else n=[d],s="Permissionless protocol reserve rebalance; assets remain owned by the NetNet treasury. The deployed fraction is constrained by the immutable cap."}else if(e.product==="rwa"){if(["depositInventory","setDiscount","setInventoryMax","setHalt","setMenu"].includes(r)&&g(await e.read("manager"))!==N(c))throw new o("This wallet lacks the immutable RWA manager role.");if(r==="redeem")if(l("noteIds"),t.noteIds===void 0)n=[c];else{if(!Array.isArray(t.noteIds)||!t.noteIds.length||t.noteIds.length>50)throw new o("Provide 1..50 unique note IDs.");let m=t.noteIds.map(b=>A(b,!0));if(new Set(m.map(String)).size!==m.length)throw new o("Note IDs must be unique.");let f=await e.read("noteCount",[c]);if(m.some(b=>b>=f))throw new o("RWA note ID is out of range.");n=[c,m]}else if(r==="setHalt"){if(l("halted"),typeof t.halted!="boolean")throw new o("Provide halted as a boolean.");n=[t.halted]}else if(r==="setMenu"){if(l("menu"),!Array.isArray(t.menu)||!t.menu.length||t.menu.length>32)throw new o("Provide 1..32 explicit RWA menu entries.");let m=t.menu.map(f=>{if(!f||typeof f!="object"||Array.isArray(f)||Object.keys(f).some(H=>!["token","feed","targetWeightBps","active"].includes(H)))throw new o("Invalid RWA menu fields.");let b=f;if(typeof b.active!="boolean")throw new o("RWA active must be boolean.");return{token:g(b.token),feed:g(b.feed),targetWeightBps:A(b.targetWeightBps,!0),active:b.active}});if(new Set(m.map(f=>f.token)).size!==m.length||m.reduce((f,b)=>f+b.targetWeightBps,0n)!==10000n||m.some(f=>f.active&&(f.token===j||f.feed===j)))throw new o("RWA menu tokens must be unique, weights sum to 10000, active feeds/tokens nonzero.");n=[m],s=`Replace the complete RWA equity menu: ${JSON.stringify(T(m))}.`}else if(r==="skim")l("token"),n=[g(t.token)],s=`Sweep eligible stray assets to sleeve ${g(await e.read("sleeve"))}, not to this wallet.`;else if(r!=="pokeHwm"){let m=p();if(n=[m],r==="depositInventory"&&(a=v,i=m,s="Inventory funding is one-way. The manager cannot withdraw these NET; they are committed to bond obligations."),r==="setDiscount"&&m>await e.read("MAX_DISCOUNT_BPS")||r==="setInventoryMax"&&m>await e.read("INVENTORY_HARD_CAP"))throw new o("RWA setting exceeds its immutable maximum.")}}else e.product==="premium"?(n=[w()],s="Permissionless mint-and-sell keeper operation; all sale proceeds go to NetNet treasury. The caller receives no reward."):(n=[p(),w()],s="Convert NET already owned by the tax collector. Proceeds split to treasury and team; the caller receives no reward and supplies no NET.");if(Object.keys(t).some(d=>!u.has(d)))throw new o("Unexpected fields for this NetNet operation.");if(a&&await e.rpc.readContract({address:a.address,abi:R,functionName:"balanceOf",args:[c],blockNumber:e.block.number})<i)throw new o(`Top up ${a.symbol}: needs ${i} base units.`);let x=`NetNet ${e.product}.${r}, contract ${e.contract}, chain ${y}, values ${JSON.stringify(T(n))}. ${a?`Approve exactly ${i} ${a.symbol} base units (${a.address}, decimals ${a.decimals}). `:""}${s}`,E=[...a?[h.approval(a.address,e.contract,i.toString(),y)]:[],h.unsignedTx({to:e.contract,data:L({abi:e.abi,functionName:r,args:n}),value:"0",chainId:y,description:x})],D=await h.preview(E,c),B=0n;for(let d of D.changes){if(!/^-?\d+$/.test(d.amount))throw new o("Invalid NetNet preview amount.");if(BigInt(d.amount)<0n&&(B-=BigInt(d.amount)),BigInt(d.amount)<0n&&(!a||d.token.chainId!==y||!F(d.token.address,a.address)||d.token.decimals!==a.decimals||-BigInt(d.amount)>i))throw new o("NetNet preview spends outside the exact input budget.")}if(B>i)throw new o("NetNet preview exceeds the aggregate input budget.");return{txs:E,preview:D,summary:x}})]}};export{C as a,z as b,oe as c};
1
+ import{a as q}from"./NCQFWPAW.js";import{a as v}from"./RUTSEGGD.js";import{L as A}from"./MQXSCNUL.js";import{c as k}from"./N624NR7Y.js";import{a as $}from"./43LI5NKJ.js";import{a as I}from"./66F5ZH34.js";import{d as M,g as F,i as G,m as U}from"./NWNYJ26T.js";import{b as y}from"./TI727O2H.js";import{a as o}from"./XSD5NL7J.js";import{encodeFunctionData as L,erc20Abi as R,getAddress as N,zeroAddress as j}from"viem";var C={genesis:N("0x575b7B7c97Ef3E21C82DAeB427899d583e1E913f"),bond:N("0xff32a969A0c567129eECD926D04657728E1980C1"),inverse:N("0x92166e94Eea5B7799b761653881692f881dFC4C9"),treasury:N("0x04822Ea321A0DEE6F40656172F29312104855d66"),pteam:N("0x650F58079dAa17ee28928c2F92d22291d038B2B0"),rwa:N("0x99B6eE6eDe47d9a8a9bfd03F728a99B789df1961"),premium:N("0x346e1a31171A0f7aC73909010b5435768d3B5462"),tax:N("0x086C58400b8708Ef993f256E12e752dcF0AC918e")},z=N("0x59F95461E68e0c77605299791E1449f175165B54"),O={genesis:["purchase","finalize","refund","claim"],bond:["deposit","redeem"],inverse:["swap"],treasury:["rebalanceToMorpho","rebalanceFromMorpho","mintNet","spendUsdg"],pteam:["exercise"],rwa:["redeem","depositInventory","pokeHwm","setDiscount","setInventoryMax","setHalt","setMenu","skim"],premium:["execute"],tax:["convert"]},V={genesis:["wired","finalized","finalizeTime","saleStart","saleDeadline","raisedRaw","totalRaised","registryLength"],bond:["wired","enabled","startTime","marketCount"],inverse:["active","price","capacityRemaining","spreadBps"],treasury:["wired","rfv","backingPerToken","liquidUsdg","morphoAssets","polRfv","morphoCapBps","morphoVault","canonicalPair"],pteam:["wired","holder","vestedFraction","exercisableNow","exercised","strikeWad","capBps","circulatingSupply","excludedFromFloat"],rwa:["manager","halted","inventory","inventoryMax","owedNet","bHwm","deskDiscountBps","VEST","MAX_DISCOUNT_BPS","INVENTORY_HARD_CAP","menu","routerSource","sleeve"],premium:["active","clipSize","lastExecuteAt","premiumThresholdWad","router","pairContract"],tax:["wired","pendingNet","teamBps","treasuryBps","teamWallet","router","pairContract"]},T=h=>JSON.parse(JSON.stringify(h,(P,S)=>typeof S=="bigint"?S.toString():S));function g(h){return G(h,"Provide a checksummed address.",M)}var oe=h=>{async function P(t){if(typeof t!="string"||!Object.hasOwn(C,t))throw new o("Choose a published NetNet financial product.");let c=t,e=C[c],r=q[c],u=h.clientFor(y);if(await u.getChainId()!==y)throw new o("NetNet requires chain 4663.");let n=await u.getBlock(),a=(w,x=[])=>u.readContract({address:e,abi:r,functionName:w,args:x,blockNumber:n.number}),[i,s,l,p]=await Promise.all([a("net"),a("usdg"),u.readContract({address:v.address,abi:R,functionName:"decimals",blockNumber:n.number}),u.readContract({address:k.address,abi:R,functionName:"decimals",blockNumber:n.number})]);if(g(i)!==v.address||g(s)!==k.address||l!==v.decimals||p!==k.decimals)throw new o("NetNet financial token pins or decimals do not match the deployment.");return{product:c,contract:e,abi:r,rpc:u,block:n,read:a}}async function S(t){$(t);let c=(e,r)=>({module:"netnet",id:`4663:${C.bond.toLowerCase()}:${e}`,chainId:y,incomplete:!0,assets:[],description:`NetNet bond notes unreadable: ${h.plainError(r)} Use netnet_financial_status with product bond to inspect notes.`});try{let e=await P("bond"),r=U(await e.read("noteCount",[t]),"Invalid NetNet bond note count."),u=r<50n?Number(r):50,n=[];for(let a=0;a<u;a++)try{let i=await e.read("notes",[t,BigInt(a)]);if(!Array.isArray(i)||i.length!==4)throw new o("Invalid NetNet bond note.");let[s,l,p,w]=i.map(B=>U(B,"Invalid NetNet bond note amount or timestamp."));if(l>s||w<=p||w>=1n<<64n)throw new o("Invalid NetNet bond note vesting or claimed amount.");let x=s-l;if(x===0n)continue;let E=e.block.timestamp>=w?s:e.block.timestamp<=p?0n:s*(e.block.timestamp-p)/(w-p),D=E>l?E-l:0n;n.push({module:"netnet",id:`4663:${e.contract.toLowerCase()}:${a}`,chainId:y,matured:e.block.timestamp>=w,assets:[{token:v,amount:x.toString()}],description:`NetNet bond note ${a}: ${x} NET base units outstanding; ${D} claimable now, vesting ends at Unix ${w}. Redeem vested NET with netnet_financial_action product bond operation redeem. Payment cannot be withdrawn. Block ${e.block.number}.`})}catch(i){n.push(c(String(a),i))}return r>BigInt(u)&&n.push({module:"netnet",id:`4663:${e.contract.toLowerCase()}:coverage`,chainId:y,incomplete:!0,assets:[],description:`NetNet bond positions checked the first ${u} of ${r} notes. Use netnet_financial_status product bond offset ${u} to read the remaining notes.`}),n}catch(e){return[c("unreadable",e)]}}let _=(t,c,e,r)=>({name:t,inputSchema:{type:"object",properties:c,required:e,additionalProperties:!1},execute:async(u,n)=>{try{if($(n),Object.keys(u).some(a=>!Object.hasOwn(c,a)))throw new o("Unsupported NetNet financial argument.");return await r(u,n)}catch(a){throw new o(h.plainError(a))}}}),W={type:"string",enum:Object.keys(C),description:"NetNet financial product: genesis (founding sale), bond, inverse (NET buyback), treasury, pteam (team option), rwa (equity desk), premium (premium keeper) or tax (tax collector)."};return{positions:S,tools:[_("netnet_financial_status",{product:W,offset:{type:"integer",minimum:0,description:"Index of the first wallet note to return (bond and rwa products only). Default 0."},limit:{type:"integer",minimum:1,maximum:50,description:"Maximum notes to return, 1 to 50 (default 20; bond and rwa products only)."}},["product"],async(t,c)=>{let e=await P(t.product),r=V[e.product],u=t.offset??0,n=t.limit??20;if(!Number.isSafeInteger(u)||Number(u)<0||!Number.isSafeInteger(n)||Number(n)<1||Number(n)>50)throw new o("Use a nonnegative offset and limit 1..50.");let a=await Promise.all(r.map(async s=>{try{return[s,{value:T(await e.read(s))}]}catch(l){return[s,{unavailable:h.plainError(l)}]}})),i={};if(e.product==="genesis")for(let s of["purchasedRaw","purchasedNetOf","claimedNet","claimableNetOf"])i[s]=T(await e.read(s,[c]));if(e.product==="bond"||e.product==="rwa"){i.pending=T(await e.read("pendingFor",[c]));let s=await e.read("noteCount",[c]);if(typeof s!="bigint"||s<0n)throw new o("Invalid NetNet note count.");let l=s<BigInt(Number(u)+Number(n))?s:BigInt(Number(u)+Number(n));i.noteCount=s.toString(),i.notes=await Promise.all(Array.from({length:Math.max(0,Number(l-BigInt(Number(u))))},async(p,w)=>({id:String(Number(u)+w),note:T(await e.read(e.product==="bond"?"notes":"noteAt",[c,BigInt(Number(u)+w)]))}))),i.nextOffset=l<s?l.toString():null,e.product==="bond"&&(i.markets=await Promise.all([0n,1n].map(async p=>{try{return{id:p.toString(),quoteToken:g(await e.read("quoteToken",[p])),priceWad:String(await e.read("bondPrice",[p]))}}catch(w){return{id:p.toString(),unavailable:h.plainError(w)}}})))}return e.product==="treasury"&&(i.isMinter=await e.read("isMinter",[c]),i.isSpender=await e.read("isSpender",[c])),{chainId:y,contract:e.contract,product:e.product,blockNumber:String(e.block.number),tokens:[v,k],metrics:Object.fromEntries(a),wallet:i,units:"Raw token amounts use each token\u2019s decimals. Prices, NAV, reserve values and capacityRemaining use 18-decimal USDG WAD. Note timestamps are Unix seconds.",operations:O[e.product],caveat:"An unavailable metric is not zero. Formulaic eligibility, oracle liveness, caps and vesting are checked by the action preview. RWA entry/router calldata and initial deployment wiring remain unsupported."}}),_("netnet_financial_action",{product:W,operation:{type:"string",enum:[...new Set(Object.values(O).flat())],description:"Action to run; it must be one the chosen product supports, for example bond deposit or redeem, genesis purchase or claim, inverse swap."},amount:I('Amount in base units of the token the operation spends or moves: USDG has 6 decimals, NET 9 ("1000000" = 1 USDG, "1000000000" = 1 NET).'),minAmountOut:I('Least output you must receive, in base units of the output token (USDG 6 decimals, NET 9). Example: "1000000" = 1 USDG.'),maxPriceWad:I("Highest bond price you accept, as an 18-decimal wad of USDG per NET in base units (1e18 = 1 USDG). Bond deposit only."),maxPayment:I('Most USDG you will pay to exercise, in USDG base units (6 decimals). Example: "1000000" = 1 USDG. pteam exercise only.'),marketId:{type:"integer",enum:[0,1],description:"Bond market: 0 pays with USDG, 1 pays with the canonical NET/USDG LP token. Bond deposit only."},recipient:{type:"string",description:"Address that receives the minted NET or spent USDG. Treasury mintNet and spendUsdg only; use the intended address."},halted:{type:"boolean",description:"rwa setHalt only: true halts the desk, false resumes it."},token:{type:"string",description:"Address of the stray token to sweep (0x + 40 hex digits). rwa skim only."},noteIds:{type:"array",maxItems:50,description:"Bond note ids to redeem, unique decimal strings (rwa redeem only); omit to redeem every vested note.",items:I('Note id (index of the wallet note), as a decimal string. Example: "0".')},menu:{type:"array",maxItems:32,description:"Complete replacement RWA equity menu (rwa setMenu only): up to 32 entries; target weights must sum to 10000 basis points.",items:{type:"object",description:"Menu entry with token and feed addresses, targetWeightBps (10000 = 100%) and active (boolean)."}}},["product","operation"],async(t,c)=>{let e=await P(t.product),r=t.operation;if(typeof r!="string"||!O[e.product].includes(r))throw new o("This operation is not supported by the selected financial product.");let u=new Set(["product","operation"]),n=[],a,i=0n,s="",l=(...d)=>d.forEach(m=>u.add(m)),p=()=>(l("amount"),A(t.amount)),w=()=>(l("minAmountOut"),A(t.minAmountOut));if(e.product==="genesis"){if(r==="purchase"&&(i=p(),a=k,n=[i],s="Founding subscription; NET is claimable only after successful finalization and vesting. A failed sale requires refund."),r==="claim"&&await e.read("claimableNetOf",[c])===0n)throw new o("No vested founding NET is claimable by this wallet.")}else if(e.product==="bond")if(r==="deposit"){if(l("marketId","maxPriceWad"),t.marketId!==0&&t.marketId!==1)throw new o("Bond marketId must be 0 (USDG) or 1 (canonical LP).");let d=BigInt(t.marketId);if(g(await e.read("quoteToken",[d]))!==(d===0n?k.address:z))throw new o("Bond quote token is not the pinned USDG or canonical LP.");i=p(),a=d===0n?k:{address:z,decimals:18,symbol:"NET/USDG LP",chainId:y};let f=A(t.maxPriceWad),b=await e.read("bondPrice",[d]);if(typeof b!="bigint"||b===0n||b>f)throw new o("Bond price exceeds maxPriceWad or is invalid.");n=[d,i,f,c],s="Payment is exchanged for a non-transferable NET note with two-day linear vesting. Redeem vested NET with the same product; payment cannot be withdrawn."}else n=[c];else if(e.product==="inverse"){if(i=p(),a=v,n=[i,w()],s="Purchased NET is burned permanently; USDG pays directly to this wallet. Capacity is denominated in USDG WAD, not raw USDG.",await e.read("active")!==!0)throw new o("NetNet buyback is inactive: oracle, finalization or capacity is unavailable.")}else if(e.product==="pteam"){if(g(await e.read("holder"))!==N(c))throw new o("This wallet is not the immutable pTEAM holder.");let d=p();if(l("maxPayment"),d>await e.read("exercisableNow"))throw new o("The NET exercise amount exceeds the vested cap.");let m=await e.read("strikeWad");if(i=(d*m/10n**BigInt(v.decimals)+10n**12n-1n)/10n**12n,i===0n||i>A(t.maxPayment))throw new o("The exercise payment exceeds maxPayment or rounds to zero.");a=k,n=[d],s=`Exercise pays ${i} USDG base units into treasury reserves and mints ${d} NET base units to the immutable holder. No withdrawal or exercise reversal exists.`}else if(e.product==="treasury"){let d=p();if(r==="mintNet"||r==="spendUsdg"){l("recipient");let m=g(t.recipient);if(await e.read(r==="mintNet"?"isMinter":"isSpender",[c])!==!0)throw new o("This wallet lacks the fixed NetNet treasury minter/spender role.");n=[m,d],s=`Protocol treasury operation sends ${d} base units to ${m}; it does not deposit into this wallet\u2019s savings.`}else n=[d],s="Permissionless protocol reserve rebalance; assets remain owned by the NetNet treasury. The deployed fraction is constrained by the immutable cap."}else if(e.product==="rwa"){if(["depositInventory","setDiscount","setInventoryMax","setHalt","setMenu"].includes(r)&&g(await e.read("manager"))!==N(c))throw new o("This wallet lacks the immutable RWA manager role.");if(r==="redeem")if(l("noteIds"),t.noteIds===void 0)n=[c];else{if(!Array.isArray(t.noteIds)||!t.noteIds.length||t.noteIds.length>50)throw new o("Provide 1..50 unique note IDs.");let m=t.noteIds.map(b=>A(b,!0));if(new Set(m.map(String)).size!==m.length)throw new o("Note IDs must be unique.");let f=await e.read("noteCount",[c]);if(m.some(b=>b>=f))throw new o("RWA note ID is out of range.");n=[c,m]}else if(r==="setHalt"){if(l("halted"),typeof t.halted!="boolean")throw new o("Provide halted as a boolean.");n=[t.halted]}else if(r==="setMenu"){if(l("menu"),!Array.isArray(t.menu)||!t.menu.length||t.menu.length>32)throw new o("Provide 1..32 explicit RWA menu entries.");let m=t.menu.map(f=>{if(!f||typeof f!="object"||Array.isArray(f)||Object.keys(f).some(H=>!["token","feed","targetWeightBps","active"].includes(H)))throw new o("Invalid RWA menu fields.");let b=f;if(typeof b.active!="boolean")throw new o("RWA active must be boolean.");return{token:g(b.token),feed:g(b.feed),targetWeightBps:A(b.targetWeightBps,!0),active:b.active}});if(new Set(m.map(f=>f.token)).size!==m.length||m.reduce((f,b)=>f+b.targetWeightBps,0n)!==10000n||m.some(f=>f.active&&(f.token===j||f.feed===j)))throw new o("RWA menu tokens must be unique, weights sum to 10000, active feeds/tokens nonzero.");n=[m],s=`Replace the complete RWA equity menu: ${JSON.stringify(T(m))}.`}else if(r==="skim")l("token"),n=[g(t.token)],s=`Sweep eligible stray assets to sleeve ${g(await e.read("sleeve"))}, not to this wallet.`;else if(r!=="pokeHwm"){let m=p();if(n=[m],r==="depositInventory"&&(a=v,i=m,s="Inventory funding is one-way. The manager cannot withdraw these NET; they are committed to bond obligations."),r==="setDiscount"&&m>await e.read("MAX_DISCOUNT_BPS")||r==="setInventoryMax"&&m>await e.read("INVENTORY_HARD_CAP"))throw new o("RWA setting exceeds its immutable maximum.")}}else e.product==="premium"?(n=[w()],s="Permissionless mint-and-sell keeper operation; all sale proceeds go to NetNet treasury. The caller receives no reward."):(n=[p(),w()],s="Convert NET already owned by the tax collector. Proceeds split to treasury and team; the caller receives no reward and supplies no NET.");if(Object.keys(t).some(d=>!u.has(d)))throw new o("Unexpected fields for this NetNet operation.");if(a&&await e.rpc.readContract({address:a.address,abi:R,functionName:"balanceOf",args:[c],blockNumber:e.block.number})<i)throw new o(`Top up ${a.symbol}: needs ${i} base units.`);let x=`NetNet ${e.product}.${r}, contract ${e.contract}, chain ${y}, values ${JSON.stringify(T(n))}. ${a?`Approve exactly ${i} ${a.symbol} base units (${a.address}, decimals ${a.decimals}). `:""}${s}`,E=[...a?[h.approval(a.address,e.contract,i.toString(),y)]:[],h.unsignedTx({to:e.contract,data:L({abi:e.abi,functionName:r,args:n}),value:"0",chainId:y,description:x})],D=await h.preview(E,c),B=0n;for(let d of D.changes){if(!/^-?\d+$/.test(d.amount))throw new o("Invalid NetNet preview amount.");if(BigInt(d.amount)<0n&&(B-=BigInt(d.amount)),BigInt(d.amount)<0n&&(!a||d.token.chainId!==y||!F(d.token.address,a.address)||d.token.decimals!==a.decimals||-BigInt(d.amount)>i))throw new o("NetNet preview spends outside the exact input budget.")}if(B>i)throw new o("NetNet preview exceeds the aggregate input budget.");return{txs:E,preview:D,summary:x}})]}};export{C as a,z as b,oe as c};
@@ -1 +1 @@
1
- import{a as M}from"./K6D6SDIG.js";import{a as d}from"./ZTX4WT62.js";import{g as h,i as z,l as N,m as _,n as D}from"./NWNYJ26T.js";import{a as i}from"./XSD5NL7J.js";import{isHex as ce,keccak256 as pe}from"viem";var l=e=>N(z(e,"Provide a valid Chop address."),"Provide a nonzero Chop address."),P=e=>_(e,"Chop returned an invalid integer."),ye=e=>D(e,"Provide a positive Chop base-unit integer string within uint256.",{positive:!0});function he(e){if(typeof e!="string"||!ce(e,{strict:!0})||e.length<4||e.length%2)throw new i("Chop contract code is unavailable.");return pe(e)}function u(e){if(e?.aborted)throw new i("Chop read was cancelled.")}var B=(e,t,r,o,n,a,s)=>(u(s),e.readContract({address:t,abi:M,functionName:r,args:o,blockNumber:n,...a?{account:a}:{}}));async function L(e,t,r,o){u(o);let n=await e.multicall({allowFailure:!1,batchSize:0,blockNumber:r,contracts:t.map(a=>({address:a.target,abi:M,functionName:a.fn,args:a.args??[]}))});if(!Array.isArray(n)||n.length!==t.length)throw new i("Chop returned incomplete reads.");return n}async function le(e,t){if(u(t),await e.getChainId()!==d.chainId)throw new i("Chop requires chain 4663.");return u(t),P(await e.getBlockNumber({cacheTime:0}))}function b(e){if(!e||typeof e!="object"||Array.isArray(e))throw new i("Chop returned invalid log metadata.");return e}function R(e){if(typeof e!="number"||!Number.isInteger(e)||e<0||e>255)throw new i("Chop token decimals are invalid.");return e}function O(e){return typeof e=="string"&&/^[A-Za-z0-9.$_-]{1,32}$/.test(e)?e:"token"}var be=()=>new WeakMap;function j(e,t){if(!t)return;let r=t.get(e);return r||(r={code:new Map,implementations:new Map},t.set(e,r)),r}var q=(e,t)=>`${e.toLowerCase()}:${t}`;function F(e,t,r){let o=e?.get(t);if(o)return o;let n=r();return e?.set(t,n),n}async function W(e,t,r,o,n){u(o);let a=await F(j(e,n)?.code,q(t,r),async()=>he(await e.getCode({address:t,blockNumber:r})));return u(o),a}async function E(e,t,r,o,n){if(!h(await W(e,t.address,r,o,n),t.codeHash))throw new i("Chop trust-anchor code changed.")}async function V(e,t,r,o,n,a,s,c){await Promise.all([E(e,o,a,s,c),E(e,{address:t,codeHash:r},a,s,c)]),u(s);let A=await F(j(e,c)?.implementations,q(o.address,a),async()=>l(await B(e,o.address,"implementation",[],a,void 0,s))),x=await W(e,A,a,s,c);return{address:A,codeHash:x,changed:!h(x,n)}}function ge(e,t){let r=b(e);if(!h(l(r.index),t)||r.verified!==!0)throw new i("This is not a verified Chop registry log.")}async function Ae(e,t,r,o,n,a){u(n);let s=l(t),c=o??await le(e,n);await E(e,d.registry,c,n,a);let A=await B(e,d.registry.address,"getIndex",[s],c,void 0,n);if(ge(A,s),r==="enter"){if(b(A).makePublic!==!0)throw new i("This verified Chop log is not public for new deposits.");await B(e,d.registry.address,"validateIndex",[s],c,void 0,n)}let[x,T]=await Promise.all([L(e,["getAllAssets","PAIRED_LP_TOKEN","lpStakingPool","lpRewardsToken","v2Pool","fees","decimals","symbol","totalSupply","config"].map(p=>({target:s,fn:p})),c,n),V(e,s,d.proxy.codeHash,d.beacon,d.implementation.codeHash,c,n,a)]),[v,X,Z,G,J,Q,Y,ee,ne,te]=x;if(!Array.isArray(v)||v.length!==1||P(b(v[0]).weighting)!==10n**18n)throw new i("Only verified single-token Chop logs are supported.");let g=l(b(v[0]).token),w=l(X),m=l(Z),C=l(J);if(!h(l(G),d.chop)||[s,g,w,m,C].some(p=>h(p,d.dormantOak))||new Set([s,g,w,m,C].map(p=>p.toLowerCase())).size!==5)throw new i("Chop log token identities do not match the supported setup.");let oe=b(Q),re=Object.fromEntries(["burn","bond","debond","buy","sell","partner"].map(p=>{let f=oe[p];if(typeof f!="number"||!Number.isInteger(f)||f<0||f>1e4)throw new i("Chop returned invalid fees.");return[p,f]})),K=b(te);if(K.hasTransferTax!==!1||K.blacklistTKNpTKNPoolV2!==!1)throw new i("Chop transfer-tax or blocked-pool logs are unsupported.");let k=await L(e,[{target:g,fn:"decimals"},{target:g,fn:"symbol"},{target:w,fn:"decimals"},{target:w,fn:"symbol"},{target:m,fn:"POOL_REWARDS"},{target:s,fn:"totalAssets",args:[g]}],c,n),y=l(k[4]);if([s,g,w,m,C].some(p=>h(p,y)))throw new i("Chop rewards identity is invalid.");let[ae,se,ie]=await Promise.all([L(e,[{target:m,fn:"INDEX_FUND"},{target:m,fn:"stakingToken"},{target:y,fn:"indexFund"},{target:y,fn:"trackingToken"},{target:y,fn:"rewardsToken"}],c,n),V(e,m,d.staking.codeHash,d.stakingBeacon,d.stakingImplementation.codeHash,c,n,a),V(e,y,d.rewards.codeHash,d.rewardsBeacon,d.rewardsImplementation.codeHash,c,n,a)]);if(ae.some((p,f)=>!h(l(p),[s,C,s,m,d.chop][f])))throw new i("Chop staking or rewards links do not match this log.");let H={address:g,decimals:R(k[0]),symbol:h(g,d.oak)?"OAK":O(k[1]),chainId:4663};if(H.symbol.replace(/^\$/,"").toUpperCase()==="OAK"&&!h(g,d.oak))throw new i("Chop underlying OAK is not the canonical Oak token.");let de={address:w,decimals:R(k[2]),symbol:O(k[3]),chainId:4663},U={address:s,decimals:R(Y),symbol:O(ee),chainId:4663},I=[T.changed?"log implementation":"",se.changed?"staking implementation":"",ie.changed?"rewards implementation":""].filter(Boolean);if(r==="enter"&&I.length)throw new i(`Chop implementation changed (${I.join(", ")}); wraps and farms are refused.`);let S=P(ne),$=P(k[5]);if(S===0n)throw new i("This Chop log has no issued supply.");return{log:U,underlying:H,paired:de,staking:{address:m,symbol:"Chop staked LP",decimals:18,chainId:4663},rewards:y,pool:C,fees:re,totalSupply:S.toString(),managedUnderlying:$.toString(),backingPerLog:{token:H,amount:($*10n**BigInt(U.decimals)/S).toString()},implementation:T.address,implementationHash:T.codeHash,drift:I,measuredAtBlock:c.toString()}}function Ce(e,t,r=!1){if(e.length!==t.length||e.some((o,n)=>!h(o.to,t[n].to)||o.data!==t[n].data||o.value!=="0"||o.chainId!==4663||o.gasLimit!==t[n].gasLimit&&!(r&&o.gasLimit===void 0)))throw new i("Chop transaction or exact approval does not match the requested action.")}function Pe(e,t){let r=new Map;for(let o of e.changes){let n=t.find(c=>h(c.token.address,o.token.address));if(!n||o.token.chainId!==4663||o.token.decimals!==n.token.decimals||typeof o.amount!="string"||!/^-?\d+$/.test(o.amount))throw new i("Chop preview showed an unexpected token movement.");let a=BigInt(o.amount);if(P(a<0n?-a:a),n.min>=0n&&a<0n||n.max!==void 0&&n.max<=0n&&a>0n)throw new i("Chop preview showed a reversed token movement.");let s=n.token.address.toLowerCase();r.set(s,(r.get(s)??0n)+a)}for(let o of t){let n=r.get(o.token.address.toLowerCase())??0n;if(n<o.min||o.max!==void 0&&n>o.max)throw new i("Chop preview receipt does not meet the quoted amount.")}return r}export{l as a,P as b,ye as c,he as d,u as e,B as f,L as g,le as h,be as i,E as j,ge as k,Ae as l,Ce as m,Pe as n};
1
+ import{a as M}from"./K6D6SDIG.js";import{a as d}from"./CFPJDLTZ.js";import{g as h,i as z,l as N,m as _,n as D}from"./NWNYJ26T.js";import{a as i}from"./XSD5NL7J.js";import{isHex as ce,keccak256 as pe}from"viem";var l=e=>N(z(e,"Provide a valid Chop address."),"Provide a nonzero Chop address."),P=e=>_(e,"Chop returned an invalid integer."),ye=e=>D(e,"Provide a positive Chop base-unit integer string within uint256.",{positive:!0});function he(e){if(typeof e!="string"||!ce(e,{strict:!0})||e.length<4||e.length%2)throw new i("Chop contract code is unavailable.");return pe(e)}function u(e){if(e?.aborted)throw new i("Chop read was cancelled.")}var B=(e,t,r,o,n,a,s)=>(u(s),e.readContract({address:t,abi:M,functionName:r,args:o,blockNumber:n,...a?{account:a}:{}}));async function L(e,t,r,o){u(o);let n=await e.multicall({allowFailure:!1,batchSize:0,blockNumber:r,contracts:t.map(a=>({address:a.target,abi:M,functionName:a.fn,args:a.args??[]}))});if(!Array.isArray(n)||n.length!==t.length)throw new i("Chop returned incomplete reads.");return n}async function le(e,t){if(u(t),await e.getChainId()!==d.chainId)throw new i("Chop requires chain 4663.");return u(t),P(await e.getBlockNumber({cacheTime:0}))}function b(e){if(!e||typeof e!="object"||Array.isArray(e))throw new i("Chop returned invalid log metadata.");return e}function R(e){if(typeof e!="number"||!Number.isInteger(e)||e<0||e>255)throw new i("Chop token decimals are invalid.");return e}function O(e){return typeof e=="string"&&/^[A-Za-z0-9.$_-]{1,32}$/.test(e)?e:"token"}var be=()=>new WeakMap;function j(e,t){if(!t)return;let r=t.get(e);return r||(r={code:new Map,implementations:new Map},t.set(e,r)),r}var q=(e,t)=>`${e.toLowerCase()}:${t}`;function F(e,t,r){let o=e?.get(t);if(o)return o;let n=r();return e?.set(t,n),n}async function W(e,t,r,o,n){u(o);let a=await F(j(e,n)?.code,q(t,r),async()=>he(await e.getCode({address:t,blockNumber:r})));return u(o),a}async function E(e,t,r,o,n){if(!h(await W(e,t.address,r,o,n),t.codeHash))throw new i("Chop trust-anchor code changed.")}async function V(e,t,r,o,n,a,s,c){await Promise.all([E(e,o,a,s,c),E(e,{address:t,codeHash:r},a,s,c)]),u(s);let A=await F(j(e,c)?.implementations,q(o.address,a),async()=>l(await B(e,o.address,"implementation",[],a,void 0,s))),x=await W(e,A,a,s,c);return{address:A,codeHash:x,changed:!h(x,n)}}function ge(e,t){let r=b(e);if(!h(l(r.index),t)||r.verified!==!0)throw new i("This is not a verified Chop registry log.")}async function Ae(e,t,r,o,n,a){u(n);let s=l(t),c=o??await le(e,n);await E(e,d.registry,c,n,a);let A=await B(e,d.registry.address,"getIndex",[s],c,void 0,n);if(ge(A,s),r==="enter"){if(b(A).makePublic!==!0)throw new i("This verified Chop log is not public for new deposits.");await B(e,d.registry.address,"validateIndex",[s],c,void 0,n)}let[x,T]=await Promise.all([L(e,["getAllAssets","PAIRED_LP_TOKEN","lpStakingPool","lpRewardsToken","v2Pool","fees","decimals","symbol","totalSupply","config"].map(p=>({target:s,fn:p})),c,n),V(e,s,d.proxy.codeHash,d.beacon,d.implementation.codeHash,c,n,a)]),[v,X,Z,G,J,Q,Y,ee,ne,te]=x;if(!Array.isArray(v)||v.length!==1||P(b(v[0]).weighting)!==10n**18n)throw new i("Only verified single-token Chop logs are supported.");let g=l(b(v[0]).token),w=l(X),m=l(Z),C=l(J);if(!h(l(G),d.chop)||[s,g,w,m,C].some(p=>h(p,d.dormantOak))||new Set([s,g,w,m,C].map(p=>p.toLowerCase())).size!==5)throw new i("Chop log token identities do not match the supported setup.");let oe=b(Q),re=Object.fromEntries(["burn","bond","debond","buy","sell","partner"].map(p=>{let f=oe[p];if(typeof f!="number"||!Number.isInteger(f)||f<0||f>1e4)throw new i("Chop returned invalid fees.");return[p,f]})),K=b(te);if(K.hasTransferTax!==!1||K.blacklistTKNpTKNPoolV2!==!1)throw new i("Chop transfer-tax or blocked-pool logs are unsupported.");let k=await L(e,[{target:g,fn:"decimals"},{target:g,fn:"symbol"},{target:w,fn:"decimals"},{target:w,fn:"symbol"},{target:m,fn:"POOL_REWARDS"},{target:s,fn:"totalAssets",args:[g]}],c,n),y=l(k[4]);if([s,g,w,m,C].some(p=>h(p,y)))throw new i("Chop rewards identity is invalid.");let[ae,se,ie]=await Promise.all([L(e,[{target:m,fn:"INDEX_FUND"},{target:m,fn:"stakingToken"},{target:y,fn:"indexFund"},{target:y,fn:"trackingToken"},{target:y,fn:"rewardsToken"}],c,n),V(e,m,d.staking.codeHash,d.stakingBeacon,d.stakingImplementation.codeHash,c,n,a),V(e,y,d.rewards.codeHash,d.rewardsBeacon,d.rewardsImplementation.codeHash,c,n,a)]);if(ae.some((p,f)=>!h(l(p),[s,C,s,m,d.chop][f])))throw new i("Chop staking or rewards links do not match this log.");let H={address:g,decimals:R(k[0]),symbol:h(g,d.oak)?"OAK":O(k[1]),chainId:4663};if(H.symbol.replace(/^\$/,"").toUpperCase()==="OAK"&&!h(g,d.oak))throw new i("Chop underlying OAK is not the canonical Oak token.");let de={address:w,decimals:R(k[2]),symbol:O(k[3]),chainId:4663},U={address:s,decimals:R(Y),symbol:O(ee),chainId:4663},I=[T.changed?"log implementation":"",se.changed?"staking implementation":"",ie.changed?"rewards implementation":""].filter(Boolean);if(r==="enter"&&I.length)throw new i(`Chop implementation changed (${I.join(", ")}); wraps and farms are refused.`);let S=P(ne),$=P(k[5]);if(S===0n)throw new i("This Chop log has no issued supply.");return{log:U,underlying:H,paired:de,staking:{address:m,symbol:"Chop staked LP",decimals:18,chainId:4663},rewards:y,pool:C,fees:re,totalSupply:S.toString(),managedUnderlying:$.toString(),backingPerLog:{token:H,amount:($*10n**BigInt(U.decimals)/S).toString()},implementation:T.address,implementationHash:T.codeHash,drift:I,measuredAtBlock:c.toString()}}function Ce(e,t,r=!1){if(e.length!==t.length||e.some((o,n)=>!h(o.to,t[n].to)||o.data!==t[n].data||o.value!=="0"||o.chainId!==4663||o.gasLimit!==t[n].gasLimit&&!(r&&o.gasLimit===void 0)))throw new i("Chop transaction or exact approval does not match the requested action.")}function Pe(e,t){let r=new Map;for(let o of e.changes){let n=t.find(c=>h(c.token.address,o.token.address));if(!n||o.token.chainId!==4663||o.token.decimals!==n.token.decimals||typeof o.amount!="string"||!/^-?\d+$/.test(o.amount))throw new i("Chop preview showed an unexpected token movement.");let a=BigInt(o.amount);if(P(a<0n?-a:a),n.min>=0n&&a<0n||n.max!==void 0&&n.max<=0n&&a>0n)throw new i("Chop preview showed a reversed token movement.");let s=n.token.address.toLowerCase();r.set(s,(r.get(s)??0n)+a)}for(let o of t){let n=r.get(o.token.address.toLowerCase())??0n;if(n<o.min||o.max!==void 0&&n>o.max)throw new i("Chop preview receipt does not meet the quoted amount.")}return r}export{l as a,P as b,ye as c,he as d,u as e,B as f,L as g,le as h,be as i,E as j,ge as k,Ae as l,Ce as m,Pe as n};
@@ -1 +1 @@
1
- import{a as U,b as N,c as _}from"./XW3VGWXK.js";import{e as S}from"./NMJVQX5M.js";import{b as k,c as R}from"./2OVJ2BTJ.js";import{a as q,c as f,d as h,f as I,g as D}from"./GQITAJVF.js";import{g as B}from"./OUROA7XR.js";import{a as b,c as O}from"./43LI5NKJ.js";import{b as v}from"./66F5ZH34.js";import{b as A}from"./TI727O2H.js";import{a as s}from"./XSD5NL7J.js";import{erc20Abi as $}from"viem";var K=a=>{function w(e,n){if(Object.keys(e).some(m=>!n.includes(m)))throw new s("Use only the inputs shown for this Pendle tool. YT and LP actions are not supported.")}function j(e){if(typeof e!="string"||!/^[0-9]+$/.test(e)||e.length>78)throw new s("Provide a positive decimal base-unit amount as a string.");return k(BigInt(e),!0)}function C(e,n){let m=e==="stable"?100:200,r=n===void 0?e==="stable"?50:100:n;if(typeof r!="number"||!Number.isInteger(r)||r<0)throw new s("Slippage must be a whole number of basis points.");if(r>m)throw new s(`Oak won't accept a price move that big. The most it allows is ${m/100}%.`);return r}async function y(e,n,m){w(n,["market","amount","slippageBps"]),f(h(m,a.wallet),"wallet does not match this request"),b(n.market);for(let r=0;r<2;r++){let t=await a.verify(n.market);f(h(t.market,n.market),"verified market does not match the request");let d=await a.client.getBlock();if(t.expired||d.timestamp>=BigInt(t.expiry))throw new s("This Pendle term has ended. Use pendle_redeem to cash out.");let p=C(t.kind,n.slippageBps),o=e==="sell"&&n.amount==="max"?k(await a.client.readContract({address:t.pt,abi:$,functionName:"balanceOf",args:[a.wallet],blockNumber:d.number}),!0):j(n.amount),i=e==="buy"?t.inputToken:t.pt,l=e==="buy"?t.pt:t.inputToken,u=await B(a.http,{inputToken:i,outputToken:l,amount:o,wallet:a.wallet,slippageBps:p}),c=(e==="buy"?I:D)(u.body,{market:t,wallet:a.wallet,amount:o,slippageBps:p});if(Math.abs(c.priceImpact)>.03)throw new s("This is a thin market and your size moves the price too much. Try a smaller amount.");if(Date.now()-u.receivedAt>3e4)continue;await R(a.client,t,e,o,c.amountOut,c.priceImpact);let T=Date.now()-u.receivedAt;if(T<0||T>3e4)continue;let x=e==="sell"?{wallet:a.wallet,market:t.market,pt:t.pt,outputToken:l,amountIn:o.toString(),amountOut:c.amountOut.toString(),minOut:c.minOut.toString(),ptDecimals:t.ptDecimals,outputDecimals:t.inputDecimals,endsAt:t.expiry,feeUsd:c.feeUsd,receivedAt:u.receivedAt,data:c.tx.data}:void 0;return{txs:[O(i,q,o.toString(),A),c.tx],...x?{pendleSellQuote:x}:{},summary:e==="buy"?"Approve the exact input amount, then buy Pendle PT.":"Approve the exact PT amount, then sell early at today\u2019s market price."}}throw new s("Pendle\u2019s quote became too old. Try again for a fresh price.")}async function M(e,n){w(e,["market","minOutBps"]),f(h(n,a.wallet),"wallet does not match this request");let m=U(e.minOutBps),r;if(e.market==="all")try{r=await S(a.client)}catch{throw new s("Oak could not read ended Pendle markets from the chain. Provide one ended market address to cash it out.")}else b(e.market),r=[e.market];let t=[];for(let o of r){let i=await a.verify(o);if(f(h(i.market,o),"verified market does not match the request"),e.market==="all"&&!i.expired)continue;let l=k(await a.client.readContract({address:i.pt,abi:$,functionName:"balanceOf",args:[a.wallet]}));l!==0n&&t.push({verified:i,balance:l})}if(t.length>1)throw new s(`Ended Pendle terms are cashed out one at a time. Run pendle_redeem with one of these market addresses: ${t.map(({verified:o})=>o.market).join(", ")}.`);let d=[],p=[];for(let{verified:o,balance:i}of t){let l=await N(a,o,i,m);d.push(...l.txs);let u=await _(a,o,i,l.expected,m);u&&p.push(u)}return{txs:d,summary:d.length?["Cash out ended Pendle PT balances to each market\u2019s input token.",...p].join(" "):"No PT balance in the selected ended Pendle terms."}}let g={type:"string",pattern:"^0x[0-9a-fA-F]{40}$",description:"Pendle market address returned by pendle_list."},P={type:"integer",minimum:0,maximum:200,description:"USDG: default 50, cap 100 bps. Stock tokens: default 100, cap 200 bps; the verified market determines the cap."};return[{name:"pendle_buy",inputSchema:{type:"object",properties:{market:g,amount:v("Positive decimal base units of the market input token; read its decimals first."),slippageBps:P},required:["market","amount"],additionalProperties:!1},execute:(e,n)=>y("buy",e,n)},{name:"pendle_sell",inputSchema:{type:"object",properties:{market:g,amount:{type:"string",anyOf:[{pattern:"^[0-9]+$"},{const:"max"}],description:"PT decimal base units, or max for the full PT balance."},slippageBps:P},required:["market","amount"],additionalProperties:!1},execute:(e,n)=>y("sell",e,n)},{name:"pendle_redeem",inputSchema:{type:"object",properties:{market:{type:"string",anyOf:[{pattern:"^0x[0-9a-fA-F]{40}$"},{const:"all"}],description:"Ended market address, or all ended markets held by this wallet."},minOutBps:{type:"integer",minimum:0,maximum:50,default:10,description:"Maximum reduction from the on-chain redemption estimate, in basis points."}},required:["market"],additionalProperties:!1},execute:M}]};export{K as a};
1
+ import{a as U,b as N,c as _}from"./XW3VGWXK.js";import{b as k,c as R}from"./2OVJ2BTJ.js";import{a as q,c as f,d as h,f as I,g as D}from"./GQITAJVF.js";import{g as B}from"./OUROA7XR.js";import{e as S}from"./NMJVQX5M.js";import{a as b,c as O}from"./43LI5NKJ.js";import{b as v}from"./66F5ZH34.js";import{b as A}from"./TI727O2H.js";import{a as s}from"./XSD5NL7J.js";import{erc20Abi as $}from"viem";var K=a=>{function w(e,n){if(Object.keys(e).some(m=>!n.includes(m)))throw new s("Use only the inputs shown for this Pendle tool. YT and LP actions are not supported.")}function j(e){if(typeof e!="string"||!/^[0-9]+$/.test(e)||e.length>78)throw new s("Provide a positive decimal base-unit amount as a string.");return k(BigInt(e),!0)}function C(e,n){let m=e==="stable"?100:200,r=n===void 0?e==="stable"?50:100:n;if(typeof r!="number"||!Number.isInteger(r)||r<0)throw new s("Slippage must be a whole number of basis points.");if(r>m)throw new s(`Oak won't accept a price move that big. The most it allows is ${m/100}%.`);return r}async function y(e,n,m){w(n,["market","amount","slippageBps"]),f(h(m,a.wallet),"wallet does not match this request"),b(n.market);for(let r=0;r<2;r++){let t=await a.verify(n.market);f(h(t.market,n.market),"verified market does not match the request");let d=await a.client.getBlock();if(t.expired||d.timestamp>=BigInt(t.expiry))throw new s("This Pendle term has ended. Use pendle_redeem to cash out.");let p=C(t.kind,n.slippageBps),o=e==="sell"&&n.amount==="max"?k(await a.client.readContract({address:t.pt,abi:$,functionName:"balanceOf",args:[a.wallet],blockNumber:d.number}),!0):j(n.amount),i=e==="buy"?t.inputToken:t.pt,l=e==="buy"?t.pt:t.inputToken,u=await B(a.http,{inputToken:i,outputToken:l,amount:o,wallet:a.wallet,slippageBps:p}),c=(e==="buy"?I:D)(u.body,{market:t,wallet:a.wallet,amount:o,slippageBps:p});if(Math.abs(c.priceImpact)>.03)throw new s("This is a thin market and your size moves the price too much. Try a smaller amount.");if(Date.now()-u.receivedAt>3e4)continue;await R(a.client,t,e,o,c.amountOut,c.priceImpact);let T=Date.now()-u.receivedAt;if(T<0||T>3e4)continue;let x=e==="sell"?{wallet:a.wallet,market:t.market,pt:t.pt,outputToken:l,amountIn:o.toString(),amountOut:c.amountOut.toString(),minOut:c.minOut.toString(),ptDecimals:t.ptDecimals,outputDecimals:t.inputDecimals,endsAt:t.expiry,feeUsd:c.feeUsd,receivedAt:u.receivedAt,data:c.tx.data}:void 0;return{txs:[O(i,q,o.toString(),A),c.tx],...x?{pendleSellQuote:x}:{},summary:e==="buy"?"Approve the exact input amount, then buy Pendle PT.":"Approve the exact PT amount, then sell early at today\u2019s market price."}}throw new s("Pendle\u2019s quote became too old. Try again for a fresh price.")}async function M(e,n){w(e,["market","minOutBps"]),f(h(n,a.wallet),"wallet does not match this request");let m=U(e.minOutBps),r;if(e.market==="all")try{r=await S(a.client)}catch{throw new s("Oak could not read ended Pendle markets from the chain. Provide one ended market address to cash it out.")}else b(e.market),r=[e.market];let t=[];for(let o of r){let i=await a.verify(o);if(f(h(i.market,o),"verified market does not match the request"),e.market==="all"&&!i.expired)continue;let l=k(await a.client.readContract({address:i.pt,abi:$,functionName:"balanceOf",args:[a.wallet]}));l!==0n&&t.push({verified:i,balance:l})}if(t.length>1)throw new s(`Ended Pendle terms are cashed out one at a time. Run pendle_redeem with one of these market addresses: ${t.map(({verified:o})=>o.market).join(", ")}.`);let d=[],p=[];for(let{verified:o,balance:i}of t){let l=await N(a,o,i,m);d.push(...l.txs);let u=await _(a,o,i,l.expected,m);u&&p.push(u)}return{txs:d,summary:d.length?["Cash out ended Pendle PT balances to each market\u2019s input token.",...p].join(" "):"No PT balance in the selected ended Pendle terms."}}let g={type:"string",pattern:"^0x[0-9a-fA-F]{40}$",description:"Pendle market address returned by pendle_list."},P={type:"integer",minimum:0,maximum:200,description:"USDG: default 50, cap 100 bps. Stock tokens: default 100, cap 200 bps; the verified market determines the cap."};return[{name:"pendle_buy",inputSchema:{type:"object",properties:{market:g,amount:v("Positive decimal base units of the market input token; read its decimals first."),slippageBps:P},required:["market","amount"],additionalProperties:!1},execute:(e,n)=>y("buy",e,n)},{name:"pendle_sell",inputSchema:{type:"object",properties:{market:g,amount:{type:"string",anyOf:[{pattern:"^[0-9]+$"},{const:"max"}],description:"PT decimal base units, or max for the full PT balance."},slippageBps:P},required:["market","amount"],additionalProperties:!1},execute:(e,n)=>y("sell",e,n)},{name:"pendle_redeem",inputSchema:{type:"object",properties:{market:{type:"string",anyOf:[{pattern:"^0x[0-9a-fA-F]{40}$"},{const:"all"}],description:"Ended market address, or all ended markets held by this wallet."},minOutBps:{type:"integer",minimum:0,maximum:50,default:10,description:"Maximum reduction from the on-chain redemption estimate, in basis points."}},required:["market"],additionalProperties:!1},execute:M}]};export{K as a};
@@ -1 +1 @@
1
- import{a as y,b as P,d as I,e as q,f as T,g as L}from"./N6PHSHBE.js";import{a as w}from"./66F5ZH34.js";import{c as k,g as D}from"./NWNYJ26T.js";import{b as f}from"./TI727O2H.js";import{a as c}from"./XSD5NL7J.js";import{encodeFunctionData as U,erc20Abi as $,getAddress as O,parseAbi as S,zeroAddress as g}from"viem";var _=O("0x8bceaa40b9acdfaedf85adf4ff01f5ad6517937f"),h=O("0x89e5db8b5aa49aa85ac63f691524311aeb649eba"),F=S(["function getPair(address,address) view returns (address)"]),N=S(["function token0() view returns (address)","function token1() view returns (address)","function getReserves() view returns (uint112,uint112,uint32)","function totalSupply() view returns (uint256)","function balanceOf(address) view returns (uint256)"]),E=S(["function factory() view returns (address)","function addLiquidity(address tokenA,address tokenB,uint256 amountADesired,uint256 amountBDesired,uint256 amountAMin,uint256 amountBMin,address to,uint256 deadline) returns (uint256,uint256,uint256)","function removeLiquidity(address tokenA,address tokenB,uint256 liquidity,uint256 amountAMin,uint256 amountBMin,address to,uint256 deadline) returns (uint256,uint256)","function getAmountsOut(uint256 amountIn,address[] path) view returns (uint256[] amounts)","function getAmountsIn(uint256 amountOut,address[] path) view returns (uint256[] amounts)"]);async function z(s,p,t,n){if(p===g||t===g||p===t)throw new c("Provide two different ERC-20 tokens; use WETH for native ETH.");let r=s.clientFor(f),i=await r.getBlockNumber(),a=await r.readContract({address:_,abi:F,functionName:"getPair",args:[p,t],blockNumber:i}),[e,A]=await Promise.all([q(s,p,i),q(s,t,i)]);if(a===g)return{pair:a,tokenA:e,tokenB:A,reserveA:0n,reserveB:0n,supply:0n,balance:0n,blockNumber:i};let[M,l,v,B]=await Promise.all([r.readContract({address:a,abi:N,functionName:"token0",blockNumber:i}),r.readContract({address:a,abi:N,functionName:"getReserves",blockNumber:i}),r.readContract({address:a,abi:N,functionName:"totalSupply",blockNumber:i}),r.readContract({address:a,abi:$,functionName:"balanceOf",args:[n],blockNumber:i})]),[b,o]=D(M,p)?l:[l[1],l[0]];return{pair:a,tokenA:e,tokenB:A,reserveA:b,reserveB:o,supply:v,balance:B,blockNumber:i}}var H={tokenA:{...k,description:"Address of the first ERC-20 token."},tokenB:{...k,description:"Address of the second ERC-20 token."},amountADesired:w('Desired amount of tokenA in base units; use tokenA decimals. Example: "1000000" = 1 tokenA at 6 decimals.'),amountBDesired:w('Desired amount of tokenB in base units; use tokenB decimals. Example: "1000000" = 1 tokenB at 6 decimals.'),liquidity:{description:'LP token amount in base units (18 decimals), or "all" for the wallet balance. Example: "1000000000000000000" = 1 LP token.',type:"string",pattern:"^(?:[0-9]+|all)$"},slippageBps:{description:"Slippage tolerance in basis points (50 = 0.5%).",type:"integer",minimum:0,maximum:9999},amountAMin:w('Minimum amount of tokenA in base units; use tokenA decimals. Example: "1000000" = 1 tokenA at 6 decimals.'),amountBMin:w('Minimum amount of tokenB in base units; use tokenB decimals. Example: "1000000" = 1 tokenB at 6 decimals.')};function J(s){let p=async(t,n,r)=>{L(n,t==="pool"?["tokenA","tokenB"]:["tokenA","tokenB","slippageBps","amountAMin","amountBMin",...t==="add"?["amountADesired","amountBDesired"]:["liquidity"]]);let i=P(n.tokenA),a=P(n.tokenB),e=await z(s,i,a,r);if(t==="pool")return{pair:e.pair,tokenA:e.tokenA,tokenB:e.tokenB,reserveA:e.reserveA.toString(),reserveB:e.reserveB.toString(),totalSupply:e.supply.toString(),balance:e.balance.toString(),blockNumber:e.blockNumber.toString(),initialized:e.pair!==g};let A=s.clientFor(f),M=I(n.slippageBps);if(!D(await A.readContract({address:h,abi:E,functionName:"factory"}),_))throw new c("Uniswap v2 router factory differs from its pinned deployment.");let l=(await A.getBlock()).timestamp+300n,v=[],B=(o,d,m)=>{let u=o===void 0?d*BigInt(1e4-M)/10000n:y(o,m,256,!0);if(u>d||d>0n&&u===0n)throw new c(`${m} must be positive and no more than the reserve-ratio estimate.`);return u},b;if(t==="add"){let o=y(n.amountADesired,"amountADesired"),d=y(n.amountBDesired,"amountBDesired");if(e.reserveA===0n!=(e.reserveB===0n))throw new c("Uniswap v2 pair reserves are inconsistent.");let m=o,u=d;if(e.reserveA>0n&&e.reserveB>0n){let R=o*e.reserveB/e.reserveA;R<=d?u=R:m=d*e.reserveA/e.reserveB}if(m===0n||u===0n)throw new c("Liquidity amounts round to zero at the pool reserve ratio.");let x=B(n.amountAMin,m,"amountAMin"),C=B(n.amountBMin,u,"amountBMin");v.push(s.approval(i,h,o.toString(),f),s.approval(a,h,d.toString(),f)),b=U({abi:E,functionName:"addLiquidity",args:[i,a,o,d,x,C,r,l]})}else{if(e.pair===g||e.supply===0n)throw new c("No Uniswap v2 liquidity exists for this pair.");let o=n.liquidity==="all"?e.balance:y(n.liquidity,"liquidity");if(o===0n||o>e.balance)throw new c("Removal exceeds the wallet LP token balance or is zero.");let[d,m]=await Promise.all([i,a].map(C=>A.readContract({address:C,abi:$,functionName:"balanceOf",args:[e.pair]}))),u=B(n.amountAMin,o*d/e.supply,"amountAMin"),x=B(n.amountBMin,o*m/e.supply,"amountBMin");v.push(s.approval(e.pair,h,o.toString(),f)),b=U({abi:E,functionName:"removeLiquidity",args:[i,a,o,u,x,r,l]})}return v.push(s.unsignedTx({to:h,data:b,value:"0",chainId:f,description:`${t} Uniswap v2 liquidity for ${i}/${a}; recipient ${r}; deadline ${l}.`})),T(s,v,r,`${t==="add"?"Add":"Remove"} v2 liquidity. Review exact approvals, token minimums and wallet recipient. The first deposit sets the price; v2 locks MINIMUM_LIQUIDITY permanently.`)};return{tools:["pool","add","remove"].map(t=>({name:`uniswap_v2_${t}`,inputSchema:{type:"object",additionalProperties:!1,required:["tokenA","tokenB",...t==="add"?["amountADesired","amountBDesired"]:t==="remove"?["liquidity"]:[]],properties:t==="pool"?{tokenA:{...k,description:"Address of the first ERC-20 token."},tokenB:{...k,description:"Address of the second ERC-20 token."}}:H},execute:(n,r)=>p(t,n,r)}))}}export{_ as a,h as b,F as c,N as d,E as e,z as f,J as g};
1
+ import{a as y,b as P,d as I,e as q,f as T,g as L}from"./ZXRIJG6H.js";import{a as w}from"./66F5ZH34.js";import{c as k,g as D}from"./NWNYJ26T.js";import{b as f}from"./TI727O2H.js";import{a as c}from"./XSD5NL7J.js";import{encodeFunctionData as U,erc20Abi as $,getAddress as O,parseAbi as S,zeroAddress as g}from"viem";var _=O("0x8bceaa40b9acdfaedf85adf4ff01f5ad6517937f"),h=O("0x89e5db8b5aa49aa85ac63f691524311aeb649eba"),F=S(["function getPair(address,address) view returns (address)"]),N=S(["function token0() view returns (address)","function token1() view returns (address)","function getReserves() view returns (uint112,uint112,uint32)","function totalSupply() view returns (uint256)","function balanceOf(address) view returns (uint256)"]),E=S(["function factory() view returns (address)","function addLiquidity(address tokenA,address tokenB,uint256 amountADesired,uint256 amountBDesired,uint256 amountAMin,uint256 amountBMin,address to,uint256 deadline) returns (uint256,uint256,uint256)","function removeLiquidity(address tokenA,address tokenB,uint256 liquidity,uint256 amountAMin,uint256 amountBMin,address to,uint256 deadline) returns (uint256,uint256)","function getAmountsOut(uint256 amountIn,address[] path) view returns (uint256[] amounts)","function getAmountsIn(uint256 amountOut,address[] path) view returns (uint256[] amounts)"]);async function z(s,p,t,n){if(p===g||t===g||p===t)throw new c("Provide two different ERC-20 tokens; use WETH for native ETH.");let r=s.clientFor(f),i=await r.getBlockNumber(),a=await r.readContract({address:_,abi:F,functionName:"getPair",args:[p,t],blockNumber:i}),[e,A]=await Promise.all([q(s,p,i),q(s,t,i)]);if(a===g)return{pair:a,tokenA:e,tokenB:A,reserveA:0n,reserveB:0n,supply:0n,balance:0n,blockNumber:i};let[M,l,v,B]=await Promise.all([r.readContract({address:a,abi:N,functionName:"token0",blockNumber:i}),r.readContract({address:a,abi:N,functionName:"getReserves",blockNumber:i}),r.readContract({address:a,abi:N,functionName:"totalSupply",blockNumber:i}),r.readContract({address:a,abi:$,functionName:"balanceOf",args:[n],blockNumber:i})]),[b,o]=D(M,p)?l:[l[1],l[0]];return{pair:a,tokenA:e,tokenB:A,reserveA:b,reserveB:o,supply:v,balance:B,blockNumber:i}}var H={tokenA:{...k,description:"Address of the first ERC-20 token."},tokenB:{...k,description:"Address of the second ERC-20 token."},amountADesired:w('Desired amount of tokenA in base units; use tokenA decimals. Example: "1000000" = 1 tokenA at 6 decimals.'),amountBDesired:w('Desired amount of tokenB in base units; use tokenB decimals. Example: "1000000" = 1 tokenB at 6 decimals.'),liquidity:{description:'LP token amount in base units (18 decimals), or "all" for the wallet balance. Example: "1000000000000000000" = 1 LP token.',type:"string",pattern:"^(?:[0-9]+|all)$"},slippageBps:{description:"Slippage tolerance in basis points (50 = 0.5%).",type:"integer",minimum:0,maximum:9999},amountAMin:w('Minimum amount of tokenA in base units; use tokenA decimals. Example: "1000000" = 1 tokenA at 6 decimals.'),amountBMin:w('Minimum amount of tokenB in base units; use tokenB decimals. Example: "1000000" = 1 tokenB at 6 decimals.')};function J(s){let p=async(t,n,r)=>{L(n,t==="pool"?["tokenA","tokenB"]:["tokenA","tokenB","slippageBps","amountAMin","amountBMin",...t==="add"?["amountADesired","amountBDesired"]:["liquidity"]]);let i=P(n.tokenA),a=P(n.tokenB),e=await z(s,i,a,r);if(t==="pool")return{pair:e.pair,tokenA:e.tokenA,tokenB:e.tokenB,reserveA:e.reserveA.toString(),reserveB:e.reserveB.toString(),totalSupply:e.supply.toString(),balance:e.balance.toString(),blockNumber:e.blockNumber.toString(),initialized:e.pair!==g};let A=s.clientFor(f),M=I(n.slippageBps);if(!D(await A.readContract({address:h,abi:E,functionName:"factory"}),_))throw new c("Uniswap v2 router factory differs from its pinned deployment.");let l=(await A.getBlock()).timestamp+300n,v=[],B=(o,d,m)=>{let u=o===void 0?d*BigInt(1e4-M)/10000n:y(o,m,256,!0);if(u>d||d>0n&&u===0n)throw new c(`${m} must be positive and no more than the reserve-ratio estimate.`);return u},b;if(t==="add"){let o=y(n.amountADesired,"amountADesired"),d=y(n.amountBDesired,"amountBDesired");if(e.reserveA===0n!=(e.reserveB===0n))throw new c("Uniswap v2 pair reserves are inconsistent.");let m=o,u=d;if(e.reserveA>0n&&e.reserveB>0n){let R=o*e.reserveB/e.reserveA;R<=d?u=R:m=d*e.reserveA/e.reserveB}if(m===0n||u===0n)throw new c("Liquidity amounts round to zero at the pool reserve ratio.");let x=B(n.amountAMin,m,"amountAMin"),C=B(n.amountBMin,u,"amountBMin");v.push(s.approval(i,h,o.toString(),f),s.approval(a,h,d.toString(),f)),b=U({abi:E,functionName:"addLiquidity",args:[i,a,o,d,x,C,r,l]})}else{if(e.pair===g||e.supply===0n)throw new c("No Uniswap v2 liquidity exists for this pair.");let o=n.liquidity==="all"?e.balance:y(n.liquidity,"liquidity");if(o===0n||o>e.balance)throw new c("Removal exceeds the wallet LP token balance or is zero.");let[d,m]=await Promise.all([i,a].map(C=>A.readContract({address:C,abi:$,functionName:"balanceOf",args:[e.pair]}))),u=B(n.amountAMin,o*d/e.supply,"amountAMin"),x=B(n.amountBMin,o*m/e.supply,"amountBMin");v.push(s.approval(e.pair,h,o.toString(),f)),b=U({abi:E,functionName:"removeLiquidity",args:[i,a,o,u,x,r,l]})}return v.push(s.unsignedTx({to:h,data:b,value:"0",chainId:f,description:`${t} Uniswap v2 liquidity for ${i}/${a}; recipient ${r}; deadline ${l}.`})),T(s,v,r,`${t==="add"?"Add":"Remove"} v2 liquidity. Review exact approvals, token minimums and wallet recipient. The first deposit sets the price; v2 locks MINIMUM_LIQUIDITY permanently.`)};return{tools:["pool","add","remove"].map(t=>({name:`uniswap_v2_${t}`,inputSchema:{type:"object",additionalProperties:!1,required:["tokenA","tokenB",...t==="add"?["amountADesired","amountBDesired"]:t==="remove"?["liquidity"]:[]],properties:t==="pool"?{tokenA:{...k,description:"Address of the first ERC-20 token."},tokenB:{...k,description:"Address of the second ERC-20 token."}}:H},execute:(n,r)=>p(t,n,r)}))}}export{_ as a,h as b,F as c,N as d,E as e,z as f,J as g};
@@ -0,0 +1,3 @@
1
+ import{a as V,b as W}from"./S47M3IPR.js";import{d as M,e as Q}from"./S65KXMZ7.js";import{a as A,b as $,c as h,f as C,j as O,l as N,m as B,n as R}from"./CW37EGPL.js";import{a as U}from"./K6D6SDIG.js";import{g as H,k as F}from"./QA6Z2CYP.js";import{a as d}from"./CFPJDLTZ.js";import{c as S}from"./43LI5NKJ.js";import{g as _}from"./NWNYJ26T.js";import{a as c}from"./XSD5NL7J.js";import{encodeFunctionData as z}from"viem";var D={chop_wrap:["log","underlying","amount","minLogOut"],chop_unwrap:["log","amount","quotedNet"],chop_farm:["log","amount","pairedAmount","minPaired","minStakedLp","slippageBps","deadline"],chop_unfarm:["log","amount","minLogOut","minPairedOut","deadline"],chop_harvest:["log"]};function E(l,a,n=[]){if(Object.keys(l).some(o=>!a.includes(o)))throw new c("Unexpected Chop argument.");if(a.some(o=>l[o]===void 0&&!n.includes(o)))throw new c("Provide every required Chop input.")}async function j(l,a,n){let o=h(a),u=await l.getBlock({blockNumber:BigInt(n.measuredAtBlock)});if(u.number!==BigInt(n.measuredAtBlock)||o<=$(u.timestamp)||o>u.timestamp+1200n)throw new c("Chop deadline must be in the next 20 minutes.");return o}async function G(l,a,n,o){if(E(n,D[a],a==="chop_unfarm"?["minLogOut","minPairedOut"]:[]),A(o),l.network==="testnet")throw new c("Chop requires chain 4663.");let u=A(n.log),p=l.clientFor(4663),i=await N(p,u,a==="chop_wrap"||a==="chop_farm"?"enter":"exit"),r=BigInt(i.measuredAtBlock),g=[],f=[],w=(e,t,s)=>{g.push(S(e.address,t,s.toString(),4663)),f.push(l.approval(e.address,t,s.toString(),4663))},v=(e,t,s)=>{let m={to:e,data:z({abi:U,functionName:t,args:s}),value:"0",chainId:4663,description:`${a} on verified log ${u}.`,...a==="chop_harvest"?{gasLimit:"1000000"}:{}};g.push(m),f.push({...l.unsignedTx(m),...m.gasLimit===void 0?{}:{gasLimit:m.gasLimit}})},x=[],L=(e,t,s=!0)=>x.push({token:e,min:-t,max:s?-t:-1n}),b=(e,t)=>x.push({token:e,min:t}),T=async(e,t)=>{if($(await C(p,e.address,"balanceOf",[o],r))<t)throw new c("This wallet does not hold enough tokens for the Chop action.")},y,P;if(a==="chop_wrap"){let e=h(n.amount),t=h(n.minLogOut);if(!_(A(n.underlying),i.underlying.address))throw new c("The underlying token does not match the verified Chop log.");await T(i.underlying,e),w(i.underlying,u,e),v(u,"bond",[i.underlying.address,e,t]),L(i.underlying,e,!1),b(i.log,t),y=`Wrap at most ${e} underlying base units; on-chain minimum ${t} log base units.`}else if(a==="chop_unwrap"){let e=h(n.amount),t=h(n.quotedNet);await T(i.log,e);let s=await Q(p,i,o,e);if(BigInt(s.net.amount)<t)throw new c("Chop unwrap no longer meets the quoted net amount. Request a fresh quote.");let m=M(i,e);g.push(m),f.push(l.unsignedTx(m)),L(i.log,e),b(i.underlying,t),y=`Unwrap ${e} log base units; preview must return at least quoted ${t} underlying base units.`}else if(a==="chop_farm"){await O(p,d.helper,r);let e=h(n.amount),t=h(n.pairedAmount),s=h(n.minPaired),m=h(n.minStakedLp),q=await j(p,n.deadline,i),k=n.slippageBps;if(typeof k!="number"||!Number.isInteger(k)||k<0||k>1e3||k%10!==0||s>t)throw new c("Chop LP slippage must be 0\u20131000 basis points in multiples of 10; the paired minimum cannot exceed its input.");await Promise.all([T(i.log,e),T(i.paired,t)]),w(i.log,d.helper.address,e),w(i.paired,d.helper.address,t),v(d.helper.address,"addLPAndStake",[u,e,i.paired.address,t,s,BigInt(k/10),q]),L(i.log,e,!1),x.push({token:i.paired,min:-t,max:-s}),b(i.staking,m),y=`Farm up to ${e} log + ${t} paired base units; slippage ${k} bps; deadline ${q}. Staked LP minimum ${m} is checked in simulation; two-sided token minimums from slippage are enforced on chain. Paired consumption must also meet ${s} base units in the preview. This tool does not zap; the helper's paired minimum alone has no on-chain effect for a direct pair.`}else if(a==="chop_unfarm"){await O(p,d.helper,r);let e=h(n.amount),t=await j(p,n.deadline,i);if($(await C(p,i.staking.address,"withdrawableStake",[o],r))<e)throw new c("Chop stake is still locked or too small. Wait at least 10 minutes after staking.");P=await V(p,i,o,n);let s=BigInt(P.minLogOut),m=BigInt(P.minPairedOut);w(i.staking,d.helper.address,e),v(d.helper.address,"unstakeAndRemoveLP",[u,e,s,m,t]),L(i.staking,e),b(i.log,s),b(i.paired,m),y=`Unfarm ${e} staked LP base units; burns your farm receipt (LP) tokens; deadline ${t}. ${W(P,i)}`}else{if(await O(p,d.whitelist,r),await C(p,d.whitelist.address,"paused",[d.chop],r)!==!1)throw new c("Chop rewards are paused or their pause state is unavailable.");let e=$(await C(p,i.rewards,"getClaimable",[d.chop,o],r));if(e===0n)throw new c("No CHOP is claimable now. Rewards may still be inside the 10-minute maturity lock.");v(i.rewards,"claimReward",[o]),b({address:A(d.chop),symbol:"CHOP",decimals:18,chainId:4663},e),y=`Harvest at least ${e} CHOP base units to ${o} in the preview. ${H} Allow at least 1,000,000 gas for this call.`}return(a==="chop_farm"||a==="chop_unfarm")&&!x.some(e=>_(e.token.address,d.chop))&&b({address:A(d.chop),symbol:"CHOP",decimals:18,chainId:4663},0n),B(f,g),{built:f,expected:g,rules:x,details:y,facts:i,log:u,unfarmQuote:P}}async function ae(l,a,n,o){let{built:u,expected:p,rules:I,details:i,facts:r,log:g,unfarmQuote:f}=await G(l,a,n,o),w=await l.preview(u,o);return B(w.txs,p,!0),R(w,I),{txs:u,preview:w,log:g,measuredAtBlock:r.measuredAtBlock,...f?{unfarmQuote:f}:{},summary:`${i}
2
+ Underlying ${r.underlying.address} (decimals ${r.underlying.decimals}); log ${g} (decimals ${r.log.decimals}); paired ${r.paired.address} (decimals ${r.paired.decimals}).
3
+ ${F(r)}`}}export{D as a,E as b,G as c,ae as d};
@@ -1 +1 @@
1
- import{g as V,k as T}from"./EQEMI54U.js";import{t as R,y as A}from"./4E7FJQLL.js";import{e as O,h as D,i as M,j as S,m as U,o as _,p as q}from"./XRDLMTBJ.js";import{a as I,b as k,g as F,h as H,i as N}from"./MQK6OP7S.js";import{a as t}from"./XSD5NL7J.js";import{randomUUID as J}from"node:crypto";import{getAddress as g,parseAbiItem as E}from"viem";var Q=E("event FamilyLaunched(bytes32 indexed familyId,address indexed owner,address indexed subject,address root)"),Y=E("event FamilyTransferred(bytes32 indexed familyId,address indexed owner)"),j=100000n,Z=64,z=512,K=300*1e3;function ce(P){let l=new Map,h=[g(k.launcherLegacy),g(k.launcherV1)],L=I.launcherDeployments,W=h.reduce((r,d)=>BigInt(L[d].blockNumber)<r?BigInt(L[d].blockNumber):r,BigInt(I.blockNumber));return{name:"hookr_lp_positions",inputSchema:{type:"object",additionalProperties:!1,properties:{cursor:{type:"string",minLength:1,maxLength:64,description:"Opaque, wallet-bound cursor from the preceding page; expires after five minutes. Restart without it if expired."},limit:{type:"integer",minimum:1,maximum:20,description:"Position summaries per page; defaults to 10. A page scans at most 100000 blocks and 32 family checks."}}},execute:async(r,d)=>{if(O(r,["cursor","limit"]),P.network==="testnet")throw new t("Hookr LP reads are configured only on mainnet, chain 4663.");let u=r.limit??10;if(typeof u!="number"||!Number.isInteger(u)||u<1||u>20)throw new t("Provide a Hookr position page limit from 1 to 20.");for(let[o,s]of l)s.expires<=Date.now()&&l.delete(o);let f=P.clientFor(4663),e;if(r.cursor!==void 0){if(typeof r.cursor!="string"||!l.has(r.cursor))throw new t("Hookr position cursor is unknown or expired. Restart without cursor; completeness has not been established.");let o=l.get(r.cursor);if(o.wallet!==d)throw new t("Hookr position cursor belongs to a different wallet. Restart without cursor.");if((await H(f,o.block.number)).hash!==o.block.hash)throw new t("Hookr position snapshot changed. Restart without cursor.");e={...o,candidates:[...o.candidates],seen:new Set(o.seen)}}else{let o=await H(f);e={wallet:d,block:o,nextBlock:o.number,firstBlock:W,candidates:[],member:0,seen:new Set,expires:Date.now()+K}}await F(f,e.block.number,[...h,k.rootV1]);let b=[],y=[],w=!1;if(e.candidates.length===0&&e.nextBlock>=e.firstBlock){let o=e.nextBlock,s=o-j+1n>e.firstBlock?o-j+1n:e.firstBlock;try{let i=(await Promise.all(h.flatMap(n=>[Q,Y].map(c=>f.getLogs({address:n,event:c,args:{owner:d},fromBlock:s,toBlock:o,strict:!0}))))).flat();if(i.length>z*2)throw new t("Hookr event page exceeds the bounded discovery limit. A dedicated position index is required.");let m=new Map;for(let n of i){let c=g(n.address),p=D(n.args.familyId);if(n.removed||!n.blockNumber||n.blockNumber<s||n.blockNumber>o||!h.includes(c)||n.args.owner!==d)throw new t("Hookr event page is incomplete or inconsistent with the requested wallet and block range.");let a=`${c}:${p}`;e.seen.has(a)||m.set(a,{launcher:c,familyId:p})}if(e.seen.size+m.size>z)throw new t("Hookr wallet history exceeds the bounded discovery limit. Completeness requires a dedicated position index.");e.candidates=[...m.values()];for(let n of m.keys())e.seen.add(n);e.nextBlock=s-1n}catch(i){w=!0,b.push(i instanceof t?i.message:"Hookr event history is unavailable for this block range. Retry this cursor; an empty page does not establish no positions.")}}let X=0;for(;!w&&e.candidates.length&&y.length<u&&X++<32;){let o=e.candidates[0],s=(i,m)=>q(f,o.launcher,_(o.launcher===g(k.launcherV1)?"launcherV1":"launcher"),i,m,e.block.number);try{let[i,m]=await Promise.all([s("familyOwner",[o.familyId]),s("memberCount",[o.familyId])]),n=M(i);if(BigInt(n)===0n)throw new t("Hookr family owner is unavailable for an indexed family.");if(n!==d){e.candidates.shift(),e.member=0;continue}let c=Number(S(m,8));if(c<1||c>8)throw new t("Hookr family member count is invalid.");for(;e.member<c&&y.length<u;){let p=e.member,a=U(await s("position",[o.familyId,p])),v=T(a.key);if(typeof a.tickLower!="number"||typeof a.tickUpper!="number")throw new t("Hookr family range is incomplete.");A(a.tickLower,a.tickUpper,v.tickSpacing);let $=S(a.liquidity,128),C=R(v);if(await s("poolFamily",[C])!==o.familyId)throw new t("Hookr position does not belong to this family.");let G=V({kind:"family",...o,member:String(p)});y.push({position:G,poolId:C,owner:d,liquidity:$.toString(),range:{tickLower:a.tickLower,tickUpper:a.tickUpper},poolKey:v}),e.member++}e.member===c&&(e.candidates.shift(),e.member=0)}catch(i){w=!0,b.push(i instanceof t?i.message:"Hookr family state is unavailable. Retry this cursor; no zero position is inferred.")}}await N(f,e.block);let x=!w&&e.nextBlock<e.firstBlock&&e.candidates.length===0;x||b.push("Discovery is incomplete. Continue nextCursor, including after an empty page. Current ownership is checked at the fixed snapshot; history gaps are not evidence of no positions.");let B=null;if(!x){for(;l.size>=Z;)l.delete(l.keys().next().value);B=J(),e.expires=Date.now()+K,l.set(B,e)}return typeof r.cursor=="string"&&l.delete(r.cursor),{chainId:4663,blockNumber:e.block.number.toString(),blockHash:e.block.hash,positions:y,nextCursor:B,complete:x,warnings:b,coverage:{custody:"reviewed Launcher families only",historyStartBlock:e.firstBlock.toString(),scannedFromBlock:e.nextBlock<e.block.number?(e.nextBlock+1n).toString():null,scannedThroughBlock:e.nextBlock<e.block.number?e.block.number.toString():null,snapshotBlock:e.block.number.toString()}}}}}export{ce as a};
1
+ import{g as V,k as T}from"./GDUKZYE2.js";import{t as R,y as A}from"./FRT6AC6M.js";import{e as O,h as D,i as M,j as S,m as U,o as _,p as q}from"./XRDLMTBJ.js";import{a as I,b as k,g as F,h as H,i as N}from"./MQK6OP7S.js";import{a as t}from"./XSD5NL7J.js";import{randomUUID as J}from"node:crypto";import{getAddress as g,parseAbiItem as E}from"viem";var Q=E("event FamilyLaunched(bytes32 indexed familyId,address indexed owner,address indexed subject,address root)"),Y=E("event FamilyTransferred(bytes32 indexed familyId,address indexed owner)"),j=100000n,Z=64,z=512,K=300*1e3;function ce(P){let l=new Map,h=[g(k.launcherLegacy),g(k.launcherV1)],L=I.launcherDeployments,W=h.reduce((r,d)=>BigInt(L[d].blockNumber)<r?BigInt(L[d].blockNumber):r,BigInt(I.blockNumber));return{name:"hookr_lp_positions",inputSchema:{type:"object",additionalProperties:!1,properties:{cursor:{type:"string",minLength:1,maxLength:64,description:"Opaque, wallet-bound cursor from the preceding page; expires after five minutes. Restart without it if expired."},limit:{type:"integer",minimum:1,maximum:20,description:"Position summaries per page; defaults to 10. A page scans at most 100000 blocks and 32 family checks."}}},execute:async(r,d)=>{if(O(r,["cursor","limit"]),P.network==="testnet")throw new t("Hookr LP reads are configured only on mainnet, chain 4663.");let u=r.limit??10;if(typeof u!="number"||!Number.isInteger(u)||u<1||u>20)throw new t("Provide a Hookr position page limit from 1 to 20.");for(let[o,s]of l)s.expires<=Date.now()&&l.delete(o);let f=P.clientFor(4663),e;if(r.cursor!==void 0){if(typeof r.cursor!="string"||!l.has(r.cursor))throw new t("Hookr position cursor is unknown or expired. Restart without cursor; completeness has not been established.");let o=l.get(r.cursor);if(o.wallet!==d)throw new t("Hookr position cursor belongs to a different wallet. Restart without cursor.");if((await H(f,o.block.number)).hash!==o.block.hash)throw new t("Hookr position snapshot changed. Restart without cursor.");e={...o,candidates:[...o.candidates],seen:new Set(o.seen)}}else{let o=await H(f);e={wallet:d,block:o,nextBlock:o.number,firstBlock:W,candidates:[],member:0,seen:new Set,expires:Date.now()+K}}await F(f,e.block.number,[...h,k.rootV1]);let b=[],y=[],w=!1;if(e.candidates.length===0&&e.nextBlock>=e.firstBlock){let o=e.nextBlock,s=o-j+1n>e.firstBlock?o-j+1n:e.firstBlock;try{let i=(await Promise.all(h.flatMap(n=>[Q,Y].map(c=>f.getLogs({address:n,event:c,args:{owner:d},fromBlock:s,toBlock:o,strict:!0}))))).flat();if(i.length>z*2)throw new t("Hookr event page exceeds the bounded discovery limit. A dedicated position index is required.");let m=new Map;for(let n of i){let c=g(n.address),p=D(n.args.familyId);if(n.removed||!n.blockNumber||n.blockNumber<s||n.blockNumber>o||!h.includes(c)||n.args.owner!==d)throw new t("Hookr event page is incomplete or inconsistent with the requested wallet and block range.");let a=`${c}:${p}`;e.seen.has(a)||m.set(a,{launcher:c,familyId:p})}if(e.seen.size+m.size>z)throw new t("Hookr wallet history exceeds the bounded discovery limit. Completeness requires a dedicated position index.");e.candidates=[...m.values()];for(let n of m.keys())e.seen.add(n);e.nextBlock=s-1n}catch(i){w=!0,b.push(i instanceof t?i.message:"Hookr event history is unavailable for this block range. Retry this cursor; an empty page does not establish no positions.")}}let X=0;for(;!w&&e.candidates.length&&y.length<u&&X++<32;){let o=e.candidates[0],s=(i,m)=>q(f,o.launcher,_(o.launcher===g(k.launcherV1)?"launcherV1":"launcher"),i,m,e.block.number);try{let[i,m]=await Promise.all([s("familyOwner",[o.familyId]),s("memberCount",[o.familyId])]),n=M(i);if(BigInt(n)===0n)throw new t("Hookr family owner is unavailable for an indexed family.");if(n!==d){e.candidates.shift(),e.member=0;continue}let c=Number(S(m,8));if(c<1||c>8)throw new t("Hookr family member count is invalid.");for(;e.member<c&&y.length<u;){let p=e.member,a=U(await s("position",[o.familyId,p])),v=T(a.key);if(typeof a.tickLower!="number"||typeof a.tickUpper!="number")throw new t("Hookr family range is incomplete.");A(a.tickLower,a.tickUpper,v.tickSpacing);let $=S(a.liquidity,128),C=R(v);if(await s("poolFamily",[C])!==o.familyId)throw new t("Hookr position does not belong to this family.");let G=V({kind:"family",...o,member:String(p)});y.push({position:G,poolId:C,owner:d,liquidity:$.toString(),range:{tickLower:a.tickLower,tickUpper:a.tickUpper},poolKey:v}),e.member++}e.member===c&&(e.candidates.shift(),e.member=0)}catch(i){w=!0,b.push(i instanceof t?i.message:"Hookr family state is unavailable. Retry this cursor; no zero position is inferred.")}}await N(f,e.block);let x=!w&&e.nextBlock<e.firstBlock&&e.candidates.length===0;x||b.push("Discovery is incomplete. Continue nextCursor, including after an empty page. Current ownership is checked at the fixed snapshot; history gaps are not evidence of no positions.");let B=null;if(!x){for(;l.size>=Z;)l.delete(l.keys().next().value);B=J(),e.expires=Date.now()+K,l.set(B,e)}return typeof r.cursor=="string"&&l.delete(r.cursor),{chainId:4663,blockNumber:e.block.number.toString(),blockHash:e.block.hash,positions:y,nextCursor:B,complete:x,warnings:b,coverage:{custody:"reviewed Launcher families only",historyStartBlock:e.firstBlock.toString(),scannedFromBlock:e.nextBlock<e.block.number?(e.nextBlock+1n).toString():null,scannedThroughBlock:e.nextBlock<e.block.number?e.block.number.toString():null,snapshotBlock:e.block.number.toString()}}}}}export{ce as a};
@@ -1 +1 @@
1
- import{a as K}from"./MSRCJ2BS.js";import{b as Y,d as Z,e as Q}from"./V74F6IDY.js";import{a as J}from"./GBPB7JIB.js";import{a as W,c as x,d as B,h as F,i as E,j as L}from"./4CEV4FDG.js";import{ea as z,ja as H}from"./HHYE42JG.js";import{a as P}from"./IBL6TL2Q.js";import{n as j}from"./BA66J5YQ.js";import{j as M}from"./4J245N3F.js";import{a as $}from"./IOYRL6AY.js";import{e as O,h as U}from"./NWNYJ26T.js";import{a as v}from"./XSD5NL7J.js";import{erc20Abi as X,formatUnits as G,parseAbiItem as q}from"viem";var ee=q("event CreateVaultV2(address indexed caller,address indexed owner,bytes32 salt,address indexed vault)"),te=r=>H("unverified",{...r?{vaultLabel:r}:{}});function ae(r){if(!O(r)||!O(r.chain)||r.chain.id!==4663||!Array.isArray(r.contracts)||!Array.isArray(r.markets)||r.contracts.length>1e3||r.markets.length>1e3)throw new v("Borro vault discovery returned an unreadable candidate list.");let i=[...r.contracts.filter(O).filter(e=>e.name==="BorroUSDGVault").map(e=>e.address),...r.markets.filter(O).map(e=>O(e.vault)?e.vault.address:void 0)];return[...new Set(i.map(x))]}function se(r){return r.sort((i,e)=>+(e.symbol==="USDG")-+(i.symbol==="USDG")||0)}var re=6e4;function oe(r,i={}){let e=i.resolveAllowedAsset??E(i.officialStockTokens),g=L({resolveAllowedAsset:e}),S=new WeakMap,A=s=>{let t=S.get(s);return t||(t={},S.set(s,t)),t},m=s=>{if(s?.aborted)throw new v("Borro read was cancelled.")};async function h(s,t,u){let c=A(s);if(c.inventory&&Date.now()<c.inventory.expiresAt)return structuredClone(c.inventory);let a={items:[],sources:[],incomplete:!1,warnings:[],expiresAt:0},o=new Map;m(u);try{for(let l of ae(await Y(r.http,"contracts",u)))o.set(l.toLowerCase(),{vault:l});a.sources.push("contracts.json")}catch{a.incomplete=!0,a.warnings.push("Borro candidate discovery is unavailable; this inventory may be incomplete.")}if(i.factoryEvents!==!1)try{let l=new Map;for(let p=BigInt(P.factory.fromBlock);p<=t;p+=10000000n){m(u);let k=p+9999999n<t?p+9999999n:t,y=await s.getLogs({address:P.factory.address,event:ee,fromBlock:p,toBlock:k,strict:!0});if(y.length>1e3)throw new v("Borro factory inventory exceeds the read limit.");for(let d of y){let n=x(d.args.vault);if(d.removed||!U(d.address,P.factory.address)||d.blockNumber===null||d.blockNumber<p||d.blockNumber>k||l.has(n.toLowerCase()))throw new v("Borro factory events are unreadable.");l.set(n.toLowerCase(),{vault:n,block:d.blockNumber})}if(l.size>1e3)throw new v("Borro factory inventory exceeds the read limit.")}for(let[p,k]of l)o.set(p,k);a.sources.push("factory-events")}catch{a.incomplete=!0,a.warnings.push("Borro factory discovery is unavailable; vault creation dates or inventory may be incomplete.")}return m(u),a.items=[...o.values()],a.expiresAt=Date.now()+re,a.incomplete||(c.inventory=structuredClone(a)),a}let w=async(s,t={})=>{m(t.signal);let u=await F(s),c=A(s);if(!t.wallet&&c.verified&&Date.now()<c.verified.expiresAt)return structuredClone(c.verified.result);let a=await h(s,u,t.signal),o={vaults:[],refused:[],sources:a.sources,incomplete:a.incomplete,warnings:a.warnings,measuredAtBlock:u.toString()},l=a.items;if(t.heldOnly){if(!t.wallet)throw new v("Provide a wallet for Borro holdings.");m(t.signal);let y=l.length?await s.multicall({allowFailure:!1,batchSize:0,contracts:l.map(({vault:d})=>({address:d,abi:X,functionName:"balanceOf",args:[t.wallet]})),blockNumber:u}):[];if(!Array.isArray(y)||y.length!==l.length)throw new v("Borro share balances could not be read completely. Please try again.");o.shareBalances=l.map((d,n)=>({vault:d.vault,amount:B(y[n]).toString()})),l=l.filter((d,n)=>BigInt(o.shareBalances[n].amount)>0n)}m(t.signal);let p=e;if(l.length&&!i.resolveAllowedAsset&&!i.officialStockTokens)try{p=E(await M({http:r.http,allowAmbiguousSymbols:!0}))}catch{o.incomplete=!0,o.warnings.push("Official stock identities could not be checked; held-share exits remain available by vault address.")}let k=L({resolveAllowedAsset:p});for(let y=0;y<l.length;y+=4){m(t.signal);let d=await Promise.all(l.slice(y,y+4).map(async n=>{try{let b=await k(s,n.vault,t.wallet?"withdraw":"deposit",{blockNumber:u,...t.wallet?{wallet:t.wallet}:{}});if(n.block!==void 0)try{let V=await s.getBlock({blockNumber:n.block}),f=B(V.timestamp);f<=8640000000000n&&V.number===n.block&&(b.deployedAt=new Date(Number(f)*1e3).toISOString())}catch{}return{facts:b}}catch{return{rejected:{vault:n.vault,reason:te(n.vault)}}}}));for(let n of d)n.facts&&o.vaults.push(n.facts),n.rejected&&o.refused.push(n.rejected)}return m(t.signal),se(o.vaults),!t.wallet&&!o.incomplete&&(c.verified={result:structuredClone(o),expiresAt:a.expiresAt}),o},T=async(s,t={})=>{m(t.signal);let u=A(s),c;if(t.wallet||t.signal)c=await w(s,t);else{let a=u.pending??w(s);u.pending=a;try{c=structuredClone(await a)}finally{u.pending===a&&(u.pending=void 0)}}return m(t.signal),{...c,vaults:c.vaults.filter(a=>!t.asset||a.symbol.toUpperCase()===t.asset.toUpperCase())}};return{discoverVaults:T,verifyVault:g,resolveVault:async(s,t,u,c)=>{if(t.asset!==void 0&&!/^[A-Za-z0-9.$_-]{1,32}$/.test(t.asset))throw new v("Provide an official asset symbol.");if(t.vault){let y=await g(s,t.vault,u,{wallet:c});if(t.asset&&y.symbol.toUpperCase()!==t.asset.toUpperCase())throw new v("The asset symbol does not match the verified vault.");return y}if(!t.asset)throw new v("Provide an asset symbol or the vault address.");let a=await T(s,{asset:t.asset,...u==="withdraw"?{wallet:c}:{}});if(a.incomplete)throw new v("Borro discovery is incomplete. Provide the vault address for on-chain verification.");let o=a.vaults.length===1?a.vaults[0]:void 0;if(!o&&t.asset.toUpperCase()==="USDG"&&a.vaults.length>1){let y=await F(s);try{if(a.vaults.some(f=>!U(f.asset,P.assetRule.usdg.address)||f.assetDecimals!==6))throw new v("Unreadable USDG identity.");let d=a.vaults.filter(f=>f.setup.drift.length===0&&f.assetAllowed),n=await Promise.all(d.map(async f=>({facts:f,total:B(await s.readContract({address:f.vault,abi:W,functionName:"totalAssets",blockNumber:y}))})));n.sort((f,_)=>f.total>_.total?-1:f.total<_.total?1:0);let[b,V]=n;b&&b.total>=100000000n&&(!V||b.total>=V.total*10n)&&(o=b.facts)}catch{}}if(!o)throw new v(a.vaults.length?"More than one Borro vault uses this symbol. Provide the vault address.":"No verified Borro vault matched this asset. Provide the vault address to check it on chain.");let l=e;if(!i.resolveAllowedAsset&&!i.officialStockTokens&&!U(o.asset,P.assetRule.usdg.address))try{l=E(await M({http:r.http,allowAmbiguousSymbols:!0}))}catch{}let k=await L({resolveAllowedAsset:l})(s,o.vault,u,{wallet:c});if(k.symbol.toUpperCase()!==t.asset.toUpperCase())throw new v("The asset symbol does not match the verified vault.");return{...k,...o.deployedAt?{deployedAt:o.deployedAt}:{}}}}}var N=(r,i)=>({token:r,amount:i.toString()});async function ne(r,i,e){try{let[g,S]=await Promise.all([i.getGasPrice(),j("ETH",{client:i,http:r.http,chainId:4663,blockNumber:e})]);if(!/^\d+$/.test(S.usdE18)||BigInt(S.usdE18)<=0n||B(g)===0n)return{};let A=w=>Number(G(w*g*BigInt(S.usdE18)/10n**18n,18)),m=A($*2n),h=A($);return[m,h].every(w=>Number.isFinite(w)&&w>0)?{gasInUsd:m,gasOutUsd:h}:{}}catch{return{}}}async function ie(r,i,e,g,S=new Map,A){let m={vault:e.vault,verified:!0,symbol:e.symbol,vaultSymbol:e.vaultSymbol,setup:e.setup,measuredAtBlock:(A??BigInt(e.measuredAtBlock)).toString(),verifiedAtBlock:e.measuredAtBlock,...e.owner?{owner:e.owner}:{},...e.curator?{curator:e.curator}:{},...e.deployedAt?{deployedAt:e.deployedAt}:{}};try{let h=A??BigInt(e.measuredAtBlock),w={address:e.asset,symbol:e.symbol,decimals:e.assetDecimals,chainId:4663},T={address:e.vault,symbol:e.vaultSymbol,decimals:18,chainId:4663},R=(D,C,I=[])=>i.readContract({address:D,abi:[...W,...X],functionName:C,args:I,blockNumber:h}),[s,t,u,c,a,o,l]=await Promise.all([R(e.vault,"totalAssets"),R(e.vault,"performanceFee"),R(e.asset,"balanceOf",[g]),R(e.vault,"balanceOf",[g]),J(i,e,h),ne(r,i,h),i.getBlock({blockNumber:h})]),p=B(c),k=B(t);if(k>10n**18n)throw new v("Borro performance fee is unreadable.");let y=B(await R(e.vault,"convertToAssets",[p])),d={};if(e.owner)try{let[D,C]=await Promise.all([R(e.owner,"getThreshold"),R(e.owner,"getOwners")]),I=B(D);if(!Array.isArray(C)||C.length>1e3||new Set(C.map(x)).size!==C.length||I<1n||I>BigInt(C.length))throw new v("Unreadable group wallet.");d={safeThreshold:Number(I),safeOwners:C.length}}catch{}let n;if(U(e.asset,P.assetRule.usdg.address))try{let D=(await K(i,h)).rateBasePct;Number.isFinite(D)&&D>=0&&(n=D)}catch{}let b=Q(S,w,e.vault);if(l.number!==h)throw new v("Borro block timestamp could not be verified.");let V=Number(B(l.timestamp)),f=e.deployedAt?Date.parse(e.deployedAt)/1e3:void 0,_=z({symbol:e.symbol,kind:U(e.asset,P.assetRule.usdg.address)?"usdg":"stock",nowSeconds:V,...f===void 0?{}:{deployedAtSeconds:f},threshold:d.safeThreshold,owners:d.safeOwners,borroRatePct:b.apr===void 0?void 0:b.apr*100,feePct:Number(G(k,16)),layerbankRatePct:n,totalAmount:G(B(s),e.assetDecimals),readyAmount:a.readyBase===void 0?void 0:G(a.readyBase,e.assetDecimals),gasInUsd:o.gasInUsd===void 0?void 0:`up to $${o.gasInUsd.toFixed(4)}`,gasOutUsd:o.gasOutUsd===void 0?void 0:`up to $${o.gasOutUsd.toFixed(4)}`});return{...m,asset:w,shares:T,totalAssets:N(w,B(s)),performanceFeeWad:k.toString(),walletAssetBalance:N(w,B(u)),walletShares:N(T,p),walletShareValue:N(w,y),liquidityKind:a.kind,...a.readyBase===void 0?{}:{cashOnHand:N(w,a.readyBase)},...d,...o,...n===void 0?{}:{layerbankRateBasePct:n},...b.apr===void 0?{}:{apr:b.apr,rateSource:b.source},...b.readyToWithdraw?{vendorReadyToWithdraw:b.readyToWithdraw}:{},...f!==void 0&&f<=V?{ageSeconds:String(Math.floor(V-f))}:{},risk:{title:"Lending on Borro",text:_,source:"Oak"}}}catch{return{...m,error:"This Borro vault can't be read right now. Please try again."}}}async function ge(r,i,e={},g={},S){if(e.vault&&!g.resolveAllowedAsset&&!g.officialStockTokens)try{g={...g,officialStockTokens:await M({http:r.http,allowAmbiguousSymbols:!0})}}catch{}let A=r.clientFor(4663),m=S??oe(r,g);x(i);let h;if(e.vault){let s=await m.resolveVault(A,e,"deposit",i);h={vaults:[s],refused:[],sources:[],incomplete:!1,warnings:[],measuredAtBlock:s.measuredAtBlock}}else h=await m.discoverVaults(A,e.asset?{asset:e.asset}:{});let[w,T]=await Promise.all([Z(r.http),F(A)]),R=[];for(let s=0;s<h.vaults.length;s+=4)R.push(...await Promise.all(h.vaults.slice(s,s+4).map(t=>ie(r,A,t,i,w,T))));return{...h,vaults:R}}export{ae as a,se as b,oe as c,N as d,ie as e,ge as f};
1
+ import{a as K}from"./MSRCJ2BS.js";import{b as Y,d as Z,e as Q}from"./V74F6IDY.js";import{a as J}from"./GBPB7JIB.js";import{a as W,c as x,d as B,h as F,i as E,j as L}from"./4CEV4FDG.js";import{ea as z,ja as H}from"./HHYE42JG.js";import{a as P}from"./IBL6TL2Q.js";import{o as j}from"./7OOCAZBE.js";import{k as M}from"./N624NR7Y.js";import{a as $}from"./IOYRL6AY.js";import{e as O,h as U}from"./NWNYJ26T.js";import{a as v}from"./XSD5NL7J.js";import{erc20Abi as X,formatUnits as G,parseAbiItem as q}from"viem";var ee=q("event CreateVaultV2(address indexed caller,address indexed owner,bytes32 salt,address indexed vault)"),te=r=>H("unverified",{...r?{vaultLabel:r}:{}});function ae(r){if(!O(r)||!O(r.chain)||r.chain.id!==4663||!Array.isArray(r.contracts)||!Array.isArray(r.markets)||r.contracts.length>1e3||r.markets.length>1e3)throw new v("Borro vault discovery returned an unreadable candidate list.");let i=[...r.contracts.filter(O).filter(e=>e.name==="BorroUSDGVault").map(e=>e.address),...r.markets.filter(O).map(e=>O(e.vault)?e.vault.address:void 0)];return[...new Set(i.map(x))]}function se(r){return r.sort((i,e)=>+(e.symbol==="USDG")-+(i.symbol==="USDG")||0)}var re=6e4;function oe(r,i={}){let e=i.resolveAllowedAsset??E(i.officialStockTokens),g=L({resolveAllowedAsset:e}),S=new WeakMap,A=s=>{let t=S.get(s);return t||(t={},S.set(s,t)),t},m=s=>{if(s?.aborted)throw new v("Borro read was cancelled.")};async function h(s,t,u){let c=A(s);if(c.inventory&&Date.now()<c.inventory.expiresAt)return structuredClone(c.inventory);let a={items:[],sources:[],incomplete:!1,warnings:[],expiresAt:0},o=new Map;m(u);try{for(let l of ae(await Y(r.http,"contracts",u)))o.set(l.toLowerCase(),{vault:l});a.sources.push("contracts.json")}catch{a.incomplete=!0,a.warnings.push("Borro candidate discovery is unavailable; this inventory may be incomplete.")}if(i.factoryEvents!==!1)try{let l=new Map;for(let p=BigInt(P.factory.fromBlock);p<=t;p+=10000000n){m(u);let k=p+9999999n<t?p+9999999n:t,y=await s.getLogs({address:P.factory.address,event:ee,fromBlock:p,toBlock:k,strict:!0});if(y.length>1e3)throw new v("Borro factory inventory exceeds the read limit.");for(let d of y){let n=x(d.args.vault);if(d.removed||!U(d.address,P.factory.address)||d.blockNumber===null||d.blockNumber<p||d.blockNumber>k||l.has(n.toLowerCase()))throw new v("Borro factory events are unreadable.");l.set(n.toLowerCase(),{vault:n,block:d.blockNumber})}if(l.size>1e3)throw new v("Borro factory inventory exceeds the read limit.")}for(let[p,k]of l)o.set(p,k);a.sources.push("factory-events")}catch{a.incomplete=!0,a.warnings.push("Borro factory discovery is unavailable; vault creation dates or inventory may be incomplete.")}return m(u),a.items=[...o.values()],a.expiresAt=Date.now()+re,a.incomplete||(c.inventory=structuredClone(a)),a}let w=async(s,t={})=>{m(t.signal);let u=await F(s),c=A(s);if(!t.wallet&&c.verified&&Date.now()<c.verified.expiresAt)return structuredClone(c.verified.result);let a=await h(s,u,t.signal),o={vaults:[],refused:[],sources:a.sources,incomplete:a.incomplete,warnings:a.warnings,measuredAtBlock:u.toString()},l=a.items;if(t.heldOnly){if(!t.wallet)throw new v("Provide a wallet for Borro holdings.");m(t.signal);let y=l.length?await s.multicall({allowFailure:!1,batchSize:0,contracts:l.map(({vault:d})=>({address:d,abi:X,functionName:"balanceOf",args:[t.wallet]})),blockNumber:u}):[];if(!Array.isArray(y)||y.length!==l.length)throw new v("Borro share balances could not be read completely. Please try again.");o.shareBalances=l.map((d,n)=>({vault:d.vault,amount:B(y[n]).toString()})),l=l.filter((d,n)=>BigInt(o.shareBalances[n].amount)>0n)}m(t.signal);let p=e;if(l.length&&!i.resolveAllowedAsset&&!i.officialStockTokens)try{p=E(await M({http:r.http,allowAmbiguousSymbols:!0}))}catch{o.incomplete=!0,o.warnings.push("Official stock identities could not be checked; held-share exits remain available by vault address.")}let k=L({resolveAllowedAsset:p});for(let y=0;y<l.length;y+=4){m(t.signal);let d=await Promise.all(l.slice(y,y+4).map(async n=>{try{let b=await k(s,n.vault,t.wallet?"withdraw":"deposit",{blockNumber:u,...t.wallet?{wallet:t.wallet}:{}});if(n.block!==void 0)try{let V=await s.getBlock({blockNumber:n.block}),f=B(V.timestamp);f<=8640000000000n&&V.number===n.block&&(b.deployedAt=new Date(Number(f)*1e3).toISOString())}catch{}return{facts:b}}catch{return{rejected:{vault:n.vault,reason:te(n.vault)}}}}));for(let n of d)n.facts&&o.vaults.push(n.facts),n.rejected&&o.refused.push(n.rejected)}return m(t.signal),se(o.vaults),!t.wallet&&!o.incomplete&&(c.verified={result:structuredClone(o),expiresAt:a.expiresAt}),o},T=async(s,t={})=>{m(t.signal);let u=A(s),c;if(t.wallet||t.signal)c=await w(s,t);else{let a=u.pending??w(s);u.pending=a;try{c=structuredClone(await a)}finally{u.pending===a&&(u.pending=void 0)}}return m(t.signal),{...c,vaults:c.vaults.filter(a=>!t.asset||a.symbol.toUpperCase()===t.asset.toUpperCase())}};return{discoverVaults:T,verifyVault:g,resolveVault:async(s,t,u,c)=>{if(t.asset!==void 0&&!/^[A-Za-z0-9.$_-]{1,32}$/.test(t.asset))throw new v("Provide an official asset symbol.");if(t.vault){let y=await g(s,t.vault,u,{wallet:c});if(t.asset&&y.symbol.toUpperCase()!==t.asset.toUpperCase())throw new v("The asset symbol does not match the verified vault.");return y}if(!t.asset)throw new v("Provide an asset symbol or the vault address.");let a=await T(s,{asset:t.asset,...u==="withdraw"?{wallet:c}:{}});if(a.incomplete)throw new v("Borro discovery is incomplete. Provide the vault address for on-chain verification.");let o=a.vaults.length===1?a.vaults[0]:void 0;if(!o&&t.asset.toUpperCase()==="USDG"&&a.vaults.length>1){let y=await F(s);try{if(a.vaults.some(f=>!U(f.asset,P.assetRule.usdg.address)||f.assetDecimals!==6))throw new v("Unreadable USDG identity.");let d=a.vaults.filter(f=>f.setup.drift.length===0&&f.assetAllowed),n=await Promise.all(d.map(async f=>({facts:f,total:B(await s.readContract({address:f.vault,abi:W,functionName:"totalAssets",blockNumber:y}))})));n.sort((f,_)=>f.total>_.total?-1:f.total<_.total?1:0);let[b,V]=n;b&&b.total>=100000000n&&(!V||b.total>=V.total*10n)&&(o=b.facts)}catch{}}if(!o)throw new v(a.vaults.length?"More than one Borro vault uses this symbol. Provide the vault address.":"No verified Borro vault matched this asset. Provide the vault address to check it on chain.");let l=e;if(!i.resolveAllowedAsset&&!i.officialStockTokens&&!U(o.asset,P.assetRule.usdg.address))try{l=E(await M({http:r.http,allowAmbiguousSymbols:!0}))}catch{}let k=await L({resolveAllowedAsset:l})(s,o.vault,u,{wallet:c});if(k.symbol.toUpperCase()!==t.asset.toUpperCase())throw new v("The asset symbol does not match the verified vault.");return{...k,...o.deployedAt?{deployedAt:o.deployedAt}:{}}}}}var N=(r,i)=>({token:r,amount:i.toString()});async function ne(r,i,e){try{let[g,S]=await Promise.all([i.getGasPrice(),j("ETH",{client:i,http:r.http,chainId:4663,blockNumber:e})]);if(!/^\d+$/.test(S.usdE18)||BigInt(S.usdE18)<=0n||B(g)===0n)return{};let A=w=>Number(G(w*g*BigInt(S.usdE18)/10n**18n,18)),m=A($*2n),h=A($);return[m,h].every(w=>Number.isFinite(w)&&w>0)?{gasInUsd:m,gasOutUsd:h}:{}}catch{return{}}}async function ie(r,i,e,g,S=new Map,A){let m={vault:e.vault,verified:!0,symbol:e.symbol,vaultSymbol:e.vaultSymbol,setup:e.setup,measuredAtBlock:(A??BigInt(e.measuredAtBlock)).toString(),verifiedAtBlock:e.measuredAtBlock,...e.owner?{owner:e.owner}:{},...e.curator?{curator:e.curator}:{},...e.deployedAt?{deployedAt:e.deployedAt}:{}};try{let h=A??BigInt(e.measuredAtBlock),w={address:e.asset,symbol:e.symbol,decimals:e.assetDecimals,chainId:4663},T={address:e.vault,symbol:e.vaultSymbol,decimals:18,chainId:4663},R=(D,C,I=[])=>i.readContract({address:D,abi:[...W,...X],functionName:C,args:I,blockNumber:h}),[s,t,u,c,a,o,l]=await Promise.all([R(e.vault,"totalAssets"),R(e.vault,"performanceFee"),R(e.asset,"balanceOf",[g]),R(e.vault,"balanceOf",[g]),J(i,e,h),ne(r,i,h),i.getBlock({blockNumber:h})]),p=B(c),k=B(t);if(k>10n**18n)throw new v("Borro performance fee is unreadable.");let y=B(await R(e.vault,"convertToAssets",[p])),d={};if(e.owner)try{let[D,C]=await Promise.all([R(e.owner,"getThreshold"),R(e.owner,"getOwners")]),I=B(D);if(!Array.isArray(C)||C.length>1e3||new Set(C.map(x)).size!==C.length||I<1n||I>BigInt(C.length))throw new v("Unreadable group wallet.");d={safeThreshold:Number(I),safeOwners:C.length}}catch{}let n;if(U(e.asset,P.assetRule.usdg.address))try{let D=(await K(i,h)).rateBasePct;Number.isFinite(D)&&D>=0&&(n=D)}catch{}let b=Q(S,w,e.vault);if(l.number!==h)throw new v("Borro block timestamp could not be verified.");let V=Number(B(l.timestamp)),f=e.deployedAt?Date.parse(e.deployedAt)/1e3:void 0,_=z({symbol:e.symbol,kind:U(e.asset,P.assetRule.usdg.address)?"usdg":"stock",nowSeconds:V,...f===void 0?{}:{deployedAtSeconds:f},threshold:d.safeThreshold,owners:d.safeOwners,borroRatePct:b.apr===void 0?void 0:b.apr*100,feePct:Number(G(k,16)),layerbankRatePct:n,totalAmount:G(B(s),e.assetDecimals),readyAmount:a.readyBase===void 0?void 0:G(a.readyBase,e.assetDecimals),gasInUsd:o.gasInUsd===void 0?void 0:`up to $${o.gasInUsd.toFixed(4)}`,gasOutUsd:o.gasOutUsd===void 0?void 0:`up to $${o.gasOutUsd.toFixed(4)}`});return{...m,asset:w,shares:T,totalAssets:N(w,B(s)),performanceFeeWad:k.toString(),walletAssetBalance:N(w,B(u)),walletShares:N(T,p),walletShareValue:N(w,y),liquidityKind:a.kind,...a.readyBase===void 0?{}:{cashOnHand:N(w,a.readyBase)},...d,...o,...n===void 0?{}:{layerbankRateBasePct:n},...b.apr===void 0?{}:{apr:b.apr,rateSource:b.source},...b.readyToWithdraw?{vendorReadyToWithdraw:b.readyToWithdraw}:{},...f!==void 0&&f<=V?{ageSeconds:String(Math.floor(V-f))}:{},risk:{title:"Lending on Borro",text:_,source:"Oak"}}}catch{return{...m,error:"This Borro vault can't be read right now. Please try again."}}}async function ge(r,i,e={},g={},S){if(e.vault&&!g.resolveAllowedAsset&&!g.officialStockTokens)try{g={...g,officialStockTokens:await M({http:r.http,allowAmbiguousSymbols:!0})}}catch{}let A=r.clientFor(4663),m=S??oe(r,g);x(i);let h;if(e.vault){let s=await m.resolveVault(A,e,"deposit",i);h={vaults:[s],refused:[],sources:[],incomplete:!1,warnings:[],measuredAtBlock:s.measuredAtBlock}}else h=await m.discoverVaults(A,e.asset?{asset:e.asset}:{});let[w,T]=await Promise.all([Z(r.http),F(A)]),R=[];for(let s=0;s<h.vaults.length;s+=4)R.push(...await Promise.all(h.vaults.slice(s,s+4).map(t=>ie(r,A,t,i,w,T))));return{...h,vaults:R}}export{ae as a,se as b,oe as c,N as d,ie as e,ge as f};
@@ -0,0 +1 @@
1
+ import{c as tn,d as on,e as _e,f as he,i as Ue,j as rn}from"./3BQ5XHDJ.js";import{a as $e,b as Ee}from"./YEIM6BZQ.js";import{m as ue}from"./7OOCAZBE.js";import{b as Te,o as Me}from"./GYPMUYB5.js";import{a as de}from"./Z7FGEWO2.js";import{h as nn}from"./QA6Z2CYP.js";import{c as en}from"./CFPJDLTZ.js";import{a as T,b as Je}from"./43LI5NKJ.js";import{a as L}from"./66F5ZH34.js";import{b as K}from"./IX3GZMTM.js";import{b as y,e as Ze,j as Q,k as Ye,n as Qe}from"./TI727O2H.js";import{a as o,b as Ge,e as oe}from"./XSD5NL7J.js";import{encodeAbiParameters as S,encodeFunctionData as re,erc20Abi as sn,getAddress as w,isAddress as Hn,keccak256 as Fn,pad as Vn,parseAbi as Ae,parseAbiParameters as z,toEventSelector as Bn,toHex as an}from"viem";var On=w(Q[4663].uniswap.v4_pool_manager.address),M=w(Q[4663].uniswap.v4_position_manager.address),me=w(Q[4663].uniswap.v4_state_view.address),He=w(Q[4663].uniswap.permit2.address),qt=w(Q[4663].ponsTrade.universal_router.address),se=w(Q[4663].uniswap.WETH.address),D=w(Ye),k="0x0000000000000000000000000000000000000000",Oe=8388608,Fe=-887272,ve=887272,In=(1n<<48n)-1n,J=(1n<<128n)-1n,Xn=(1n<<160n)-1n,le=1n<<96n,cn="V4 deposits use limits, not minimums: set amount0Max and amount1Max, and for more room for price movement set slippageBps (at most 500 = 5%).",dn=1800n,fe=50n,un=(e,n=fe)=>e*(10000n-n)/10000n,pn=(e,n,i=fe)=>{let r=(e*(10000n+i)+9999n)/10000n;return r<n?r:n},Rn="0xbac3aa3b91584a53a579b3c999a56756e954e59247e497bad1d25a4334bde551",Ve=class extends o{name="PonsHookRefusal";token;constructor(n){let i=n===void 0?void 0:w(n),r=i?`To buy, use pons_buy {"token":"${i}","amountIn":"<ETH in wei>"}. To sell, use pons_sell {"token":"${i}","amountIn":"<token base units>"}.`:"For this custom pair, check the launch token and pairToken with pons_status, then use pons_buy or pons_sell with those addresses and amounts in the input token's base units.";super(`Oak's Uniswap tools don't quote this pool. Its hook is Pons's own trading hook, so Oak trades it only through Pons. ${r} Pons shows the exact fees before you approve.`),this.token=i}},Xe=[{poolId:"0xbac3aa3b91584a53a579b3c999a56756e954e59247e497bad1d25a4334bde551",key:{currency0:k,currency1:D,fee:8388608,tickSpacing:10,hooks:w("0x06a889870c8f83640d6816319f72e2aa579b6080")},liquidity:"5532026605872066941",sqrtPriceX96:"3839897026469220985301794",tick:-198703,protocolFee:0,lpFee:0},{poolId:"0x387bf619da4d3fb62bb276482693dba1b9b3520f573cabdfe033384a24125982",key:{currency0:k,currency1:D,fee:500,tickSpacing:10,hooks:k},liquidity:"225820987949255613",sqrtPriceX96:"3840577772610961024680304",tick:-198700,protocolFee:512125,lpFee:500},{poolId:"0x54f7883914619af9105355bf83ed678bcf9f63560218ac61c9963b9503d0ba32",key:{currency0:k,currency1:D,fee:460,tickSpacing:9,hooks:k},liquidity:"85654324417347171",sqrtPriceX96:"3840419018843648722761192",tick:-198701,protocolFee:479349,lpFee:460},{poolId:"0xc7b615a3721594f73664eb3f62d8290d0fcc8d9d1156aed1ddecbd7f32efd9f5",key:{currency0:k,currency1:D,fee:8388608,tickSpacing:10,hooks:w("0xcb787a5cdea8b3715d984d82f1203fd7bfebe0c4")},liquidity:"50517446454827887",sqrtPriceX96:"3840495145865430860317598",tick:-198700,protocolFee:0,lpFee:0},{poolId:"0x24107d152f14a76d292123265ae3f3c71f863fc2f4ef7ba49d64e78d28ea379e",key:{currency0:k,currency1:D,fee:100,tickSpacing:1,hooks:k},liquidity:"36478878201789434",sqrtPriceX96:"3840363370720475418748563",tick:-198701,protocolFee:102425,lpFee:100},{poolId:"0x84bd4e2d8be11aeb0afc1195b38f587b61e90068548f1063fdbe448fb8cad0b6",key:{currency0:se,currency1:D,fee:200,tickSpacing:4,hooks:k},liquidity:"5980655057479791",sqrtPriceX96:"3839891926195366283625355",tick:-198703,protocolFee:213044,lpFee:200},{poolId:"0x3b0cbf0603ecc67b5fc9bb4fbb6ac9e08d3b2f406b63d1662a36063a7fe5e866",key:{currency0:k,currency1:D,fee:87,tickSpacing:1,hooks:k},liquidity:"5486760264498148",sqrtPriceX96:"3840563617639470134132117",tick:-198700,protocolFee:90134,lpFee:87}],Re=w("0x987e330f00b79864a07fe81dfac344d0078abcc0"),Cn="0xa791e5169faf703c0b63fd9552c33ec1128a773a00f5dc33a640da62a022cd35",zn={currency0:k,currency1:D,fee:Oe,tickSpacing:1,hooks:Re},jn=new Set([...Xe.map(e=>e.key.hooks.toLowerCase()),Re.toLowerCase()]),Wn=z("address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks"),Gn=z("(address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) poolKey, int24 tickLower, int24 tickUpper, uint256 liquidity, uint128 amount0Max, uint128 amount1Max, address owner, bytes hookData"),Zn=z("address currency0, address currency1"),Yn=z("address currency, address recipient"),ge=z("uint256 tokenId, uint256 liquidity, uint128 amount0Min, uint128 amount1Min, bytes hookData"),Qn=z("uint256 tokenId, uint128 amount0Min, uint128 amount1Min, bytes hookData"),De=z("address currency0, address currency1, address recipient"),pe=z("bytes actions, bytes[] params"),O=Ae(["function modifyLiquidities(bytes unlockData, uint256 deadline) payable","function poolKeys(bytes25 poolId) view returns (address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)","function getPositionLiquidity(uint256 tokenId) view returns (uint128 liquidity)","function getPoolAndPositionInfo(uint256 tokenId) view returns ((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) poolKey, uint256 info)","function positionInfo(uint256 tokenId) view returns (uint256 info)","function ownerOf(uint256 tokenId) view returns (address owner)","function nextTokenId() view returns (uint256 tokenId)"]),Jn=Ae(["function initialize((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, uint160 sqrtPriceX96) returns (int24 tick)"]),ln=z("address currency"),mn=1e6,ye=Ae(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),et=Ae(["function approve(address token, address spender, uint160 amount, uint48 expiration)"]),nt=Bn("Transfer(address,address,uint256)");function xe(e){if(typeof e!="string"||!Hn(e,{strict:!1}))throw new o("Provide a valid v4 currency address.");let n=e.toLowerCase();return n===k||n===de.toLowerCase()?k:w(e)}function H(e){let n=e.toLowerCase();return n===k||n===de.toLowerCase()}function ae(e){let n=xe(e.currency0),i=xe(e.currency1);T(e.hooks);let r=w(e.hooks);return Fn(S(Wn,[n,i,e.fee,e.tickSpacing,r]))}function qn(e){return((typeof e=="number"?e:e.fee)&Oe)!==0}function fn(e,n){return qn(e)?{dynamicFee:!0,storedLpFee:n,swapsAreFree:!1,feeNote:Ee(e,n)}:{dynamicFee:!1,storedLpFee:n,swapsAreFree:n===0,feeNote:Ee(e,n)}}function ke(e,n){if(!e||typeof e!="object")throw new o("Provide a valid v4 PoolKey.");let i=xe(e.currency0),r=xe(e.currency1);if(BigInt(i)>=BigInt(r))throw new o("PoolKey currencies must be strictly sorted (currency0 < currency1).");if(!Number.isInteger(e.tickSpacing)||e.tickSpacing<=0||e.tickSpacing>32767)throw new o("PoolKey tickSpacing must be a positive integer.");if(!Number.isInteger(e.fee)||e.fee<0||e.fee>16777215)throw new o("PoolKey fee must be a valid uint24.");T(e.hooks);let c=w(e.hooks),s=qn(e.fee);if(!s&&e.fee>mn)throw new o(`PoolKey static fee ${$e(e.fee)} exceeds the v4 maximum of ${$e(mn)}.`);if(s&&e.fee!==Oe)throw new o("Dynamic-fee PoolKey must use exact fee flag 0x800000 (8388608).");if(s&&c.toLowerCase()===k)throw new o("Dynamic-fee PoolKey requires a non-zero hook address.");if(!jn.has(c.toLowerCase()))throw ae({currency0:i,currency1:r,fee:e.fee,tickSpacing:e.tickSpacing,hooks:c}).toLowerCase()===en.poolId?new o(nn):c.toLowerCase()===Qe.toLowerCase()?new Ve(i===k?r:void 0):new o(`Unsupported v4 hook ${c}: Oak does not assure arbitrary v4 hooks outside measured PoolKeys.`);let t={currency0:i,currency1:r,fee:e.fee,tickSpacing:e.tickSpacing,hooks:c},d=ae(t);if(c===Re&&d.toLowerCase()!==Cn)throw new o("Only the documented VolatilePair ETH/USDG PoolKey is supported. Pool creation requires the Uniswap Labs role.");if(n!==void 0){if(typeof n!="string"||!/^0x[0-9a-fA-F]{64}$/.test(n))throw new o("Provide a 32-byte hex poolId.");if(d.toLowerCase()!==n.toLowerCase())throw new o(`PoolKey hash (${d}) does not match expected poolId (${n}).`)}return t}function tt(e){if(!Number.isInteger(e)||e<=0||e>ve)throw new o("tickSpacing must be a positive integer.");let n=Math.trunc(Fe/e)*e,i=Math.trunc(ve/e)*e;return{tickLower:n===0?0:n,tickUpper:i===0?0:i}}function it(e,n,i){if(!Number.isInteger(i)||i<=0)throw new o("tickSpacing must be a positive integer.");if(!Number.isInteger(e)||!Number.isInteger(n))throw new o("tickLower and tickUpper must be integers.");if(e<Fe||n>ve)throw new o(`Ticks [${e}, ${n}] are outside Uniswap bounds [${Fe}, ${ve}].`);if(e>=n)throw new o("tickLower must be strictly less than tickUpper.");if(e%i!==0||n%i!==0)throw new o(`Ticks [${e}, ${n}] must be divisible by tickSpacing ${i}.`)}function yn(e,n,i,r,c=y){if(T(e),T(n),H(e))throw new o("Native ETH does not use Permit2 approval.");let s=K(i);if(s<=0n||s>Xn)throw new o("Permit2 approval amount must be a positive integer within uint160.");let t=K(String(r));if(t<=0n||t>In)throw new o("Permit2 expiration must be a positive timestamp within uint48.");let d=re({abi:et,functionName:"approve",args:[e,n,s,Number(t)]});return Je({to:He,data:d,value:"0",chainId:c,description:`Approve Permit2 allowance of ${s} base units of ${e} for ${n} until ${t}.`})}function wn(e){let n=Number(e&0xffffffn);return(n&8388608)!==0?n-16777216:n}function ot(e){let n=(e&0xffn)!==0n,i=wn(e>>8n&0xffffffn),r=wn(e>>32n&0xffffffn);return{poolIdBytes25:`0x${(e>>56n&(1n<<200n)-1n).toString(16).padStart(50,"0")}`,tickLower:i,tickUpper:r,hasSubscriber:n}}function bn(e,n,i,r=!1){let[c,s]=e<=n?[e,n]:[n,e];if(c<=0n||s<=0n)return 0n;let t=(i<<96n)*(s-c),d=s*c;return r?(t+d-1n)/d:t/d}function hn(e,n,i,r=!1){let[c,s]=e<=n?[e,n]:[n,e],t=i*(s-c);return r?(t+le-1n)/le:t/le}function Ln(e){if(e.liquidity<=0n)return{amount0:0n,amount1:0n};let n=ue(e.tickLower),i=ue(e.tickUpper);return e.sqrtPriceX96<=n?{amount0:bn(n,i,e.liquidity,e.roundUp),amount1:0n}:e.sqrtPriceX96<i?{amount0:bn(e.sqrtPriceX96,i,e.liquidity,e.roundUp),amount1:hn(n,e.sqrtPriceX96,e.liquidity,e.roundUp)}:{amount0:0n,amount1:hn(n,i,e.liquidity,e.roundUp)}}function rt(e){let n=ue(e.tickLower),i=ue(e.tickUpper),r=(s,t,d)=>t<=s||d<=0n?0n:d*s*t/le/(t-s),c=(s,t,d)=>t<=s||d<=0n?0n:d*le/(t-s);if(e.sqrtPriceX96<=n)return r(n,i,e.amount0);if(e.sqrtPriceX96<i){let s=r(e.sqrtPriceX96,i,e.amount0),t=c(n,e.sqrtPriceX96,e.amount1);return s<t?s:t}return c(n,i,e.amount1)}function Ne(e,n){return e.map(i=>{let r=i.amount.trim(),c=r.startsWith("-"),s=c||r.startsWith("+")?r.slice(1):r,t=n(s,i.token.decimals);return`${c?"-":""}${t} ${i.token.symbol}`})}function gn(e,n=y){if(H(e))return{address:de,symbol:"ETH",decimals:18,chainId:n};let i=w(e);return i.toLowerCase()===D.toLowerCase()?{address:D,symbol:"USDG",decimals:Ze,chainId:n}:i.toLowerCase()===se.toLowerCase()?{address:se,symbol:"WETH",decimals:18,chainId:n}:{address:i,symbol:i.slice(0,10),decimals:18,chainId:n}}async function B(e,n,i=y){if(H(n))return gn(n,i);let r=w(n);if(r.toLowerCase()===D.toLowerCase()||r.toLowerCase()===se.toLowerCase())return gn(r,i);let[c,s]=await Promise.all([e.readContract({address:r,abi:sn,functionName:"symbol"}),e.readContract({address:r,abi:sn,functionName:"decimals"})]);if(!Number.isInteger(Number(s))||Number(s)<0||Number(s)>77)throw new o(`Token ${r} reports invalid decimals.`);return{address:r,symbol:rn(c,r),decimals:Number(s),chainId:i}}function Z(e,n){if(typeof e!="string"||!/^\d+$/.test(e))throw new o(`${n} must be a non-negative integer string in base units.`);return K(e)}function kn(e,n,i,r){let c=e===void 0?K(Me(n.toString(),i)):Z(e,r);if(c<=1n||c>J)throw new o(`${r} must exceed 1 base unit and fit in uint128; the simulated amount may be too small.`);return c}async function Tn(e,n){if(typeof n=="number"&&Number.isFinite(n)&&n>0)return BigInt(Math.floor(n>1e11?n/1e3:n));if(typeof n=="string"&&/^\d+$/.test(n.trim()))return BigInt(n.trim());try{let i=await e.request({method:"eth_getBlockByNumber",params:["latest",!1]});if(i&&typeof i.timestamp=="string")return BigInt(i.timestamp)}catch{}return BigInt(Math.floor(Date.now()/1e3))}async function Ke(e,n,i){let r=await Tn(e,i);if(n==null)return r+1800n;let c=K(String(n));if(c<=r)throw new o(`Transaction deadline ${c} has expired (current timestamp ${r}).`);return c}async function Be(e,n){let i=typeof n.poolId=="string"?n.poolId.trim():void 0,r=n.poolKey&&typeof n.poolKey=="object"&&!Array.isArray(n.poolKey)?n.poolKey:void 0,c=r?{currency0:String(r.currency0??k),currency1:String(r.currency1??D),fee:Number(r.fee),tickSpacing:Number(r.tickSpacing),hooks:String(r.hooks??k)}:n.currency0!==void 0&&n.currency1!==void 0&&n.fee!==void 0&&n.tickSpacing!==void 0?{currency0:String(n.currency0),currency1:String(n.currency1),fee:Number(n.fee),tickSpacing:Number(n.tickSpacing),hooks:String(n.hooks??k)}:void 0;if(c){if(H(c.currency0)&&typeof n.token0=="string"&&n.token0.toLowerCase()===se.toLowerCase())throw new o("Native ETH currency0 differs from WETH; do not supply WETH for a native-ETH v4 pool.");let u=ke(c,i);return{poolId:ae(u),poolKey:u}}let s=(i??Rn).toLowerCase();if(s===Cn)return{poolId:s,poolKey:ke(zn,s)};let t=Xe.find(u=>u.poolId.toLowerCase()===s);if(t){if(H(t.key.currency0)&&typeof n.token0=="string"&&n.token0.toLowerCase()===se.toLowerCase())throw new o("Native ETH currency0 differs from WETH; do not supply WETH for a native-ETH v4 pool.");return{poolId:t.poolId,poolKey:t.key}}let d=s.slice(0,52),a=await e.readContract({address:M,abi:O,functionName:"poolKeys",args:[d]}),[p,l,m,f,P]=a;if(p.toLowerCase()===k&&l.toLowerCase()===k&&Number(f)===0)throw new o(`Unknown or uninitialized v4 poolId ${s}.`);let b=ke({currency0:p,currency1:l,fee:Number(m),tickSpacing:Number(f),hooks:P},s);return{poolId:s,poolKey:b}}async function Pe(e,n,i){try{let[r,c]=await e.readContract({address:M,abi:O,functionName:"getPoolAndPositionInfo",args:[n]}),s=ke({currency0:r.currency0,currency1:r.currency1,fee:Number(r.fee),tickSpacing:Number(r.tickSpacing),hooks:r.hooks});if((i.poolKey||i.poolId)&&(await Be(e,i)).poolId.toLowerCase()!==ae(s).toLowerCase())throw new o("The supplied PoolKey does not match this v4 position.");let t=ot(BigInt(c));return{poolKey:s,poolId:ae(s),tickLower:t.tickLower,tickUpper:t.tickUpper}}catch(r){throw new o(`Could not read v4 position #${n}. ${oe(r)}`)}}function st(e){if(typeof e!="string")throw new o("wallet must be a valid 20-byte hex address.");return T(e),w(e)}async function Pn(e,n,i={}){T(n);let r=w(n),c=e.clientFor(y),s=new Set;if(i.tokenIds)for(let d of i.tokenIds)s.add(K(String(d)).toString());if(!i.tokenIds?.length)try{let d=await c.getBlockNumber(),a=10000000n;for(let p=0n;p<=d;p+=a){let l=p+a-1n<d?p+a-1n:d,m=await c.request({method:"eth_getLogs",params:[{address:M.toLowerCase(),topics:[nt,null,Vn(r)],fromBlock:an(p),toBlock:an(l)}]});if(!Array.isArray(m))throw new o("Invalid v4 position log response.");for(let f of m){if(!Array.isArray(f.topics)||f.topics.length!==4||!/^0x[0-9a-fA-F]{64}$/.test(f.topics[3]??""))throw new o("Invalid v4 position transfer log.");s.add(BigInt(f.topics[3]).toString())}}}catch(d){if(!i.tokenIds)throw new o(`Could not discover v4 positions. ${oe(d)}`)}let t=[];for(let d of s){let a=BigInt(d);try{let p;try{p=await c.readContract({address:M,abi:O,functionName:"ownerOf",args:[a]})}catch(F){if(Ge(F,3))continue;throw F}if(p.toLowerCase()!==r.toLowerCase())continue;let l=await c.readContract({address:M,abi:O,functionName:"getPositionLiquidity",args:[a]}),m=BigInt(l);if(m===0n&&!i.includeZero)continue;let{poolKey:f,poolId:P,tickLower:b,tickUpper:u}=await Pe(c,a,{}),v=await c.readContract({address:me,abi:ye,functionName:"getSlot0",args:[P]}),x=BigInt(v[0]),{amount0:h,amount1:g}=Ln({liquidity:m,tickLower:b,tickUpper:u,sqrtPriceX96:x}),[A,I]=await Promise.all([B(c,f.currency0,y),B(c,f.currency1,y)]);t.push({module:"uniswap",id:`uniswap:v4:${a.toString()}`,chainId:y,assets:[{token:A,amount:h.toString()},{token:I,amount:g.toString()}],description:`Uniswap v4 LP position #${a.toString()} (${A.symbol}/${I.symbol}, liquidity=${m.toString()}, ticks=[${b},${u}], poolId=${P})`})}catch(p){throw new o(`Could not read v4 position #${a}. ${oe(p)}`)}}return t}var at={type:"object",properties:{version:{description:"Uniswap v4 PoolManager version.",type:"string",enum:["v4"]},poolId:{type:"string",description:"32-byte Uniswap v4 poolId hex string."},poolKey:{description:"V4 pool key: sorted currencies, fee in pips, tick spacing and hook address.",type:"object",properties:{currency0:{description:"Lower sorted currency address; the zero address means native ETH.",type:"string"},currency1:{description:"Higher sorted currency address.",type:"string"},fee:{description:"Pool fee in pips, hundredths of a basis point (3000 = 0.3%; 950000 = 95%).",type:"number"},tickSpacing:{description:"Spacing between usable pool ticks, as an integer.",type:"number"},hooks:{description:"Hook contract address; the zero address means no hook.",type:"string"}}},currency0:{description:"Lower sorted currency address; the zero address means native ETH.",type:"string"},currency1:{description:"Higher sorted currency address.",type:"string"},fee:{description:"Pool fee in pips, hundredths of a basis point (3000 = 0.3%; 950000 = 95%).",type:"number"},tickSpacing:{description:"Spacing between usable pool ticks, as an integer.",type:"number"},hooks:{description:"Hook contract address; the zero address means no hook.",type:"string"},tickLower:{description:"Lower tick boundary, divisible by the pool tick spacing.",type:"number"},tickUpper:{description:"Upper tick boundary, divisible by the pool tick spacing.",type:"number"},fullRange:{description:"Use the widest tick range aligned to the pool tick spacing; omit explicit ticks.",type:"boolean"},liquidity:L('Position liquidity in protocol base units. Example: "1000" = 1000 liquidity units.'),amount0Max:L('Maximum amount of currency0 in base units; use currency0 decimals. Example: "1000000" = 1 currency0 at 6 decimals.'),amount1Max:L('Maximum amount of currency1 in base units; use currency1 decimals. Example: "1000000" = 1 currency1 at 6 decimals.'),recipient:{description:"Recipient address; must be the signing wallet.",type:"string"},deadline:L("Transaction deadline in Unix seconds, after the current block timestamp. Example: 1800000000."),permit2Expiration:{description:'Permit2 allowance expiry in Unix seconds, as a decimal string. Example: "1800000000".',type:"string"},exactCaps:{description:"Use both caller caps exactly for a new v4 mint; omit tokenId, initialPrice and sqrtPriceX96.",type:"boolean"},slippageBps:{description:"Mint cap headroom in basis points (50 = 0.5%), up to 500 (5%); unavailable when increasing an existing NFT.",type:"integer",minimum:0,maximum:500,default:Number(fe)},hookData:{description:"Hex-encoded hook call data; only data supported by the measured hook is accepted.",type:"string"},tokenId:L('Existing v4 position NFT identifier to increase, as a decimal string; keeps its tick range. Omit to mint a new position. Example: "1".'),initialPrice:{type:"string",description:"Starting price as token1 per one token0 in human units; used only for a new pool. Pool creation and the first liquidity add require separate confirmations."},sqrtPriceX96:{type:"string",description:"Alternative starting price: square root of the token1/token0 base-unit price ratio, multiplied by 2^96, as a decimal string."},acceptPriceDeviation:{type:"boolean",description:"Allow a starting price more than 500 basis points (5%) from other live pools of the pair."}}},ct={type:"object",description:"Create and initialize an empty Uniswap v4 pool (permissionless PoolManager.initialize). Add liquidity afterwards with uniswap_add.",properties:{version:{description:"Uniswap v4 PoolManager version.",type:"string",enum:["v4"]},poolKey:{description:"V4 pool key: sorted currencies, fee in pips, tick spacing and hook address.",type:"object",properties:{currency0:{description:"Lower sorted currency address; the zero address means native ETH.",type:"string"},currency1:{description:"Higher sorted currency address.",type:"string"},fee:{description:"Pool fee in pips, hundredths of a basis point (3000 = 0.3%; 950000 = 95%).",type:"number"},tickSpacing:{description:"Spacing between usable pool ticks, as an integer.",type:"number"},hooks:{description:"Hook contract address; the zero address means no hook.",type:"string"}}},currency0:{type:"string",description:"Lower sorted currency; the zero address is native ETH."},currency1:{description:"Higher sorted currency address.",type:"string"},fee:{type:"number",description:"Pool fee in pips, hundredths of a basis point (3000 = 0.3%; 950000 = 95%)."},tickSpacing:{description:"Spacing between usable pool ticks, as an integer.",type:"number"},hooks:{type:"string",description:"Hook address; only hooks Oak has measured are accepted. Defaults to none."},initialPrice:{type:"string",description:"Starting pool price as token1 per one token0 in human units. Add liquidity separately after initialization."},sqrtPriceX96:{type:"string",description:"Alternative starting price: square root of the token1/token0 base-unit price ratio, multiplied by 2^96, as a decimal string."},acceptPriceDeviation:{type:"boolean",description:"Allow a starting price more than 500 basis points (5%) from other live pools of the pair."}}},dt={type:"object",properties:{version:{description:"Uniswap v4 PoolManager version.",type:"string",enum:["v4"]},tokenId:L('Identifier of the position NFT, as a decimal string. Example: "1".'),poolId:{description:"Identifier of the v4 pool, as a 32-byte hex string.",type:"string"},poolKey:{description:"V4 pool key: sorted currencies, fee in pips, tick spacing and hook address.",type:"object"},amount0Min:L('Minimum amount of currency0 in base units; use currency0 decimals. Example: "1000000" = 1 currency0 at 6 decimals.'),amount1Min:L('Minimum amount of currency1 in base units; use currency1 decimals. Example: "1000000" = 1 currency1 at 6 decimals.'),recipient:{description:"Recipient address; must be the signing wallet.",type:"string"},deadline:L("Transaction deadline in Unix seconds, after the current block timestamp. Example: 1800000000."),hookData:{description:"Hex-encoded hook call data; only data supported by the measured hook is accepted.",type:"string"}},required:["tokenId"]},ut={type:"object",properties:{version:{description:"Uniswap v4 PoolManager version.",type:"string",enum:["v4"]},tokenId:L('Identifier of the position NFT, as a decimal string. Example: "1".'),liquidity:{type:"string",pattern:"^(?:[0-9]+|all)$",description:'Liquidity in protocol base units, or "all" for a full exit where supported; not a token amount. Example: "1000" = 1000 liquidity units.'},slippageBps:{description:"Slippage tolerance in basis points (50 = 0.5%).",type:"integer",minimum:0,maximum:9999,default:Te},fullExit:{description:"Remove all position liquidity and collect the proceeds.",type:"boolean"},burn:{description:"Burn the position NFT after all liquidity and owed tokens have been removed.",type:"boolean"},amount0Min:L('Minimum amount of currency0 in base units; use currency0 decimals. Example: "1000000" = 1 currency0 at 6 decimals.'),amount1Min:L('Minimum amount of currency1 in base units; use currency1 decimals. Example: "1000000" = 1 currency1 at 6 decimals.'),poolId:{description:"Identifier of the v4 pool, as a 32-byte hex string.",type:"string"},poolKey:{description:"V4 pool key: sorted currencies, fee in pips, tick spacing and hook address.",type:"object"},recipient:{description:"Recipient address; must be the signing wallet.",type:"string"},deadline:L("Transaction deadline in Unix seconds, after the current block timestamp. Example: 1800000000."),hookData:{description:"Hex-encoded hook call data; only data supported by the measured hook is accepted.",type:"string"}},required:["tokenId"]},pt={type:"object",properties:{version:{description:"Uniswap v4 PoolManager version.",type:"string",enum:["v4"]},tokenIds:{description:'Position NFT identifiers as decimal strings. Example: ["1", "2"].',type:"array",items:L()},includeZero:{description:"Include positions whose current liquidity is zero.",type:"boolean"}}};function vn(e){let n=e.poolKey&&typeof e.poolKey=="object"&&!Array.isArray(e.poolKey)?e.poolKey:e;for(let i of["currency0","currency1","fee","tickSpacing"])if(n[i]===void 0)throw new o(`Creating a pool needs the full poolKey (currency0, currency1, fee, tickSpacing, hooks); ${i} is missing. A poolId alone cannot describe a pool that does not exist yet.`)}function xn(e,n,i){if(e.initialPrice!==void 0&&e.sqrtPriceX96!==void 0)throw new o("Provide initialPrice or sqrtPriceX96, not both.");if(e.sqrtPriceX96!==void 0){if(typeof e.sqrtPriceX96!="string"||!/^\d+$/.test(e.sqrtPriceX96))throw new o("sqrtPriceX96 must be a non-negative integer string.");return on(BigInt(e.sqrtPriceX96))}return tn(e.initialPrice,n,i)}async function lt(e,n,i){let r;try{r=await e.readContract({address:M,abi:O,functionName:"ownerOf",args:[n]})}catch(c){throw new o(`Could not verify owner of Uniswap v4 position #${n}. ${oe(c)}`)}if(w(r)!==w(i))throw new o(`Wallet ${w(i)} is not the owner of Uniswap v4 position #${n} (owned by ${w(r)}).`)}async function An(e,n){let i=ae(n).toLowerCase(),r=new Map;for(let s of Xe)s.key.currency0.toLowerCase()===n.currency0.toLowerCase()&&s.key.currency1.toLowerCase()===n.currency1.toLowerCase()&&r.set(s.poolId.toLowerCase(),s.key);let c=[];for(let[s,t]of r){if(s===i||BigInt(await e.readContract({address:me,abi:ye,functionName:"getLiquidity",args:[s]}))===0n)continue;let a=await e.readContract({address:me,abi:ye,functionName:"getSlot0",args:[s]});BigInt(a[0])>0n&&c.push({label:`v4 fee ${t.fee} spacing ${t.tickSpacing} pool ${s}`,sqrtPriceX96:BigInt(a[0])})}return c}function Sn(e,n,i,r,c,s){return e.unsignedTx({to:On.toLowerCase(),data:re({abi:Jn,functionName:"initialize",args:[{currency0:n.currency0.toLowerCase(),currency1:n.currency1.toLowerCase(),fee:n.fee,tickSpacing:n.tickSpacing,hooks:n.hooks.toLowerCase()},r]}),value:"0",chainId:y,description:`Create and initialize Uniswap v4 pool ${i} (${c.symbol}/${s.symbol}, fee ${n.fee}, tickSpacing ${n.tickSpacing}) at ${he(r,c.decimals,s.decimals)} ${s.symbol} per ${c.symbol}.`})}var mt=e=>({tools:[{name:"uniswap_add",inputSchema:at,async execute(t,d){if(T(d),t.version!==void 0&&t.version!=="v4")throw new o('Uniswap v4 part only handles version "v4".');let a=t.tokenId===void 0?void 0:K(String(t.tokenId));if(a!==void 0&&a<=0n)throw new o("Provide a positive v4 position tokenId.");let p=t.initialPrice!==void 0||t.sqrtPriceX96!==void 0;if(t.exactCaps!==void 0&&typeof t.exactCaps!="boolean")throw new o("exactCaps must be a boolean.");let l=t.exactCaps===!0;if(l&&(a!==void 0||p||t.amount0Max===void 0||t.amount1Max===void 0))throw new o("exactCaps is for v4 mints only: provide both amount0Max and amount1Max, without tokenId, initialPrice or sqrtPriceX96.");if(a!==void 0&&p)throw new o("initialPrice cannot be combined with tokenId.");if(a!==void 0&&(t.amount0Min!==void 0||t.amount1Min!==void 0||t.slippageBps!==void 0))throw new o("V4 mint encodes fixed liquidity and amount0Max/amount1Max; amount minima and slippageBps are not supported for minting.");if(t.amount0Min!==void 0||t.amount1Min!==void 0)throw new o(cn);let m=t.slippageBps===void 0?Number(fe):t.slippageBps;if(typeof m!="number"||!Number.isInteger(m)||m<0||m>500)throw new o(cn);let f=BigInt(m),P=e.clientFor(y);p&&vn(t);let b,u,v,x;if(a!==void 0){if(t.tickLower!==void 0||t.tickUpper!==void 0||t.fullRange!==void 0)throw new o("An existing v4 position keeps its tick range; omit tickLower, tickUpper and fullRange when increasing.");await lt(P,a,d),{poolId:b,poolKey:u,tickLower:v,tickUpper:x}=await Pe(P,a,t)}else{({poolId:b,poolKey:u}=await Be(P,t));let q=tt(u.tickSpacing);v=t.fullRange===!0&&t.tickLower===void 0?q.tickLower:Number(t.tickLower),x=t.fullRange===!0&&t.tickUpper===void 0?q.tickUpper:Number(t.tickUpper),it(v,x,u.tickSpacing)}let[h,g]=await Promise.all([B(P,u.currency0,y),B(P,u.currency1,y)]),A=Z(t.amount0Max??t.amount0Desired,"amount0Max"),I=Z(t.amount1Max??t.amount1Desired,"amount1Max");if(A<=0n&&I<=0n||A>J||I>J)throw new o("Provide positive amount0Max/amount1Max within uint128.");let F=await P.readContract({address:me,abi:ye,functionName:"getSlot0",args:[b]}),_=BigInt(F[0]),j=Number(F[3]),C;if(p){if(_>0n)throw new o(`Pool ${b} already exists; remove initialPrice/sqrtPriceX96 to add liquidity at its current price.`);let q=xn(t,h.decimals,g.decimals),V=Ue(q,await An(P,u),t.acceptPriceDeviation===!0,h.decimals,g.decimals);C={sqrtPriceX96:q,note:V},_=q}else if(_<=0n)throw new o(`Pool ${b} is not initialized on StateView. To create it and add the first liquidity in one tool call with separately confirmed transactions, pass the full poolKey plus initialPrice (token1 per 1 token0, human units); to create it without liquidity use uniswap_create_pool.`);let E=t.liquidity!==void 0&&!l?Z(t.liquidity,"liquidity"):rt({amount0:un(A,f),amount1:un(I,f),tickLower:v,tickUpper:x,sqrtPriceX96:_});if(E<=0n||E>J)throw new o("Position liquidity must be a positive integer within uint128.");let{amount0:ee,amount1:ne}=Ln({liquidity:E,tickLower:v,tickUpper:x,sqrtPriceX96:_,roundUp:!0});if(ee>A||ne>I)throw new o("Liquidity requires more tokens than amount0Max or amount1Max.");let W=l?A:pn(ee,A,f),Y=l?I:pn(ne,I,f),$=t.recipient!==void 0?String(t.recipient):d;if(T($),w($)!==w(d))throw new o("Uniswap recipient must be the signing wallet.");let U=await Tn(P),X=await Ke(P,t.deadline,U.toString()),te=X<U+dn?X:U+dn,N=t.permit2Expiration===void 0?te:K(String(t.permit2Expiration));if(N<=U||N>te||N>In)throw new o("Permit2 expiration must be in the next 30 minutes and no later than the transaction deadline.");let ie=typeof t.hookData=="string"?t.hookData:"0x",Se=((q,V)=>{let G=C?[Sn(e,u,b,C.sqrtPriceX96,h,g)]:[];if(!H(u.currency0)&&q>0n){let ce=u.currency0.toLowerCase();G.push(e.approval(ce,He.toLowerCase(),q.toString(),y)),G.push(yn(ce,M.toLowerCase(),q.toString(),N.toString(),y))}if(!H(u.currency1)&&V>0n){let ce=u.currency1.toLowerCase();G.push(e.approval(ce,He.toLowerCase(),V.toString(),y)),G.push(yn(ce,M.toLowerCase(),V.toString(),N.toString(),y))}let R={currency0:u.currency0.toLowerCase(),currency1:u.currency1.toLowerCase(),fee:u.fee,tickSpacing:u.tickSpacing,hooks:u.hooks.toLowerCase()},Le=S(Gn,[R,v,x,E,q,V,$.toLowerCase(),ie]),_n=S(Zn,[R.currency0,R.currency1]),We=S(Yn,[k,$.toLowerCase()]),Un=S(ge,[a??0n,E,q,V,ie]),Dn=a===void 0?S(pe,["0x020d14",[Le,_n,We]]):S(pe,["0x00121214",[Un,S(ln,[R.currency0]),S(ln,[R.currency1]),We]]),Nn=re({abi:O,functionName:"modifyLiquidities",args:[Dn,X]}),Kn=H(u.currency0)?q.toString():"0";return G.push(e.unsignedTx({to:M.toLowerCase(),data:Nn,value:Kn,chainId:y,description:a!==void 0?`Increase Uniswap v4 position #${a} on pool ${b} (liquidity +${E}).`:`Mint Uniswap v4 position on pool ${b} (ticks [${v}, ${x}], liquidity ${E}).`})),G})(W,Y),we=await e.preview(Se,d),ze=(q,V)=>{let G=H(V)?de:V.toLowerCase();return-q.changes.filter(R=>R.token.address.toLowerCase()===G).reduce((R,Le)=>R+BigInt(Le.amount),0n)},Ie=ze(we,u.currency0),Ce=ze(we,u.currency1);if(Ie<0n||Ce<0n||Ie>W||Ce>Y||Ie===0n&&Ce===0n&&a===void 0)throw new o("Invalid simulated v4 mint spend. Refresh the liquidity preview.");let Mn=Ne(we.changes,e.formatAmount),qe=fn(u,j),je=[...!H(u.currency0)&&W>0n?[h.symbol]:[],...!H(u.currency1)&&Y>0n?[g.symbol]:[]],$n=Se.length,En=a===void 0?`This deposit takes ${$n} approvals in a row: ${je.length?`let Permit2 use your ${je.join(" and ")}, let the Uniswap position manager use it through Permit2, then the deposit`:"the deposit"}. `:"",be=m>Number(fe)?`You chose ${m/100}% room for price movement. Oak will approve up to ${e.formatAmount(W.toString(),h.decimals)} ${h.symbol} and ${e.formatAmount(Y.toString(),g.decimals)} ${g.symbol}, more than the expected ${e.formatAmount(ee.toString(),h.decimals)} and ${e.formatAmount(ne.toString(),g.decimals)}. Anything not used stays in your wallet, and any leftover permission is cancelled after the deposit.`:void 0;return{txs:Se,preview:we,poolId:b,poolKey:u,tickLower:v,tickUpper:x,liquidity:E.toString(),amount0Max:{token:h,amount:A.toString()},amount1Max:{token:g,amount:I.toString()},dynamicFee:qe.dynamicFee,swapsAreFree:qe.swapsAreFree,...a===void 0?{mintTerms:{amount0Max:W.toString(),amount1Max:Y.toString(),deadline:X.toString(),permit2Expiration:N.toString(),slippageBps:m.toString(),liquidity:E.toString()}}:{},...be?{warnings:[be]}:{},action:a!==void 0?"increase":C?"createAndMint":"mint",...a!==void 0?{tokenId:a.toString()}:{},...C?{poolCreated:!0,sqrtPriceX96:C.sqrtPriceX96.toString(),initialPrice:he(C.sqrtPriceX96,h.decimals,g.decimals),initialTick:_e(C.sqrtPriceX96),priceCheck:C.note}:{},summary:`${En}${a!==void 0?`Increase Uniswap v4 position #${a}`:C?"Create Uniswap v4 pool and add first liquidity":"Add Uniswap v4 liquidity"} (${E} L, ticks [${v}, ${x}]) on pool ${b}. Preview deltas: ${Mn.join(", ")||"none"}. A partial spend can leave ERC-20 and Permit2 allowances equal to grant minus spent, bounded by your caps. Use oak_cleanup_allowances to revoke remaining allowances. ${qe.feeNote}${be?` ${be}`:""}${C?` ${C.note}`:""}`}}},{name:"uniswap_collect",inputSchema:dt,async execute(t,d){if(T(d),t.version!==void 0&&t.version!=="v4")throw new o('Uniswap v4 part only handles version "v4".');let a=K(String(t.tokenId??""));if(a<=0n)throw new o("Provide a positive v4 position tokenId.");let p=e.clientFor(y),l=t.recipient!==void 0?String(t.recipient):d;if(T(l),w(l)!==w(d))throw new o("Uniswap recipient must be the signing wallet.");let m=await Ke(p,t.deadline,t.now),f=t.amount0Min!==void 0?Z(t.amount0Min,"amount0Min"):0n,P=t.amount1Min!==void 0?Z(t.amount1Min,"amount1Min"):0n;if(f>J||P>J)throw new o("amount0Min and amount1Min must fit in uint128.");let b=typeof t.hookData=="string"?t.hookData:"0x",{poolKey:u,poolId:v}=await Pe(p,a,t),[x,h]=await Promise.all([B(p,u.currency0,y),B(p,u.currency1,y)]),g=S(ge,[a,0n,f,P,b]),A=S(De,[u.currency0.toLowerCase(),u.currency1.toLowerCase(),l.toLowerCase()]),I=S(pe,["0x0111",[g,A]]),F=re({abi:O,functionName:"modifyLiquidities",args:[I,m]}),_=[e.unsignedTx({to:M.toLowerCase(),data:F,value:"0",chainId:y,description:`Collect Uniswap v4 fees from position #${a} to ${l}.`})],j=await e.preview(_,d),C=Ne(j.changes,e.formatAmount);return{txs:_,preview:j,tokenId:a.toString(),poolId:v,recipient:l,currencies:[x,h],summary:`Collect Uniswap v4 fees for position #${a} (actions 0x0111). Preview deltas: ${C.join(", ")||"0"}.`}}},{name:"uniswap_remove",inputSchema:ut,async execute(t,d){if(T(d),t.version!==void 0&&t.version!=="v4")throw new o('Uniswap v4 part only handles version "v4".');let a=K(String(t.tokenId??""));if(a<=0n)throw new o("Provide a positive v4 position tokenId.");let p=e.clientFor(y),l=t.recipient!==void 0?String(t.recipient):d;if(T(l),w(l)!==w(d))throw new o("Uniswap recipient must be the signing wallet.");let m=await Ke(p,t.deadline,t.now),{poolKey:f,poolId:P}=await Pe(p,a,t),[b,u]=await Promise.all([B(p,f.currency0,y),B(p,f.currency1,y)]),v=t.slippageBps??Te;if(typeof v!="number")throw new o("Slippage must be an integer from 0 to 9999 bps.");Me("0",v);let x=typeof t.hookData=="string"?t.hookData:"0x",h=t.fullExit===!0||t.burn===!0||t.liquidity==="all";if(!h&&t.liquidity===void 0)throw new o('Provide a liquidity amount or explicitly choose liquidity "all" for a full exit.');let g=t.liquidity===void 0||t.liquidity==="all"?void 0:Z(t.liquidity,"liquidity");if(g!==void 0&&(g<0n||g===0n&&!h||g>J))throw new o("Provide positive liquidity within uint128 for v4 removal.");let A;try{A=BigInt(await p.readContract({address:M,abi:O,functionName:"getPositionLiquidity",args:[a]}))}catch($){throw new o(`Could not read v4 position liquidity. ${oe($)}`)}if(A<0n||A===0n&&!h||g!==void 0&&g>A)throw new o("Removal requires a nonempty position and cannot exceed its liquidity.");if(h&&g!==void 0&&g!==A)throw new o("A full burn must match the position liquidity; omit the amount when explicitly choosing all.");let I=h?"0x0311":"0x0111",F=($,U,X)=>{let te=h?S(Qn,[a,$,U,x]):S(ge,[a,g,$,U,x]),N=S(De,[f.currency0,f.currency1,X]);return e.unsignedTx({to:M.toLowerCase(),data:re({abi:O,functionName:"modifyLiquidities",args:[S(pe,[I,[te,N]]),m]}),value:"0",chainId:y,description:`${h?"Burn and exit":"Decrease"} Uniswap v4 position #${a} (${I}).`})},_=0n,j=0n;if(A>0n&&(t.amount0Min===void 0||t.amount1Min===void 0)){let $=e.unsignedTx({to:M.toLowerCase(),data:re({abi:O,functionName:"modifyLiquidities",args:[S(pe,["0x0111",[S(ge,[a,0n,0n,0n,x]),S(De,[f.currency0,f.currency1,M])]]),m]}),value:"0",chainId:y,description:"Simulation only: separate fees from removal principal."}),U=await e.preview([$,F(2n,2n,d)],d),X=te=>U.changes.reduce((N,ie)=>ie.token.chainId===y&&ie.token.address.toLowerCase()===te.address.toLowerCase()?N+BigInt(ie.amount):N,0n);if(_=X(b),j=X(u),_<0n||j<0n)throw new o("Removal simulation did not return the expected currencies.")}let C=($,U)=>{if($!==void 0&&Z($,U)!==0n)throw new o(`${U} must be zero for an empty position burn.`);return 0n},E=A===0n?C(t.amount0Min,"amount0Min"):kn(t.amount0Min,_,v,"amount0Min"),ee=A===0n?C(t.amount1Min,"amount1Min"):kn(t.amount1Min,j,v,"amount1Min"),ne=[F(E,ee,l)],W=await e.preview(ne,d),Y=Ne(W.changes,e.formatAmount);return{txs:ne,preview:W,action:I,tokenId:a.toString(),poolId:P,amount0Min:{token:b,amount:E.toString()},amount1Min:{token:u,amount:ee.toString()},summary:`${h?"Full exit":"Partial remove"} Uniswap v4 position #${a} (${I})${h?`; burns position #${a} at ${M}`:""}. Preview deltas: ${Y.join(", ")||"none"}.`}}},{name:"uniswap_list_positions",inputSchema:pt,async execute(t,d){if(T(d),t.version!==void 0&&t.version!=="v4")throw new o('Uniswap v4 part only handles version "v4".');let a=Array.isArray(t.tokenIds)?t.tokenIds:void 0,p=t.includeZero===!0,l=t.wallet===void 0?w(d):st(t.wallet),m=await Pn(e,l,{tokenIds:a,includeZero:p});return{version:"v4",positions:m,summary:`Found ${m.length} active Uniswap v4 position(s) for ${l}.`}}},{name:"uniswap_create_pool",inputSchema:ct,async execute(t,d){if(T(d),t.version!==void 0&&t.version!=="v4")throw new o('Uniswap v4 part only handles version "v4".');vn(t);let a=e.clientFor(y),{poolId:p,poolKey:l}=await Be(a,t),[m,f]=await Promise.all([B(a,l.currency0,y),B(a,l.currency1,y)]),P=await a.readContract({address:me,abi:ye,functionName:"getSlot0",args:[p]});if(BigInt(P[0])>0n)throw new o(`Uniswap v4 pool ${p} already exists. Use uniswap_add to provide liquidity.`);let b=xn(t,m.decimals,f.decimals),u=Ue(b,await An(a,l),t.acceptPriceDeviation===!0,m.decimals,f.decimals),v=he(b,m.decimals,f.decimals),x=[Sn(e,l,p,b,m,f)],h=await e.preview(x,d),g=fn(l,l.fee);return{txs:x,preview:h,poolId:p,poolKey:l,sqrtPriceX96:b.toString(),initialPrice:v,initialTick:_e(b),priceCheck:u,action:"createPool",summary:`${x[0].description} The pool starts empty: nothing trades until liquidity is added with uniswap_add. ${g.feeNote} ${u}`}}}],positions:t=>Pn(e,t)}),Lt=mt;export{On as a,M as b,me as c,He as d,qt as e,se as f,D as g,k as h,Oe as i,Fe as j,ve as k,Rn as l,Ve as m,Xe as n,Re as o,Cn as p,zn as q,jn as r,H as s,ae as t,qn as u,fn as v,ke as w,tt as x,it as y,yn as z,ot as A,Ln as B,rt as C,Ne as D,gn as E,B as F,Pe as G,Pn as H,at as I,ct as J,dt as K,ut as L,pt as M,An as N,mt as O,Lt as P};
@@ -1 +1 @@
1
- import{a as q,c as M,d as Y}from"./T3QEN3S6.js";import{e as Q,g as j,i as z,j as F}from"./PXUML7HJ.js";import{F as E,c as W,f as H,n as k,t as R,u as K}from"./4E7FJQLL.js";import{a as L}from"./YEIM6BZQ.js";import{a as O}from"./XSD5NL7J.js";import{getAddress as te,parseAbi as oe,zeroAddress as ne}from"viem";var se=oe(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)"]),G=1n<<192n,m={feeRefusal:t=>`Blocked: this pool charges a ${t} fee on every trade. Oak will not quote or prepare a swap through it. Pick a pool with a normal fee. Only if the person has been told the fee and still wants it, repeat with allowHighFeePools: true.`,lossRefusal:(t,e)=>`Blocked: this route returns about ${t} less than ${e}. Oak will not prepare this swap. Only if the person has been told the loss and still wants it, repeat with acceptValueLoss: true.`,warning:(t,e,i)=>`This route returns about ${t} less than ${e} (pool fee ${i} plus price impact).`,own:"this pool's own current price",noIndependent:"No independent market price was available for this pair, so Oak compared the quote with this pool's own current price only.",feeOverride:t=>`You chose to trade through a pool with a ${t} fee.`,lossOverride:(t,e)=>`This trade returns about ${t} less than ${e}.`},l=t=>t.toLowerCase()===ne?H.toLowerCase():t.toLowerCase(),X=(t,e,i,c)=>l(t)===l(i)&&l(e)===l(c)||l(t)===l(c)&&l(e)===l(i),B=(t,e)=>e?[t*t,G]:[G,t*t];async function de(t,e){let{blockNumber:i}=e,c=[],g=[],T=new Map,V=o=>{let n=R(o),s=T.get(n);return s||(s=t.readContract({address:W,abi:se,functionName:"getSlot0",args:[n],blockNumber:i}),T.set(n,s)),s},C=e.poolKeys??[],x=o=>k.some(n=>n.poolId.toLowerCase()===R(o).toLowerCase()),d=e.version==="v4"?await Promise.all(C.map(async o=>K(o)?Number((await V(o))[3]):o.fee)):e.version==="v3"?e.fees:Array.from({length:e.path.length-1},()=>3e3);for(let o=0;o<d.length;o++){let n=L(d[o]);if(d[o]>=5e4&&!(e.version==="v4"&&x(C[o]))&&!e.allowHighFeePools)throw new O(m.feeRefusal(n));(e.allowHighFeePools||e.acceptValueLoss)&&g.push(m.feeOverride(n))}let I=1n,_=1n,a=e.input,y=[],U=!1;for(let o=0;o<d.length;o++){let n=C[o],s=n?n.currency0===a?n.currency1:n.currency0:e.path[o+1],A=e.references?.[o],p,f;if(A)p=A.numerator,f=A.denominator,y.push(A.label);else{let h=(n&&x(n)?k.find(r=>r.poolId.toLowerCase()===R(n).toLowerCase()):void 0)??k.find(r=>X(a,s,r.key.currency0,r.key.currency1)),v=j.find(r=>X(a,s,r.token0,r.token1));if(h||v){let r=h?h.key.currency0:v.token0,u=h?h.key.currency1:v.token1,J=h?(await V(h.key))[0]:(await t.readContract({address:v.address,abi:F,functionName:"slot0",blockNumber:i}))[0];[p,f]=B(J,l(a)===l(r));let[Z,ee]=await Promise.all([E(t,r),E(t,u)]);y.push(`Oak's measured ${Z.symbol}/${ee.symbol} pool`)}else if(U=!0,y.push(m.own),n)[p,f]=B((await V(n))[0],a===n.currency0);else if(e.version==="v3"){let r=await t.readContract({address:Q.factory,abi:z,functionName:"getPool",args:[a,s,d[o]],blockNumber:i}),u=await t.readContract({address:r,abi:F,functionName:"slot0",blockNumber:i});[p,f]=B(u[0],BigInt(a)<BigInt(s))}else{let r=await t.readContract({address:q,abi:M,functionName:"getPair",args:[a,s],blockNumber:i}),u=await t.readContract({address:r,abi:Y,functionName:"getReserves",blockNumber:i});[p,f]=BigInt(a)<BigInt(s)?[u[1],u[0]]:[u[0],u[1]]}}if(p<=0n||f<=0n)throw new O("No positive Uniswap quote is available.");I*=p,_*=f,a=te(s)}let P=[...new Set(y)].join(" \xD7 "),w=U?m.noIndependent:void 0,b=e.exactOutput?e.quoted*I:e.amount*I,D=e.exactOutput?e.amount*_:e.quoted*_,N=b>D?b-D:0n,S=(N*1000n+b/2n)/b,$=`${S/10n}${S%10n?`.${S%10n}`:""}%`;if(N*10n>=b&&!e.acceptValueLoss)throw new O(`${m.lossRefusal($,P)}${w?` ${w}`:""}`);if((e.allowHighFeePools||e.acceptValueLoss)&&g.push(m.lossOverride($,P)),N*100n>=b*2n){let o=d.reduce((n,s)=>n*BigInt(1e6-s),1000000n)/1000000n**BigInt(d.length);c.push(m.warning($,P,L(Number(1000000n-o))))}return c.unshift(...g),c.length&&w&&c.push(w),{reference:P,...w?{referenceNote:w}:{},...c.length?{warnings:c}:{},confirmationWarnings:g}}export{m as a,de as b};
1
+ import{a as q,c as M,d as Y}from"./E47UYYK4.js";import{e as Q,g as j,i as z,j as F}from"./JDHPMS7X.js";import{F as E,c as W,f as H,n as k,t as R,u as K}from"./FRT6AC6M.js";import{a as L}from"./YEIM6BZQ.js";import{a as O}from"./XSD5NL7J.js";import{getAddress as te,parseAbi as oe,zeroAddress as ne}from"viem";var se=oe(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)"]),G=1n<<192n,m={feeRefusal:t=>`Blocked: this pool charges a ${t} fee on every trade. Oak will not quote or prepare a swap through it. Pick a pool with a normal fee. Only if the person has been told the fee and still wants it, repeat with allowHighFeePools: true.`,lossRefusal:(t,e)=>`Blocked: this route returns about ${t} less than ${e}. Oak will not prepare this swap. Only if the person has been told the loss and still wants it, repeat with acceptValueLoss: true.`,warning:(t,e,i)=>`This route returns about ${t} less than ${e} (pool fee ${i} plus price impact).`,own:"this pool's own current price",noIndependent:"No independent market price was available for this pair, so Oak compared the quote with this pool's own current price only.",feeOverride:t=>`You chose to trade through a pool with a ${t} fee.`,lossOverride:(t,e)=>`This trade returns about ${t} less than ${e}.`},l=t=>t.toLowerCase()===ne?H.toLowerCase():t.toLowerCase(),X=(t,e,i,c)=>l(t)===l(i)&&l(e)===l(c)||l(t)===l(c)&&l(e)===l(i),B=(t,e)=>e?[t*t,G]:[G,t*t];async function de(t,e){let{blockNumber:i}=e,c=[],g=[],T=new Map,V=o=>{let n=R(o),s=T.get(n);return s||(s=t.readContract({address:W,abi:se,functionName:"getSlot0",args:[n],blockNumber:i}),T.set(n,s)),s},C=e.poolKeys??[],x=o=>k.some(n=>n.poolId.toLowerCase()===R(o).toLowerCase()),d=e.version==="v4"?await Promise.all(C.map(async o=>K(o)?Number((await V(o))[3]):o.fee)):e.version==="v3"?e.fees:Array.from({length:e.path.length-1},()=>3e3);for(let o=0;o<d.length;o++){let n=L(d[o]);if(d[o]>=5e4&&!(e.version==="v4"&&x(C[o]))&&!e.allowHighFeePools)throw new O(m.feeRefusal(n));(e.allowHighFeePools||e.acceptValueLoss)&&g.push(m.feeOverride(n))}let I=1n,_=1n,a=e.input,y=[],U=!1;for(let o=0;o<d.length;o++){let n=C[o],s=n?n.currency0===a?n.currency1:n.currency0:e.path[o+1],A=e.references?.[o],p,f;if(A)p=A.numerator,f=A.denominator,y.push(A.label);else{let h=(n&&x(n)?k.find(r=>r.poolId.toLowerCase()===R(n).toLowerCase()):void 0)??k.find(r=>X(a,s,r.key.currency0,r.key.currency1)),v=j.find(r=>X(a,s,r.token0,r.token1));if(h||v){let r=h?h.key.currency0:v.token0,u=h?h.key.currency1:v.token1,J=h?(await V(h.key))[0]:(await t.readContract({address:v.address,abi:F,functionName:"slot0",blockNumber:i}))[0];[p,f]=B(J,l(a)===l(r));let[Z,ee]=await Promise.all([E(t,r),E(t,u)]);y.push(`Oak's measured ${Z.symbol}/${ee.symbol} pool`)}else if(U=!0,y.push(m.own),n)[p,f]=B((await V(n))[0],a===n.currency0);else if(e.version==="v3"){let r=await t.readContract({address:Q.factory,abi:z,functionName:"getPool",args:[a,s,d[o]],blockNumber:i}),u=await t.readContract({address:r,abi:F,functionName:"slot0",blockNumber:i});[p,f]=B(u[0],BigInt(a)<BigInt(s))}else{let r=await t.readContract({address:q,abi:M,functionName:"getPair",args:[a,s],blockNumber:i}),u=await t.readContract({address:r,abi:Y,functionName:"getReserves",blockNumber:i});[p,f]=BigInt(a)<BigInt(s)?[u[1],u[0]]:[u[0],u[1]]}}if(p<=0n||f<=0n)throw new O("No positive Uniswap quote is available.");I*=p,_*=f,a=te(s)}let P=[...new Set(y)].join(" \xD7 "),w=U?m.noIndependent:void 0,b=e.exactOutput?e.quoted*I:e.amount*I,D=e.exactOutput?e.amount*_:e.quoted*_,N=b>D?b-D:0n,S=(N*1000n+b/2n)/b,$=`${S/10n}${S%10n?`.${S%10n}`:""}%`;if(N*10n>=b&&!e.acceptValueLoss)throw new O(`${m.lossRefusal($,P)}${w?` ${w}`:""}`);if((e.allowHighFeePools||e.acceptValueLoss)&&g.push(m.lossOverride($,P)),N*100n>=b*2n){let o=d.reduce((n,s)=>n*BigInt(1e6-s),1000000n)/1000000n**BigInt(d.length);c.push(m.warning($,P,L(Number(1000000n-o))))}return c.unshift(...g),c.length&&w&&c.push(w),{reference:P,...w?{referenceNote:w}:{},...c.length?{warnings:c}:{},confirmationWarnings:g}}export{m as a,de as b};
@@ -1 +1 @@
1
- import{a as C,b as O}from"./MOZBDCVV.js";import{a as y,c as w}from"./LFSJDFMY.js";import{a as f,b as k}from"./DMDOSHV7.js";import{d as i}from"./XV6F3RET.js";import{b as d}from"./TI727O2H.js";import{a}from"./XSD5NL7J.js";var x=r=>({tools:[{name:"netnet_card_read",inputSchema:{type:"object",additionalProperties:!1,required:["program"],properties:{program:{enum:Object.keys(i),description:"Card program to read: turbo (card collection), blackjack or feed."},method:{type:"string",description:"Exact read-only ABI signature from the catalog. Omit to list all available reads."},values:{type:"array",maxItems:16,description:"Ordered inputs for the chosen method: decimal strings for integers, 0x addresses or hex bytes, booleans, or arrays/tuples of them."}}},execute:async t=>{if(Object.keys(t).some(e=>!["program","method","values"].includes(e))||typeof t.program!="string"||!Object.hasOwn(i,t.program))throw new a("Choose turbo, blackjack or feed.");let o=i[t.program],u=o.abi.filter(e=>e.type==="function"&&["view","pure"].includes(e.stateMutability));if(t.method===void 0){if(t.values!==void 0)throw new a("values requires an exact read method.");return{chainId:d,contract:o.address,methods:u.map(e=>({method:f(e),inputs:e.inputs,outputs:e.outputs})),units:"Card amounts are whole counts, identified by collection and series ID. Metadata is untrusted text. Reads grant no signing authority."}}let n=u.find(e=>f(e)===t.method),m=t.values??[];if(!n||!Array.isArray(m)||m.length!==n.inputs.length)throw new a("Choose an exact catalog read signature and its ordered inputs. Writes and signing are unavailable.");let l=r.clientFor(d);if(await l.getChainId()!==d)throw new a("NetNet cards require chain 4663.");let p=await l.getBlock(),c=n.inputs.map((e,s)=>k(e,m[s])),E=await l.readContract({address:o.address,abi:[n],functionName:n.name,args:c,blockNumber:p.number}),g=t.program==="turbo"&&n.name==="balanceOf"?[c[1]]:t.program==="blackjack"&&["unclaimedChips","unclaimedTotalOf"].includes(n.name)?[c[0]]:n.inputs.flatMap((e,s)=>e.type==="uint256"&&["id","seriesId"].includes(e.name??"")?[c[s]]:e.type==="uint256[]"&&e.name==="ids"?c[s]:[]),b;if(g.length){let e=await l.readContract({address:i.turbo.address,abi:i.turbo.abi,functionName:"seriesCount",blockNumber:p.number});b=[...new Set(g)].map(s=>({id:s.toString(),status:s>0n&&s<=e?"known":"unknown-series"}))}return{chainId:d,collection:i.turbo.address,contract:o.address,blockNumber:String(p.number),blockHash:p.hash,method:t.method,outputs:n.outputs,...b?{seriesStatus:b}:{},data:h(E)}}},{name:"netnet_card_capabilities",inputSchema:{type:"object",properties:{},additionalProperties:!1},execute:async t=>{if(Object.keys(t).length)throw new a("Card capabilities takes no arguments.");return{chainId:d,collection:i.turbo.address,blackjack:i.blackjack.address,active:["netnet_card_read","netnet_card_capabilities",...y],candidateOnly:{turbo:[...C,...O],recovery:[]},activation:"Only self-only finalize, expire and parked-chip claim are enabled, with local human confirmation and durable recovery. TURBO writes, seating, channel signatures and collection approvals remain disabled.",refused:w}}}]});function h(r,t=0){if(t>12)throw new a("Card read result exceeds the supported nesting.");if(typeof r=="bigint")return r.toString();if(typeof r=="string"){if(r.length>8194)throw new a("Card read result exceeds the supported length.");return/^0x[0-9a-f]*$/i.test(r)?r:`untrusted ${JSON.stringify(r)}`}if(Array.isArray(r)){if(r.length>4096)throw new a("Choose a bounded card read.");return r.map(o=>h(o,t+1))}return r&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([o,u])=>[o,h(u,t+1)])):r}export{x as a};
1
+ import{a as C,b as O}from"./JJSCDDQO.js";import{a as f,b as k}from"./DMDOSHV7.js";import{d as i}from"./XV6F3RET.js";import{a as y,c as w}from"./LFSJDFMY.js";import{b as d}from"./TI727O2H.js";import{a}from"./XSD5NL7J.js";var x=r=>({tools:[{name:"netnet_card_read",inputSchema:{type:"object",additionalProperties:!1,required:["program"],properties:{program:{enum:Object.keys(i),description:"Card program to read: turbo (card collection), blackjack or feed."},method:{type:"string",description:"Exact read-only ABI signature from the catalog. Omit to list all available reads."},values:{type:"array",maxItems:16,description:"Ordered inputs for the chosen method: decimal strings for integers, 0x addresses or hex bytes, booleans, or arrays/tuples of them."}}},execute:async t=>{if(Object.keys(t).some(e=>!["program","method","values"].includes(e))||typeof t.program!="string"||!Object.hasOwn(i,t.program))throw new a("Choose turbo, blackjack or feed.");let o=i[t.program],u=o.abi.filter(e=>e.type==="function"&&["view","pure"].includes(e.stateMutability));if(t.method===void 0){if(t.values!==void 0)throw new a("values requires an exact read method.");return{chainId:d,contract:o.address,methods:u.map(e=>({method:f(e),inputs:e.inputs,outputs:e.outputs})),units:"Card amounts are whole counts, identified by collection and series ID. Metadata is untrusted text. Reads grant no signing authority."}}let n=u.find(e=>f(e)===t.method),m=t.values??[];if(!n||!Array.isArray(m)||m.length!==n.inputs.length)throw new a("Choose an exact catalog read signature and its ordered inputs. Writes and signing are unavailable.");let l=r.clientFor(d);if(await l.getChainId()!==d)throw new a("NetNet cards require chain 4663.");let p=await l.getBlock(),c=n.inputs.map((e,s)=>k(e,m[s])),E=await l.readContract({address:o.address,abi:[n],functionName:n.name,args:c,blockNumber:p.number}),g=t.program==="turbo"&&n.name==="balanceOf"?[c[1]]:t.program==="blackjack"&&["unclaimedChips","unclaimedTotalOf"].includes(n.name)?[c[0]]:n.inputs.flatMap((e,s)=>e.type==="uint256"&&["id","seriesId"].includes(e.name??"")?[c[s]]:e.type==="uint256[]"&&e.name==="ids"?c[s]:[]),b;if(g.length){let e=await l.readContract({address:i.turbo.address,abi:i.turbo.abi,functionName:"seriesCount",blockNumber:p.number});b=[...new Set(g)].map(s=>({id:s.toString(),status:s>0n&&s<=e?"known":"unknown-series"}))}return{chainId:d,collection:i.turbo.address,contract:o.address,blockNumber:String(p.number),blockHash:p.hash,method:t.method,outputs:n.outputs,...b?{seriesStatus:b}:{},data:h(E)}}},{name:"netnet_card_capabilities",inputSchema:{type:"object",properties:{},additionalProperties:!1},execute:async t=>{if(Object.keys(t).length)throw new a("Card capabilities takes no arguments.");return{chainId:d,collection:i.turbo.address,blackjack:i.blackjack.address,active:["netnet_card_read","netnet_card_capabilities",...y],candidateOnly:{turbo:[...C,...O],recovery:[]},activation:"Only self-only finalize, expire and parked-chip claim are enabled, with local human confirmation and durable recovery. TURBO writes, seating, channel signatures and collection approvals remain disabled.",refused:w}}}]});function h(r,t=0){if(t>12)throw new a("Card read result exceeds the supported nesting.");if(typeof r=="bigint")return r.toString();if(typeof r=="string"){if(r.length>8194)throw new a("Card read result exceeds the supported length.");return/^0x[0-9a-f]*$/i.test(r)?r:`untrusted ${JSON.stringify(r)}`}if(Array.isArray(r)){if(r.length>4096)throw new a("Choose a bounded card read.");return r.map(o=>h(o,t+1))}return r&&typeof r=="object"?Object.fromEntries(Object.entries(r).map(([o,u])=>[o,h(u,t+1)])):r}export{x as a};