@oakagentkit/core 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dist/api/history.js +1 -1
- package/build/dist/api/modules/borro/actions.js +1 -1
- package/build/dist/api/modules/borro/checks.js +1 -1
- package/build/dist/api/modules/borro/copy.d.ts +4 -4
- package/build/dist/api/modules/borro/copy.js +1 -1
- package/build/dist/api/modules/borro/index.js +1 -1
- package/build/dist/api/modules/borro/liquidity.js +1 -1
- package/build/dist/api/modules/borro/positions.js +1 -1
- package/build/dist/api/modules/borro/reader.d.ts +6 -2
- package/build/dist/api/modules/borro/reader.js +1 -1
- package/build/dist/api/modules/borro/types.d.ts +6 -0
- package/build/dist/api/modules/chop/abi.d.ts +527 -0
- package/build/dist/api/modules/chop/abi.js +1 -0
- package/build/dist/api/modules/chop/actions.d.ts +24 -0
- package/build/dist/api/modules/chop/actions.js +1 -0
- package/build/dist/api/modules/chop/checks.d.ts +26 -0
- package/build/dist/api/modules/chop/checks.js +1 -0
- package/build/dist/api/modules/chop/copy.d.ts +5 -0
- package/build/dist/api/modules/chop/copy.js +1 -0
- package/build/dist/api/modules/chop/guard.d.ts +13 -0
- package/build/dist/api/modules/chop/guard.js +1 -0
- package/build/dist/api/modules/chop/index.d.ts +3 -0
- package/build/dist/api/modules/chop/index.js +1 -0
- package/build/dist/api/modules/chop/pins.d.ts +53 -0
- package/build/dist/api/modules/chop/pins.js +1 -0
- package/build/dist/api/modules/chop/positions.d.ts +3 -0
- package/build/dist/api/modules/chop/positions.js +1 -0
- package/build/dist/api/modules/chop/reader.d.ts +70 -0
- package/build/dist/api/modules/chop/reader.js +1 -0
- package/build/dist/api/modules/chop/types.d.ts +32 -0
- package/build/dist/api/modules/chop/types.js +0 -0
- package/build/dist/api/modules/clanker/index.js +1 -1
- package/build/dist/api/modules/earn/index.js +1 -1
- package/build/dist/api/modules/erc8004/index.js +1 -1
- package/build/dist/api/modules/gloam/abi.d.ts +89 -0
- package/build/dist/api/modules/gloam/abi.js +1 -0
- package/build/dist/api/modules/gloam/actions.d.ts +5 -0
- package/build/dist/api/modules/gloam/actions.js +1 -0
- package/build/dist/api/modules/gloam/checks.d.ts +17 -0
- package/build/dist/api/modules/gloam/checks.js +1 -0
- package/build/dist/api/modules/gloam/copy.d.ts +22 -0
- package/build/dist/api/modules/gloam/copy.js +2 -0
- package/build/dist/api/modules/gloam/index.d.ts +6 -0
- package/build/dist/api/modules/gloam/index.js +1 -0
- package/build/dist/api/modules/gloam/pins.d.ts +41 -0
- package/build/dist/api/modules/gloam/pins.js +1 -0
- package/build/dist/api/modules/gloam/types.d.ts +308 -0
- package/build/dist/api/modules/gloam/types.js +1 -0
- package/build/dist/api/modules/grove/index.js +1 -1
- package/build/dist/api/modules/heyresearch/index.js +1 -1
- package/build/dist/api/modules/heyresearch/public-reads.js +1 -1
- package/build/dist/api/modules/hoodlock/airdrop.js +1 -1
- package/build/dist/api/modules/hoodlock/fee.js +1 -1
- package/build/dist/api/modules/hoodlock/guard.js +1 -1
- package/build/dist/api/modules/hoodlock/index.js +1 -1
- package/build/dist/api/modules/hoodlock/lifecycle.js +1 -1
- package/build/dist/api/modules/hoodlock/locks-burn.js +1 -1
- package/build/dist/api/modules/hoodlock/public.js +1 -1
- package/build/dist/api/modules/hookr/actions.js +1 -1
- package/build/dist/api/modules/hookr/addons.js +1 -1
- package/build/dist/api/modules/hookr/agent-gate.js +1 -1
- package/build/dist/api/modules/hookr/contracts.js +1 -1
- package/build/dist/api/modules/hookr/create-cancel.js +1 -1
- package/build/dist/api/modules/hookr/discovery.js +1 -1
- package/build/dist/api/modules/hookr/fill-bounty.js +1 -1
- package/build/dist/api/modules/hookr/index.js +1 -1
- package/build/dist/api/modules/hookr/launch-options.js +1 -1
- package/build/dist/api/modules/hookr/launch-receipt.js +1 -1
- package/build/dist/api/modules/hookr/launch.js +1 -1
- package/build/dist/api/modules/hookr/liquidity.js +1 -1
- package/build/dist/api/modules/hookr/lp-positions.js +1 -1
- package/build/dist/api/modules/hookr/lp-reads.js +1 -1
- package/build/dist/api/modules/hookr/lp-receipt.js +1 -1
- package/build/dist/api/modules/hookr/lp-state.js +1 -1
- package/build/dist/api/modules/hookr/public-reads.js +1 -1
- package/build/dist/api/modules/hookr/read-utils.js +1 -1
- package/build/dist/api/modules/hookr/relay.js +1 -1
- package/build/dist/api/modules/kyberswap/index.js +1 -1
- package/build/dist/api/modules/layerbank/actions.js +1 -1
- package/build/dist/api/modules/layerbank/index.js +1 -1
- package/build/dist/api/modules/layerbank/reader.js +1 -1
- package/build/dist/api/modules/longbow/administration.js +1 -1
- package/build/dist/api/modules/longbow/fixed.js +1 -1
- package/build/dist/api/modules/longbow/index.js +1 -1
- package/build/dist/api/modules/meridian/index.js +1 -1
- package/build/dist/api/modules/meridian/rfq.js +1 -1
- package/build/dist/api/modules/merkl/discovery.js +1 -1
- package/build/dist/api/modules/merkl/index.js +1 -1
- package/build/dist/api/modules/merkl/manage.js +1 -1
- package/build/dist/api/modules/morpho/bundles.js +1 -1
- package/build/dist/api/modules/morpho/in-kind.js +1 -1
- package/build/dist/api/modules/morpho/index.js +1 -1
- package/build/dist/api/modules/morpho/local-guard.js +1 -1
- package/build/dist/api/modules/morpho/midnight.js +1 -1
- package/build/dist/api/modules/morpho/protocol.js +1 -1
- package/build/dist/api/modules/morpho/vault-tools.js +1 -1
- package/build/dist/api/modules/netnet/card-plan.js +1 -1
- package/build/dist/api/modules/netnet/card-read.js +1 -1
- package/build/dist/api/modules/netnet/card-recovery.js +1 -1
- package/build/dist/api/modules/netnet/desk-action.js +1 -1
- package/build/dist/api/modules/netnet/financial.js +1 -1
- package/build/dist/api/modules/netnet/index.js +1 -1
- package/build/dist/api/modules/orbio/index.js +1 -1
- package/build/dist/api/modules/pendle/index.js +1 -1
- package/build/dist/api/modules/pendle/reader.js +1 -1
- package/build/dist/api/modules/pons/claim.js +1 -1
- package/build/dist/api/modules/pons/index.js +1 -1
- package/build/dist/api/modules/pons/launch-status.d.ts +1 -0
- package/build/dist/api/modules/pons/launch-status.js +1 -1
- package/build/dist/api/modules/pons/reads.js +1 -1
- package/build/dist/api/modules/pons/trade.js +1 -1
- package/build/dist/api/modules/poolstrade/index.js +1 -1
- package/build/dist/api/modules/priors/coverage.js +1 -1
- package/build/dist/api/modules/priors/discovery.js +1 -1
- package/build/dist/api/modules/priors/index.js +1 -1
- package/build/dist/api/modules/priors/integration.js +1 -1
- package/build/dist/api/modules/priors/stock-swap.js +1 -1
- package/build/dist/api/modules/relay/discovery.js +1 -1
- package/build/dist/api/modules/relay/inbound.js +1 -1
- package/build/dist/api/modules/relay/index.js +1 -1
- package/build/dist/api/modules/relay/outbound-status.js +1 -1
- package/build/dist/api/modules/spark/index.js +1 -1
- package/build/dist/api/modules/steakhouse/index.js +1 -1
- package/build/dist/api/modules/steakhouse/local-guard.js +1 -1
- package/build/dist/api/modules/steakhouse/management.js +1 -1
- package/build/dist/api/modules/steakhouse/v2-exit.js +1 -1
- package/build/dist/api/modules/tickerspring/basket-routes.js +1 -1
- package/build/dist/api/modules/tickerspring/contract-reads.js +1 -1
- package/build/dist/api/modules/tickerspring/exit-preview.js +1 -1
- package/build/dist/api/modules/tickerspring/guards.js +1 -1
- package/build/dist/api/modules/tickerspring/index.js +1 -1
- package/build/dist/api/modules/tickerspring/journeys.js +1 -1
- package/build/dist/api/modules/tickerspring/ladder.js +1 -1
- package/build/dist/api/modules/tickerspring/maker.js +1 -1
- package/build/dist/api/modules/tickerspring/order-accounting.js +1 -1
- package/build/dist/api/modules/tickerspring/research.js +1 -1
- package/build/dist/api/modules/tickerspring/strategies.js +1 -1
- package/build/dist/api/modules/uniswap/auction-create.js +1 -1
- package/build/dist/api/modules/uniswap/auction.js +1 -1
- package/build/dist/api/modules/uniswap/batch.js +1 -1
- package/build/dist/api/modules/uniswap/common.js +1 -1
- package/build/dist/api/modules/uniswap/fees.js +1 -1
- package/build/dist/api/modules/uniswap/index.js +1 -1
- package/build/dist/api/modules/uniswap/local-guard.js +1 -1
- package/build/dist/api/modules/uniswap/oracle.js +1 -1
- package/build/dist/api/modules/uniswap/pool-math.js +1 -1
- package/build/dist/api/modules/uniswap/pools.js +1 -1
- package/build/dist/api/modules/uniswap/position.js +1 -1
- package/build/dist/api/modules/uniswap/protocol.js +1 -1
- package/build/dist/api/modules/uniswap/token-jar.js +1 -1
- package/build/dist/api/modules/uniswap/trade-batch.js +1 -1
- package/build/dist/api/modules/uniswap/trade.js +1 -1
- package/build/dist/api/modules/uniswap/v2.js +1 -1
- package/build/dist/api/modules/uniswap/v3.js +1 -1
- package/build/dist/api/modules/uniswap/v4.js +1 -1
- package/build/dist/api/modules/uniswap/wrap.js +1 -1
- package/build/dist/api/modules/velora/claims.js +1 -1
- package/build/dist/api/modules/velora/index.js +1 -1
- package/build/dist/api/modules/wormhole/index.d.ts +3 -0
- package/build/dist/api/modules/wormhole/index.js +1 -1
- package/build/dist/api/modules/wormhole/swap-token-verdict.d.ts +11 -0
- package/build/dist/api/modules/wormhole/swap-token-verdict.js +1 -0
- package/build/dist/api/modules/wormhole/third-party-text.d.ts +13 -0
- package/build/dist/api/modules/wormhole/third-party-text.js +1 -0
- package/build/dist/api/modules/wormhole/token-check.d.ts +2 -0
- package/build/dist/api/modules/wormhole/token-check.js +1 -1
- package/build/dist/api/modules/wormhole/x402-client.d.ts +36 -0
- package/build/dist/api/modules/wormhole/x402-client.js +1 -0
- package/build/dist/api/prices.js +1 -1
- package/build/dist/api/send.js +1 -1
- package/build/dist/api/signing-registry.js +1 -1
- package/build/dist/api/simulate.js +1 -1
- package/build/dist/api/swap.js +1 -1
- package/build/dist/api/tokens.js +1 -1
- package/build/dist/api/tool-policy.js +1 -1
- package/build/dist/api/types.d.ts +6 -1
- package/build/dist/chunks/{3FUVMSCF.js → 2MT3G7YZ.js} +1 -1
- package/build/dist/chunks/{GEIFITAQ.js → 2THSW4QN.js} +1 -1
- package/build/dist/chunks/{GQ5GYUEH.js → 2VXLVXIB.js} +1 -1
- package/build/dist/chunks/{HCUHMCBW.js → 35KR3VSS.js} +1 -1
- package/build/dist/chunks/{P7I62KFR.js → 3GQ7A3VB.js} +1 -1
- package/build/dist/chunks/3VWVW7PX.js +1 -0
- package/build/dist/chunks/4DP2VPXR.js +3 -0
- package/build/dist/chunks/{MR5L7V6Z.js → 4EN6MQEI.js} +1 -1
- package/build/dist/chunks/{LSXUAHOE.js → 4I3OU56B.js} +1 -1
- package/build/dist/chunks/{NEEZBJBC.js → 5AXWBSPG.js} +1 -1
- package/build/dist/chunks/{VY7XRHZQ.js → 5N3O42X6.js} +1 -1
- package/build/dist/chunks/{X3PQMS4N.js → 5SZPNZG4.js} +1 -1
- package/build/dist/chunks/{VYN2NRAP.js → 6JAXZNZ3.js} +1 -1
- package/build/dist/chunks/{APGLZXIW.js → 6O3Q5B6M.js} +1 -1
- package/build/dist/chunks/6YB3VOUL.js +1 -0
- package/build/dist/chunks/77CLMPM7.js +1 -0
- package/build/dist/chunks/{GL4NCUMH.js → 7GJ6SLEV.js} +1 -1
- package/build/dist/chunks/{57MEFFCU.js → 7KWZ5QJU.js} +1 -1
- package/build/dist/chunks/{326QMOTR.js → 7QIO77VE.js} +1 -1
- package/build/dist/chunks/7QZOTRSA.js +2 -0
- package/build/dist/chunks/{UHVSINR5.js → A7I4IWUB.js} +1 -1
- package/build/dist/chunks/{6PBGEPUK.js → ACW63WIL.js} +4 -4
- package/build/dist/chunks/{P56RZC2M.js → AEL62KCG.js} +1 -1
- package/build/dist/chunks/{6B3VVISQ.js → ALLLYOUG.js} +1 -1
- package/build/dist/chunks/APQYLJGS.js +1 -0
- package/build/dist/chunks/{FQ6UZCM6.js → AW7AXQCZ.js} +1 -1
- package/build/dist/chunks/{T3AJSQYT.js → AXRL3REN.js} +1 -1
- package/build/dist/chunks/{INOZIE55.js → BBTPRZ6T.js} +1 -1
- package/build/dist/chunks/{WDK6VOG4.js → BND2UFVW.js} +1 -1
- package/build/dist/chunks/{3NJ5KQ3Q.js → BOVMED7R.js} +1 -1
- package/build/dist/chunks/{74Y2KDNR.js → CBLMQ5UU.js} +1 -1
- package/build/dist/chunks/CDPSMI3Z.js +1 -0
- package/build/dist/chunks/{XR7VK24E.js → CQEJSCFQ.js} +1 -1
- package/build/dist/chunks/{GW626GG2.js → DBNTZEAJ.js} +1 -1
- package/build/dist/chunks/{SSHCD6RZ.js → DHUDSOGR.js} +1 -1
- package/build/dist/chunks/{3GOHSYHW.js → DL6AEWEM.js} +1 -1
- package/build/dist/chunks/{UMIZMJWW.js → EGYVRQUR.js} +1 -1
- package/build/dist/chunks/{Y25EXZCO.js → FEYAY6OZ.js} +1 -1
- package/build/dist/chunks/FIO6VC2J.js +1 -0
- package/build/dist/chunks/FJ4S4GHY.js +1 -0
- package/build/dist/chunks/{X3BYCOWS.js → FUDAXV5X.js} +1 -1
- package/build/dist/chunks/{Z43BTOTE.js → GG6Y4OCJ.js} +1 -1
- package/build/dist/chunks/{ELSXLZN5.js → GGHBFLRC.js} +1 -1
- package/build/dist/chunks/{L4N2RSK2.js → GRQYTVNT.js} +1 -1
- package/build/dist/chunks/{2MAMJJJC.js → GSBIERZD.js} +1 -1
- package/build/dist/chunks/{J2OT4KAH.js → H6T5FXEX.js} +1 -1
- package/build/dist/chunks/HHXBUYHO.js +1 -0
- package/build/dist/chunks/{MJ6WEWMI.js → HQUVB7Z5.js} +1 -1
- package/build/dist/chunks/HS4DZPYT.js +1 -0
- package/build/dist/chunks/{S7IFAQPG.js → HU7IMNBI.js} +1 -1
- package/build/dist/chunks/{5APS4T2D.js → HWX36XJI.js} +1 -1
- package/build/dist/chunks/I55MURSJ.js +1 -0
- package/build/dist/chunks/I6PQW2JI.js +1 -0
- package/build/dist/chunks/{KIFSRO5K.js → IPN6Z4JM.js} +1 -1
- package/build/dist/chunks/{NDCLTVIU.js → IPRVIKYC.js} +1 -1
- package/build/dist/chunks/{VJS4DHQQ.js → IVX4R5OL.js} +1 -1
- package/build/dist/chunks/JFYBH3DX.js +1 -0
- package/build/dist/chunks/JQOQMFWD.js +3 -0
- package/build/dist/chunks/{BJ2VGRF4.js → JZS3E66E.js} +1 -1
- package/build/dist/chunks/{W6BS3T7S.js → KVFZKPJT.js} +1 -1
- package/build/dist/chunks/{QZZ4O34L.js → LKXO2BQS.js} +1 -1
- package/build/dist/chunks/{BBS3ODWZ.js → LKZX4CAA.js} +1 -1
- package/build/dist/chunks/{H2XDMFQQ.js → LYMNHO5T.js} +1 -1
- package/build/dist/chunks/{KPCY5V35.js → M2UXYCKH.js} +1 -1
- package/build/dist/chunks/{ZMFRMWHR.js → M6LC6DRE.js} +1 -1
- package/build/dist/chunks/{VOMGT5SG.js → MOE3EVAL.js} +1 -1
- package/build/dist/chunks/{2KYAMXTS.js → NOFUKKP5.js} +1 -1
- package/build/dist/chunks/{AVG4W3Y7.js → O6ROOKY2.js} +1 -1
- package/build/dist/chunks/{BTD5SMOW.js → OLSP46ZD.js} +1 -1
- package/build/dist/chunks/{E674J2MD.js → OOZSE2R7.js} +1 -1
- package/build/dist/chunks/{P3S4BR5G.js → P5AJSLZ7.js} +1 -1
- package/build/dist/chunks/{RQ4GHJXE.js → PACN53TR.js} +1 -1
- package/build/dist/chunks/{U67J4BCH.js → PAHXBLCS.js} +1 -1
- package/build/dist/chunks/PAY5PD4H.js +1 -0
- package/build/dist/chunks/{T2WHOZXM.js → PIIHOXWF.js} +1 -1
- package/build/dist/chunks/{HSCQZ66A.js → PNA6UIE5.js} +1 -1
- package/build/dist/chunks/{X2KFXCVD.js → PZGGE5D3.js} +1 -1
- package/build/dist/chunks/{553UE2ZQ.js → QA2RRIES.js} +1 -1
- package/build/dist/chunks/{Z4FZVJ5Z.js → QBIY6FQN.js} +1 -1
- package/build/dist/chunks/{D3YLXQPW.js → QFNT73OF.js} +1 -1
- package/build/dist/chunks/QHBS3PVU.js +1 -0
- package/build/dist/chunks/QW2OPEYJ.js +1 -0
- package/build/dist/chunks/{YWRDZQI6.js → QYVREJYC.js} +1 -1
- package/build/dist/chunks/{W2BYU5JQ.js → ROFPXEQ5.js} +1 -1
- package/build/dist/chunks/{OKUO3BVM.js → RTAHNWHN.js} +1 -1
- package/build/dist/chunks/{UHTRW2R6.js → RTGS7RIO.js} +1 -1
- package/build/dist/chunks/{CCTXCMH4.js → S5CBVFHY.js} +1 -1
- package/build/dist/chunks/{JVLLVNF2.js → T7TFUH5K.js} +1 -1
- package/build/dist/chunks/{OJPG45AC.js → TPBAFS7K.js} +1 -1
- package/build/dist/chunks/{B3RXD5ET.js → U2RMUVVY.js} +1 -1
- package/build/dist/chunks/{4MXM6Q4W.js → UD2XMNIT.js} +1 -1
- package/build/dist/chunks/V5JWGWXC.js +1 -0
- package/build/dist/chunks/VCOTCVKN.js +1 -0
- package/build/dist/chunks/{QO3KCJMP.js → VNV6ZISN.js} +1 -1
- package/build/dist/chunks/{TM2XCRU7.js → X2P55AC3.js} +1 -1
- package/build/dist/chunks/XD6X3KTC.js +1 -0
- package/build/dist/chunks/{C36BFZH6.js → XKSVTN5X.js} +1 -1
- package/build/dist/chunks/{IY7BXLT4.js → XL3LLGIR.js} +1 -1
- package/build/dist/chunks/XQA5LCL6.js +1 -0
- package/build/dist/chunks/{S47VUTHM.js → XSKFKBDR.js} +1 -1
- package/build/dist/chunks/{6D5DJA5B.js → YRNXGQJC.js} +1 -1
- package/build/dist/chunks/YWRLY5EA.js +1 -0
- package/build/dist/chunks/YWSX6IE6.js +1 -0
- package/build/dist/chunks/{QF52OIBS.js → Z6LZGCVW.js} +1 -1
- package/build/dist/chunks/{45BRW2ZF.js → ZQWZGH7V.js} +1 -1
- package/build/dist/chunks/{HAQPIBYR.js → ZXJ24B4L.js} +1 -1
- package/package.json +1 -1
- package/build/dist/chunks/3MLUCYCB.js +0 -1
- package/build/dist/chunks/3XXBLNEX.js +0 -1
- package/build/dist/chunks/4PY3UFNR.js +0 -1
- package/build/dist/chunks/EE64JSLY.js +0 -1
- package/build/dist/chunks/EJ7O75A7.js +0 -1
- package/build/dist/chunks/QC3HH5UD.js +0 -3
- package/build/dist/chunks/QSHCBASA.js +0 -1
- package/build/dist/chunks/XLOYBLFI.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as B,f as te,g as W,i as se,j as T}from"./KIFSRO5K.js";import{E as A,a as J,b as Q,c as C,f as _,h as v,m as b,q as U,s as ee,u as oe}from"./GEIFITAQ.js";import{f as K,g as Z}from"./6B3VVISQ.js";import{a as F}from"./3MLUCYCB.js";import{a as Y}from"./43LI5NKJ.js";import{g as E}from"./NWNYJ26T.js";import{a as y}from"./FWD4L3CJ.js";import{a as w,b as M,e as j}from"./XSD5NL7J.js";import{decodeAbiParameters as fe,getAddress as I,pad as ne,parseAbi as de,parseAbiParameters as me,toEventSelector as he,toHex as ie,zeroAddress as ce}from"viem";var ge=he("Initialize(bytes32,address,address,uint24,int24,address,uint160,int24)"),ke=me("uint24 fee, int24 tickSpacing, address hooks, uint160 sqrtPriceX96, int24 tick"),we=10000000n,ye=10000n,le=25,z=200,R=16,Pe=3e3,be=500,Ae=500n,q=100,O=de(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Ie=de(["function poolKeys(bytes25 poolId) view returns (address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)"]);function ve(o){let e=o.trim().toLowerCase();return e==="eth"||e==="native"||e===ce||e===F.toLowerCase()}function re(o,e){if(o!=null){if(typeof o!="string")throw new w(`${e} must be a token address, or "eth" for native ETH.`);return ve(o)?{eth:!0}:(Y(o),{eth:!1,address:I(o)})}}var ue=(o,e)=>BigInt(o)<BigInt(e)?-1:BigInt(o)>BigInt(e)?1:0;function $(o){return{address:o.address,symbol:o.symbol,decimals:o.decimals}}async function pe(o,e,a,r,c){let[t,s,p]=await Promise.all([o.readContract({address:e,abi:T,functionName:"slot0"}),o.readContract({address:e,abi:T,functionName:"liquidity"}),o.readContract({address:e,abi:T,functionName:"tickSpacing"})]),n=BigInt(t[0]);return{version:"v3",id:e,token0:$(a),token1:$(r),fee:c,tickSpacing:Number(p),initialized:n>0n,liquidity:BigInt(s).toString(),sqrtPriceX96:n.toString(),tick:Number(t[1]),price:n>0n?K(n,a.decimals,r.decimals):"0",addSupported:!0}}async function x(o,e,a){let r=a??ee(e),[c,t]=await Promise.all([A(o,e.currency0,y),A(o,e.currency1,y)]),[s,p]=await Promise.all([o.readContract({address:C,abi:O,functionName:"getSlot0",args:[r]}),o.readContract({address:C,abi:O,functionName:"getLiquidity",args:[r]})]),n=BigInt(s[0]),k=oe(e,Number(s[3]));return{version:"v4",id:r,token0:$(c),token1:$(t),fee:e.fee,tickSpacing:e.tickSpacing,hooks:I(e.hooks),initialized:n>0n,liquidity:BigInt(p).toString(),sqrtPriceX96:n.toString(),tick:Number(s[1]),price:n>0n?K(n,c.decimals,t.decimals):"0",addSupported:U.has(e.hooks.toLowerCase()),feeNote:k.feeNote,...U.has(e.hooks.toLowerCase())?{}:{note:`Hook ${I(e.hooks)} is not one Oak has measured, so uniswap_add will refuse this pool.`}}}async function Se(o,e,a,r){let c=await o.getBlockNumber(),t=[],s=new Set,p=!1,n=we;for(let i=c;;){let l=i+1n>n?i-n+1n:0n,h;try{h=await o.request({method:"eth_getLogs",params:[{address:J.toLowerCase(),topics:[ge,null,e?ne(e):null,a?ne(a):null],fromBlock:ie(l),toBlock:ie(i)}]})}catch(m){if(M(m,-32601)||n<=ye)throw m;n/=2n;continue}if(!Array.isArray(h))throw new w("Invalid v4 Initialize log response.");let P=[];for(let m of h){if(!Array.isArray(m.topics)||m.topics.length!==4||typeof m.data!="string")throw new w("Invalid v4 Initialize log.");let[S,L,N]=fe(ke,m.data),D={currency0:I(`0x${m.topics[2].slice(-40)}`),currency1:I(`0x${m.topics[3].slice(-40)}`),fee:Number(S),tickSpacing:Number(L),hooks:I(N)};P.push({key:D,id:m.topics[1]}),s.add(m.topics[1].toLowerCase())}if(t.push(P),l===0n)break;if(s.size>=r){p=!0;break}i=l-1n}let k=new Map;for(let i of t.reverse())for(let l of i)k.set(l.id.toLowerCase(),l);return{pools:[...k.values()],cut:p}}async function Ce(o,e,a){let r=e.eth?B.weth:e.address,c=a.eth?B.weth:a.address;if(r===c)return[];let[t,s]=ue(r,c)<0?[r,c]:[c,r],[p,n]=await Promise.all([A(o,t,y),A(o,s,y)]),k=[];for(let i of Object.keys(te).map(Number)){let l=I(String(await o.readContract({address:B.factory,abi:se,functionName:"getPool",args:[t,s,i]})));l!==ce&&k.push(await pe(o,l,p,n,i))}return k}function ae(o){return o?o.eth?[v,_]:o.address===_?[_,v]:[o.address]:null}async function _e(o,e){let a=new Map;if(e.length===0)return a;if(typeof o.multicall=="function"&&o.chain?.contracts?.multicall3)try{return(await o.multicall({allowFailure:!0,contracts:e.map(c=>({address:C,abi:O,functionName:"getLiquidity",args:[c]}))})).forEach((c,t)=>a.set(e[t].toLowerCase(),c.status==="success"?BigInt(c.result):0n)),a}catch{}for(let r=0;r<e.length;r+=R)(await Promise.allSettled(e.slice(r,r+R).map(async t=>BigInt(await o.readContract({address:C,abi:O,functionName:"getLiquidity",args:[t]}))))).forEach((t,s)=>a.set(e[r+s].toLowerCase(),t.status==="fulfilled"?t.value:0n));return a}async function Le(o,e,a,r){let c=ae(e),t=ae(a),s=new Map,p=(d,f)=>{if(d&&f){if(d===f)return;let[u,g]=ue(d,f)<0?[d,f]:[f,d];s.set(`${u}/${g}`,[u,g])}else if(d||f){let u=d??f;s.set(`${u}/*0`,[u,null]),s.set(`${u}/*1`,[null,u])}};for(let d of c??[null])for(let f of t??[null])p(d,f);let n=new Map;for(let d of b)[...s.values()].some(([u,g])=>(!u||E(d.key.currency0,u))&&(!g||E(d.key.currency1,g)))&&n.set(d.poolId.toLowerCase(),{key:d.key,id:d.poolId});let i=typeof o.multicall=="function"&&!!o.chain?.contracts?.multicall3?Pe:be,l=!1;for(let[d,f]of s.values()){let u=await Se(o,d,f,i+b.length);l||=u.cut;for(let g of u.pools)n.set(g.id.toLowerCase(),g)}let h=new Set(b.map(d=>d.poolId.toLowerCase())),P=[...n.values()],m=P.filter(d=>h.has(d.id.toLowerCase())),S=P.filter(d=>!h.has(d.id.toLowerCase())).reverse();(S.length>i||l)&&r.push(`${l?"At least ":""}${S.length} v4 pools match; only the newest ${i} non-measured ones were considered. Pass both tokens, or a poolId, to narrow.`);let L=S.slice(0,i),N=await _e(o,L.map(d=>d.id)),D=L.sort((d,f)=>{let u=N.get(d.id.toLowerCase())??0n,g=N.get(f.id.toLowerCase())??0n;return u===g?0:u<g?1:-1}),H=[...m,...D];H.length>z&&r.push(`${H.length} v4 pools match; full state was read for Oak's measured pools plus the deepest of the rest (${z} total). Pass both tokens, or a poolId, to narrow.`);let X=[],V=0,G=H.slice(0,z);for(let d=0;d<G.length;d+=R){let f=await Promise.allSettled(G.slice(d,d+R).map(({key:u,id:g})=>x(o,u,g)));for(let u of f)u.status==="fulfilled"?X.push(u.value):V++}return V>0&&r.push(`${V} pool(s) were skipped because a token or pool state could not be read.`),X}async function Ne(o,e){let a=b.find(n=>E(n.poolId,e));if(a)return x(o,a.key,a.poolId);let[r,c,t,s,p]=await o.readContract({address:Q,abi:Ie,functionName:"poolKeys",args:[e.slice(0,52)]});if(r===v&&c===v&&Number(s)===0)throw new w(`No Uniswap v4 pool ${e} is known to the PositionManager (no position was ever minted in it, or it is not initialized). Search by token pair instead.`);return x(o,{currency0:r,currency1:c,fee:Number(t),tickSpacing:Number(s),hooks:p},e)}function Ee(o){let e=new Set([...b.map(t=>t.poolId.toLowerCase()),...W.map(t=>t.address.toLowerCase())]),a=new Set([v,F.toLowerCase(),_.toLowerCase()]),r=t=>a.has(t.address.toLowerCase())?"ETH":t.address.toLowerCase(),c=new Map;for(let t of o.filter(s=>s.initialized&&BigInt(s.liquidity)>0n)){let s=`${r(t.token0)}/${r(t.token1)}`;c.set(s,[...c.get(s)??[],t])}for(let t of c.values()){let s=t.filter(i=>e.has(i.id.toLowerCase()));if(s.length===0&&t.length<3)continue;let n=(s.length>0?s:t).map(i=>BigInt(i.sqrtPriceX96)).sort((i,l)=>i<l?-1:i>l?1:0),k=n[Math.floor(n.length/2)];for(let i of t){if(e.has(i.id.toLowerCase()))continue;let l=Z(BigInt(i.sqrtPriceX96),k);l>Ae&&(i.priceOutlierBps=Number(l),i.note=`${i.note?`${i.note} `:""}Price differs ${l} bps from the ${s.length>0?"Oak-measured":"median"} price for this pair; do not treat this pool as the market price.`)}}}async function Be(o,e){let a=e.version;if(a!==void 0&&a!=="v3"&&a!=="v4")throw new w('version must be "v3" or "v4"; omit it to search both.');let r=e.limit===void 0?le:Number(e.limit);if(!Number.isInteger(r)||r<1||r>q)throw new w(`limit must be an integer from 1 to ${q}.`);let c=re(e.tokenA,"tokenA"),t=re(e.tokenB,"tokenB");if(!c&&t)throw new w("Provide tokenA when searching by token; tokenB narrows the search to a pair.");let s=o.clientFor(y),p=[],n=[];if(e.poolId!==void 0){if(typeof e.poolId!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e.poolId))throw new w("poolId must be a 32-byte hex v4 poolId. For v3 search by tokenA/tokenB.");n=[await Ne(s,e.poolId)]}else if(c){if(a!=="v4"&&(t?n.push(...await Ce(s,c,t)):p.push("v3 pools are looked up per pair; pass tokenB to include them.")),a!=="v3")try{n.push(...await Le(s,c,t,p))}catch(i){throw M(i,-32601)?i:new w(`Could not search v4 pools. ${j(i)}`)}}else{p.push("No token filter given: showing the pools Oak has measured. Pass tokenA (and tokenB) to search the chain for every pool of a pair.");let i=await Promise.all(W.map(async h=>{let[P,m]=await Promise.all([A(s,h.token0,y),A(s,h.token1,y)]);return pe(s,h.address,P,m,h.fee)})),l=await Promise.all(b.map(h=>x(s,h.key,h.poolId)));n=[...a==="v4"?[]:i,...a==="v3"?[]:l]}Ee(n),n.sort((i,l)=>BigInt(l.liquidity)>BigInt(i.liquidity)?1:BigInt(l.liquidity)<BigInt(i.liquidity)?-1:0),n.length>r&&p.push(`Showing the ${r} deepest of ${n.length} pools found; raise limit (max ${q}) to see more.`),n=n.slice(0,r);let k=n.filter(i=>i.initialized&&BigInt(i.liquidity)>0n).length;return n.length===0&&p.push("No pool exists for this pair. Create one with uniswap_create_pool, or create it and add the first liquidity together with uniswap_add plus initialPrice."),{pools:n,notes:p,summary:`Found ${n.length} Uniswap pool(s), ${k} with active liquidity. price is token1 per 1 token0.`}}function Me(o){return{tools:[{name:"uniswap_pools",inputSchema:{type:"object",description:"Read-only pool discovery on Robinhood Chain (4663): every Uniswap v3 and v4 pool for a token pair with fee, tick spacing, hook, liquidity and price, or one v4 pool by poolId. No tokens given: the measured pools.",properties:{version:{type:"string",enum:["v3","v4"],description:"Limit to one version; omit to search both."},tokenA:{type:"string",description:'Token address, or "eth" for native ETH (searches v3 WETH and v4 native/WETH pools).'},tokenB:{type:"string",description:"Second token of the pair. Required for v3 lookups."},poolId:{type:"string",description:"32-byte v4 poolId to inspect."},limit:{type:"integer",minimum:1,maximum:q,default:le}}},execute:async a=>Be(o,a)}]}}export{Be as a,Me as b};
|
|
1
|
+
import{e as B,f as te,g as W,i as se,j as T}from"./IPN6Z4JM.js";import{E as A,a as J,b as Q,c as C,f as _,h as v,m as b,q as U,s as ee,u as oe}from"./2THSW4QN.js";import{f as K,g as Z}from"./ALLLYOUG.js";import{a as F}from"./QHBS3PVU.js";import{a as Y}from"./43LI5NKJ.js";import{g as E}from"./NWNYJ26T.js";import{a as y}from"./FWD4L3CJ.js";import{a as w,b as M,e as j}from"./XSD5NL7J.js";import{decodeAbiParameters as fe,getAddress as I,pad as ne,parseAbi as de,parseAbiParameters as me,toEventSelector as he,toHex as ie,zeroAddress as ce}from"viem";var ge=he("Initialize(bytes32,address,address,uint24,int24,address,uint160,int24)"),ke=me("uint24 fee, int24 tickSpacing, address hooks, uint160 sqrtPriceX96, int24 tick"),we=10000000n,ye=10000n,le=25,z=200,R=16,Pe=3e3,be=500,Ae=500n,q=100,O=de(["function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)","function getLiquidity(bytes32 poolId) view returns (uint128 liquidity)"]),Ie=de(["function poolKeys(bytes25 poolId) view returns (address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks)"]);function ve(o){let e=o.trim().toLowerCase();return e==="eth"||e==="native"||e===ce||e===F.toLowerCase()}function re(o,e){if(o!=null){if(typeof o!="string")throw new w(`${e} must be a token address, or "eth" for native ETH.`);return ve(o)?{eth:!0}:(Y(o),{eth:!1,address:I(o)})}}var ue=(o,e)=>BigInt(o)<BigInt(e)?-1:BigInt(o)>BigInt(e)?1:0;function $(o){return{address:o.address,symbol:o.symbol,decimals:o.decimals}}async function pe(o,e,a,r,c){let[t,s,p]=await Promise.all([o.readContract({address:e,abi:T,functionName:"slot0"}),o.readContract({address:e,abi:T,functionName:"liquidity"}),o.readContract({address:e,abi:T,functionName:"tickSpacing"})]),n=BigInt(t[0]);return{version:"v3",id:e,token0:$(a),token1:$(r),fee:c,tickSpacing:Number(p),initialized:n>0n,liquidity:BigInt(s).toString(),sqrtPriceX96:n.toString(),tick:Number(t[1]),price:n>0n?K(n,a.decimals,r.decimals):"0",addSupported:!0}}async function x(o,e,a){let r=a??ee(e),[c,t]=await Promise.all([A(o,e.currency0,y),A(o,e.currency1,y)]),[s,p]=await Promise.all([o.readContract({address:C,abi:O,functionName:"getSlot0",args:[r]}),o.readContract({address:C,abi:O,functionName:"getLiquidity",args:[r]})]),n=BigInt(s[0]),k=oe(e,Number(s[3]));return{version:"v4",id:r,token0:$(c),token1:$(t),fee:e.fee,tickSpacing:e.tickSpacing,hooks:I(e.hooks),initialized:n>0n,liquidity:BigInt(p).toString(),sqrtPriceX96:n.toString(),tick:Number(s[1]),price:n>0n?K(n,c.decimals,t.decimals):"0",addSupported:U.has(e.hooks.toLowerCase()),feeNote:k.feeNote,...U.has(e.hooks.toLowerCase())?{}:{note:`Hook ${I(e.hooks)} is not one Oak has measured, so uniswap_add will refuse this pool.`}}}async function Se(o,e,a,r){let c=await o.getBlockNumber(),t=[],s=new Set,p=!1,n=we;for(let i=c;;){let l=i+1n>n?i-n+1n:0n,h;try{h=await o.request({method:"eth_getLogs",params:[{address:J.toLowerCase(),topics:[ge,null,e?ne(e):null,a?ne(a):null],fromBlock:ie(l),toBlock:ie(i)}]})}catch(m){if(M(m,-32601)||n<=ye)throw m;n/=2n;continue}if(!Array.isArray(h))throw new w("Invalid v4 Initialize log response.");let P=[];for(let m of h){if(!Array.isArray(m.topics)||m.topics.length!==4||typeof m.data!="string")throw new w("Invalid v4 Initialize log.");let[S,L,N]=fe(ke,m.data),D={currency0:I(`0x${m.topics[2].slice(-40)}`),currency1:I(`0x${m.topics[3].slice(-40)}`),fee:Number(S),tickSpacing:Number(L),hooks:I(N)};P.push({key:D,id:m.topics[1]}),s.add(m.topics[1].toLowerCase())}if(t.push(P),l===0n)break;if(s.size>=r){p=!0;break}i=l-1n}let k=new Map;for(let i of t.reverse())for(let l of i)k.set(l.id.toLowerCase(),l);return{pools:[...k.values()],cut:p}}async function Ce(o,e,a){let r=e.eth?B.weth:e.address,c=a.eth?B.weth:a.address;if(r===c)return[];let[t,s]=ue(r,c)<0?[r,c]:[c,r],[p,n]=await Promise.all([A(o,t,y),A(o,s,y)]),k=[];for(let i of Object.keys(te).map(Number)){let l=I(String(await o.readContract({address:B.factory,abi:se,functionName:"getPool",args:[t,s,i]})));l!==ce&&k.push(await pe(o,l,p,n,i))}return k}function ae(o){return o?o.eth?[v,_]:o.address===_?[_,v]:[o.address]:null}async function _e(o,e){let a=new Map;if(e.length===0)return a;if(typeof o.multicall=="function"&&o.chain?.contracts?.multicall3)try{return(await o.multicall({allowFailure:!0,contracts:e.map(c=>({address:C,abi:O,functionName:"getLiquidity",args:[c]}))})).forEach((c,t)=>a.set(e[t].toLowerCase(),c.status==="success"?BigInt(c.result):0n)),a}catch{}for(let r=0;r<e.length;r+=R)(await Promise.allSettled(e.slice(r,r+R).map(async t=>BigInt(await o.readContract({address:C,abi:O,functionName:"getLiquidity",args:[t]}))))).forEach((t,s)=>a.set(e[r+s].toLowerCase(),t.status==="fulfilled"?t.value:0n));return a}async function Le(o,e,a,r){let c=ae(e),t=ae(a),s=new Map,p=(d,f)=>{if(d&&f){if(d===f)return;let[u,g]=ue(d,f)<0?[d,f]:[f,d];s.set(`${u}/${g}`,[u,g])}else if(d||f){let u=d??f;s.set(`${u}/*0`,[u,null]),s.set(`${u}/*1`,[null,u])}};for(let d of c??[null])for(let f of t??[null])p(d,f);let n=new Map;for(let d of b)[...s.values()].some(([u,g])=>(!u||E(d.key.currency0,u))&&(!g||E(d.key.currency1,g)))&&n.set(d.poolId.toLowerCase(),{key:d.key,id:d.poolId});let i=typeof o.multicall=="function"&&!!o.chain?.contracts?.multicall3?Pe:be,l=!1;for(let[d,f]of s.values()){let u=await Se(o,d,f,i+b.length);l||=u.cut;for(let g of u.pools)n.set(g.id.toLowerCase(),g)}let h=new Set(b.map(d=>d.poolId.toLowerCase())),P=[...n.values()],m=P.filter(d=>h.has(d.id.toLowerCase())),S=P.filter(d=>!h.has(d.id.toLowerCase())).reverse();(S.length>i||l)&&r.push(`${l?"At least ":""}${S.length} v4 pools match; only the newest ${i} non-measured ones were considered. Pass both tokens, or a poolId, to narrow.`);let L=S.slice(0,i),N=await _e(o,L.map(d=>d.id)),D=L.sort((d,f)=>{let u=N.get(d.id.toLowerCase())??0n,g=N.get(f.id.toLowerCase())??0n;return u===g?0:u<g?1:-1}),H=[...m,...D];H.length>z&&r.push(`${H.length} v4 pools match; full state was read for Oak's measured pools plus the deepest of the rest (${z} total). Pass both tokens, or a poolId, to narrow.`);let X=[],V=0,G=H.slice(0,z);for(let d=0;d<G.length;d+=R){let f=await Promise.allSettled(G.slice(d,d+R).map(({key:u,id:g})=>x(o,u,g)));for(let u of f)u.status==="fulfilled"?X.push(u.value):V++}return V>0&&r.push(`${V} pool(s) were skipped because a token or pool state could not be read.`),X}async function Ne(o,e){let a=b.find(n=>E(n.poolId,e));if(a)return x(o,a.key,a.poolId);let[r,c,t,s,p]=await o.readContract({address:Q,abi:Ie,functionName:"poolKeys",args:[e.slice(0,52)]});if(r===v&&c===v&&Number(s)===0)throw new w(`No Uniswap v4 pool ${e} is known to the PositionManager (no position was ever minted in it, or it is not initialized). Search by token pair instead.`);return x(o,{currency0:r,currency1:c,fee:Number(t),tickSpacing:Number(s),hooks:p},e)}function Ee(o){let e=new Set([...b.map(t=>t.poolId.toLowerCase()),...W.map(t=>t.address.toLowerCase())]),a=new Set([v,F.toLowerCase(),_.toLowerCase()]),r=t=>a.has(t.address.toLowerCase())?"ETH":t.address.toLowerCase(),c=new Map;for(let t of o.filter(s=>s.initialized&&BigInt(s.liquidity)>0n)){let s=`${r(t.token0)}/${r(t.token1)}`;c.set(s,[...c.get(s)??[],t])}for(let t of c.values()){let s=t.filter(i=>e.has(i.id.toLowerCase()));if(s.length===0&&t.length<3)continue;let n=(s.length>0?s:t).map(i=>BigInt(i.sqrtPriceX96)).sort((i,l)=>i<l?-1:i>l?1:0),k=n[Math.floor(n.length/2)];for(let i of t){if(e.has(i.id.toLowerCase()))continue;let l=Z(BigInt(i.sqrtPriceX96),k);l>Ae&&(i.priceOutlierBps=Number(l),i.note=`${i.note?`${i.note} `:""}Price differs ${l} bps from the ${s.length>0?"Oak-measured":"median"} price for this pair; do not treat this pool as the market price.`)}}}async function Be(o,e){let a=e.version;if(a!==void 0&&a!=="v3"&&a!=="v4")throw new w('version must be "v3" or "v4"; omit it to search both.');let r=e.limit===void 0?le:Number(e.limit);if(!Number.isInteger(r)||r<1||r>q)throw new w(`limit must be an integer from 1 to ${q}.`);let c=re(e.tokenA,"tokenA"),t=re(e.tokenB,"tokenB");if(!c&&t)throw new w("Provide tokenA when searching by token; tokenB narrows the search to a pair.");let s=o.clientFor(y),p=[],n=[];if(e.poolId!==void 0){if(typeof e.poolId!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e.poolId))throw new w("poolId must be a 32-byte hex v4 poolId. For v3 search by tokenA/tokenB.");n=[await Ne(s,e.poolId)]}else if(c){if(a!=="v4"&&(t?n.push(...await Ce(s,c,t)):p.push("v3 pools are looked up per pair; pass tokenB to include them.")),a!=="v3")try{n.push(...await Le(s,c,t,p))}catch(i){throw M(i,-32601)?i:new w(`Could not search v4 pools. ${j(i)}`)}}else{p.push("No token filter given: showing the pools Oak has measured. Pass tokenA (and tokenB) to search the chain for every pool of a pair.");let i=await Promise.all(W.map(async h=>{let[P,m]=await Promise.all([A(s,h.token0,y),A(s,h.token1,y)]);return pe(s,h.address,P,m,h.fee)})),l=await Promise.all(b.map(h=>x(s,h.key,h.poolId)));n=[...a==="v4"?[]:i,...a==="v3"?[]:l]}Ee(n),n.sort((i,l)=>BigInt(l.liquidity)>BigInt(i.liquidity)?1:BigInt(l.liquidity)<BigInt(i.liquidity)?-1:0),n.length>r&&p.push(`Showing the ${r} deepest of ${n.length} pools found; raise limit (max ${q}) to see more.`),n=n.slice(0,r);let k=n.filter(i=>i.initialized&&BigInt(i.liquidity)>0n).length;return n.length===0&&p.push("No pool exists for this pair. Create one with uniswap_create_pool, or create it and add the first liquidity together with uniswap_add plus initialPrice."),{pools:n,notes:p,summary:`Found ${n.length} Uniswap pool(s), ${k} with active liquidity. price is token1 per 1 token0.`}}function Me(o){return{tools:[{name:"uniswap_pools",inputSchema:{type:"object",description:"Read-only pool discovery on Robinhood Chain (4663): every Uniswap v3 and v4 pool for a token pair with fee, tick spacing, hook, liquidity and price, or one v4 pool by poolId. No tokens given: the measured pools.",properties:{version:{type:"string",enum:["v3","v4"],description:"Limit to one version; omit to search both."},tokenA:{type:"string",description:'Token address, or "eth" for native ETH (searches v3 WETH and v4 native/WETH pools).'},tokenB:{type:"string",description:"Second token of the pair. Required for v3 lookups."},poolId:{type:"string",description:"32-byte v4 poolId to inspect."},limit:{type:"integer",minimum:1,maximum:q,default:le}}},execute:async a=>Be(o,a)}]}}export{Be as a,Me as b};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Be}from"./UMIZMJWW.js";import{a as y}from"./WWNAGOCD.js";import{A as qe,s as oe,x as xe}from"./GEIFITAQ.js";import{a as w,b as re,d as ve,e as A,f as d,h as $,i as q,j as k,k as N,l as H,m as R,n as ie,o as f,p as c,q as I,r as j,s as He,t as Se}from"./JVLLVNF2.js";import{b as K,f as Pe,g as V,h as Te,i as Le}from"./MQK6OP7S.js";import{i as ne}from"./57MEFFCU.js";import{a as be}from"./3MLUCYCB.js";import{s as ge}from"./FWD4L3CJ.js";import{a as o}from"./XSD5NL7J.js";import{encodeAbiParameters as _e,encodeFunctionData as Qe,erc20Abi as We,formatUnits as Ae,getAddress as ue,parseAbi as _,zeroAddress as b,zeroHash as se}from"viem";var Ge="hookr_launch",g=ue(K.launcherV1),z=ue(K.rulesV1),Je=[{type:"tuple",components:[{name:"flags",type:"uint16"},{name:"minScore",type:"uint32"},{name:"tierScore",type:"uint32"},{name:"tierPips",type:"uint24"},{name:"reviewers",type:"bytes32"}]}],X=(a,n=Object.keys(a))=>({type:"object",properties:a,required:n,additionalProperties:!1}),Re={type:"string",pattern:"^0x[0-9a-fA-F]{40}$"},ae=X({token:{oneOf:[X({kind:{const:"new",type:"string"},name:{type:"string",minLength:1,maxLength:48},symbol:{type:"string",minLength:1,maxLength:12},supply:w,salt:re}),X({kind:{const:"existing",type:"string"},address:Re})]},quote:{...Re,description:"Qualified ETH (zero address) or pinned USDG quote. Other quote funding routes await qualification."},sqrtPriceX96:{...w,description:"Integer sqrt(currency1/currency0) times 2^96 for the sorted PoolKey."},tickLower:{type:"integer",minimum:-887272,maximum:887272},tickUpper:{type:"integer",minimum:-887272,maximum:887272},liquidity:w,amount0Max:w,amount1Max:w,agentGate:X({minScore:w,tierScore:w,tierPips:w,reviewerSetId:re}),lpRewardsBps:w,arbRecapture:{type:"boolean"},deadline:w});function Ye(a){let n=A(a,Object.keys(ae.properties),ae.required),r=R(n.token);if(r.kind==="existing")throw A(r,["kind","address"],["kind","address"]),q(r.address),new o("Existing-token Hookr launches await a qualified funding route. Use token.kind new.");if(A(r,["kind","name","symbol","supply","salt"],["kind","name","symbol","supply","salt"]),r.kind!=="new")throw new o("Choose token.kind new; existing tokens are not supported yet.");let e=(P,M)=>{if(typeof P!="string"||!P.trim()||new TextEncoder().encode(P).length>M||[...P].some(Q=>Q.codePointAt(0)<32)||/[\u007f-\u009f\u2028-\u202e\u2066-\u2069\ud800-\udfff]/u.test(P))throw new o(`Use nonempty public token text within ${M} UTF-8 bytes without control characters.`);return P},i=d(r.supply,108);if(!i)throw new o("Hookr new-token supply must be positive and at most 2^108-1 base units.");let t=q(n.quote);if(![b,ue(ge.mainnet.usdg)].includes(t))throw new o("Use native ETH (zero address) or the pinned USDG quote; other quote funding routes await qualification.");let l=n.tickLower,u=n.tickUpper;if(typeof l!="number"||typeof u!="number")throw new o("Provide integer aligned Hookr ticks.");xe(l,u,y.tickSpacing);let s=d(n.sqrtPriceX96,160);if(s<=ne(l)||s>=ne(u))throw new o("Hookr opening price must be strictly inside the aligned tick range.");let p=d(n.liquidity,127);if(!p)throw new o("Hookr liquidity must be positive and at most int128 max.");let m=d(n.amount0Max,128),L=d(n.amount1Max,128),x=qe({liquidity:p,tickLower:l,tickUpper:u,sqrtPriceX96:s,roundUp:!0});if(x.amount0>=1n<<127n||x.amount1>=1n<<127n||!x.amount0||!x.amount1||x.amount0>m||x.amount1>L)throw new o("Hookr exact rounded-up debts must be positive and fit both approved funding caps. Reduce liquidity or increase the caps.");let h=A(n.agentGate,["minScore","tierScore","tierPips","reviewerSetId"],["minScore","tierScore","tierPips","reviewerSetId"]),F=Number(d(h.minScore,32)),S=Number(d(h.tierScore,32)),B=Number(d(h.tierPips,24)),O=$(h.reviewerSetId);if(B>5e4||S===0!=(B===0)||(F!==0||S!==0)!=(O!==se))throw new o("Use tierPips at most 50000, paired nonzero tier score/pips, and a registered reviewer set only for scored gates. Identity-only uses all zero values.");let U=Number(d(n.lpRewardsBps,16));if(U>1e3)throw new o("Hookr LP Rewards plus burn must not exceed 1000 bps; this profile has zero burn.");if(typeof n.arbRecapture!="boolean")throw new o("Choose arbRecapture true or false explicitly.");return{token:{existing:b,name:e(r.name,48),symbol:e(r.symbol,12),supply:i,salt:$(r.salt)},quote:t,sqrtPriceX96:s,tickLower:l,tickUpper:u,liquidity:p,amount0Max:m,amount1Max:L,debts:x,gateTerms:{flags:1,minScore:F,tierScore:S,tierPips:B,reviewers:O},lpRewardsBps:U,arbRecapture:n.arbRecapture,deadline:d(n.deadline,64)}}async function Ze(a,n,r,e){return q(await c(a,g,f("launcherV1"),"predictToken",[n,r],e))}async function et(a,n,r,e,i){let t=r.gate;if(!t.walletAgent||!(e?t.healthyForScores:t.healthyIdentityOnly))throw new o("Hookr needs a healthy on-chain agent identity. Own an ERC-8004 identity or link its current agent wallet on the Hookr gate; Oak setup linking alone is insufficient.");let l=(p,m)=>c(a,t.identity,_(["function balanceOf(address) view returns (uint256)","function ownerOf(uint256) view returns (address)","function getAgentWallet(uint256) view returns (address)"]),p,m,i),u=k(await l("balanceOf",[n])),s=!1;if(t.link.linked){let p=BigInt(t.link.agentId);s=q(await l("getAgentWallet",[p]))===n,!s&&u>0n&&(s=q(await l("ownerOf",[p]))===n)}if(!u&&!s||e&&!s)throw new o("Hookr on-chain identity ownership or gate link is missing or stale. Link a current ERC-8004 agent ID on the Hookr gate before launching; scored gates require that link even for an NFT owner.")}async function tt(a,n,r){let e=Ye(n);if(a.network==="testnet")throw new o("Hookr launch requires Robinhood Chain 4663.");let i=a.clientFor(4663),t=await Te(i);if(e.deadline<=t.timestamp||e.deadline>t.timestamp+y.deadlineSeconds)throw new o("Set a fresh Hookr deadline within the next 300 seconds of chain time.");let l=e.gateTerms.reviewers!==se,u=await Be(i,r,t.number,l?[e.gateTerms.reviewers]:[]);if(!u.rootOpenForWallet||u.newMarketsPaused||!u.launcherAdmitted)throw new o("Hookr new markets or the reviewed Launcher are closed. Retry only after registry admission is restored.");await et(i,r,u,l,t.number);let s=await Ze(i,r,e.token,t.number);if(s===b||s===e.quote)throw new o("Hookr predicted token collides with its quote. Choose a fresh salt.");let p={currency0:BigInt(s)<BigInt(e.quote)?s:e.quote,currency1:BigInt(s)<BigInt(e.quote)?e.quote:s,fee:8388608,tickSpacing:y.tickSpacing,hooks:I},m=oe(p),L=p.currency0===s,x=L?e.amount0Max:e.amount1Max,h=L?e.amount1Max:e.amount0Max,F=L?e.debts.amount0:e.debts.amount1,S=L?e.debts.amount1:e.debts.amount0;if(x>e.token.supply)throw new o("Hookr new-token deposit cap exceeds its fixed supply.");let[B,O,U,P,M,Q,Ie,Fe]=await Promise.all([i.getCode({address:s,blockNumber:t.number}),i.getTransactionCount({address:s,blockNumber:t.number}),c(i,g,f("launcherV1"),"memberKey",[s,e.quote,y.tickSpacing,I],t.number),c(i,I,f("rootV1"),"knownPool",[m],t.number),c(i,g,f("launcherV1"),"SKIP_TAKEN",[],t.number),c(i,j,f("registry"),"isQuote",[e.quote],t.number),c(i,j,f("registry"),"quoteIsBraked",[e.quote],t.number),c(i,z,f("rulesV1"),"minProtocolShareBps",[],t.number)]),[Ce,$e]=H(U,2);if(e.token.salt===$(M))throw new o("SKIP_TAKEN is unsupported. Choose an ordinary new-token salt.");if(B&&B!=="0x"||O!==0||N(P)||!N($e)||oe(R(Ce))!==m)throw new o("Hookr token address or pool is already taken or its predicted key differs. Choose a fresh salt and rebuild.");if(!N(Q)||N(H(Ie,2)[0]))throw new o("The Hookr quote is not currently qualified or is braked. Choose an admitted quote.");let ce=R(u.gate.admission),Ne=R(ce.caps),pe=d(Ne.maxLpFeePips,24),Oe=BigInt(u.coreAdmission.caps.maxLpFeePips),W=BigInt(y.baseLpFeePips)+pe;if(BigInt(e.gateTerms.tierPips)>pe||W>Oe||W>600000n)throw new o("Hookr gate tier or total LP fee exceeds the live admission cap. Lower the tier or wait for compatible admission.");let de=q(await c(i,z,f("rulesV1"),"protocolRecipient",[],t.number));await V(i,t.number,[de]);let[Ue,Me,Ee]=H(await c(i,de,_(["function feeTerms(address,bool,bytes32) view returns (uint16,uint16,uint16)"]),"feeTerms",[b,e.arbRecapture,m],t.number),3),le=k(Ue,16),G=k(Ee,16);if(k(Me,16)!==0n||G>10000n)throw new o("Hookr treasury minimum or integrator terms exceed the reviewed profile.");let me=k(Fe,16),E=le>me?le:me;if(E<2000n||E>5000n)throw new o("Hookr protocol share is outside the reviewed 2000\u20135000 bps profile.");let J=BigInt(e.lpRewardsBps)*100n+(!e.arbRecapture&&e.lpRewardsBps===0?G:0n);if(J>BigInt(u.coreAdmission.caps.maxQuoteTakePips))throw new o("Hookr LP Rewards and minimum quote charge exceed the live quote-take cap. Lower LP Rewards.");let Y={on:e.arbRecapture,traderBps:0,lpBps:e.arbRecapture?1e4:0,period:0,maxPrizeBps:0,potReleaseBps:0,minBuyQuote:0n,releaseBlocks:0},he=null;if(e.arbRecapture){let[D,ye]=await Promise.all([c(i,z,_(["function recaptureDefaults() view returns ((bool on,uint16 traderBps,uint16 lpBps,uint32 period,uint16 maxPrizeBps,uint16 potReleaseBps,uint128 minBuyQuote,uint32 releaseBlocks) rc,uint16 potBps)"]),"recaptureDefaults",[],t.number),c(i,j,f("registry"),"activeLaneOf",[I],t.number)]);Y.releaseBlocks=Number(k(R(H(D,2)[0]).releaseBlocks,32));let[Ve,je,ze,Xe]=H(ye,4),te=q(Ve);if(await V(i,t.number,[te]),te===b||$(je)!==Pe(te).codeHash||k(ze,32)===0n||k(Xe,16)>10000n||!Y.releaseBlocks)throw new o("Hookr recapture lane is unavailable. Use arbRecapture false until its executor and gas floor are reviewed.");he=ie(ye)}let we={quote:e.quote,tickSpacing:y.tickSpacing,sqrtPriceX96:e.sqrtPriceX96,tickLower:e.tickLower,tickUpper:e.tickUpper,liquidity:e.liquidity,amount0Max:e.amount0Max,amount1Max:e.amount1Max,config:{subject:s,quote:e.quote,rules:z,advisory:Se,liquidityOwner:g,baseLpFeePips:y.baseLpFeePips,caps:{maxLpFeePips:Number(W),maxQuoteTakePips:Number(J),maxSubjectTakeBps:0},rulesGasLimit:Number(u.coreAdmission.gasLimit),advisoryGasLimit:Number(d(ce.gasLimit,32)),advisoryPhases:1,advisoryFailOpen:!1,policyId:se},rules:{guardEndBlock:0,maxFeePips:y.baseLpFeePips,snipeTaxPips:0,snipeFloorPips:0,snipeDecaySeconds:0,dynamicFeeSens:0,burnBps:0,lpBps:e.lpRewardsBps,potBps:0,royaltyBps:0,protocolShareBps:Number(E),potEveryNBuys:0,maxBuyQuoteAmount:0n,potMinBuyQuote:0n,royaltyTo:b,integrator:b},recapture:Y},v=BigInt(u.launchFee.amount);if(v>10000000000000000n)throw new o("Hookr launch fee exceeds the reviewed 0.01 ETH maximum.");let T=b;if(v&&(await V(i,t.number,[u.launchFee.treasury]),T=q(await c(i,u.launchFee.treasury,_(["function target() view returns (address)"]),"target",[],t.number)),T===b||T===g||T===r||T===He))throw new o("Hookr launch fee recipient is outside the reviewed payment profile.");let Z=v+(e.quote===b?h:0n),ee=[],C=[];if(e.quote!==b){let D=k(await c(i,e.quote,We,"allowance",[r,g],t.number));D!==0n&&D!==h&&C.push(a.approval(e.quote,g,"0",4663)),C.push(a.approval(e.quote,g,h.toString(),4663)),ee.push({token:e.quote,amount:h})}Z&&ee.push({token:be,amount:Z,to:g});let ke=`Launch public, permanent token ${JSON.stringify(e.token.name)} (${JSON.stringify(e.token.symbol)}), fixed supply ${Ae(e.token.supply,18)} (18 decimals). Create one agents-only pool (identity check on every buy). Price currency1/currency0 = ${e.sqrtPriceX96*e.sqrtPriceX96}/${1n<<192n}; sqrtPriceX96 ${e.sqrtPriceX96}, ticks ${e.tickLower} to ${e.tickUpper}, spacing ${y.tickSpacing}. Deposit at most ${e.amount0Max} currency0 and ${e.amount1Max} currency1 base units; exact launch debts ${e.debts.amount0} and ${e.debts.amount1}. Currency0 ${p.currency0}; currency1 ${p.currency1}. Launch fee ${v} wei to ${T} (${Ae(v,18)} ETH). Unused quote funding (${h-S} base units) and retained token supply (${e.token.supply-F} base units) return to ${r} in this transaction. Family owner ${r}; token ${s}; pool ${m}. LP base fee 3000 pips; gate flags 1, scores ${e.gateTerms.minScore}/${e.gateTerms.tierScore}, tier ${e.gateTerms.tierPips} pips; LP Rewards ${e.lpRewardsBps} bps; burn 0; quote-take cap ${J} pips (includes Hookr minimum); protocol share ${E} bps. Arb recapture ${e.arbRecapture}; deadline ${e.deadline}. No lock.`;C.push(a.unsignedTx({to:g,data:Qe({abi:f("launcherV1"),functionName:"launchAdvised",args:[e.token,I,[we],[_e(Je,[e.gateTerms])],e.deadline]}),value:Z.toString(),chainId:4663,description:ke}));let[fe,De,Ke]=await Promise.all([i.getCode({address:s}),i.getTransactionCount({address:s}),i.readContract({address:g,abi:ve,functionName:"launchFee"})]);if(fe&&fe!=="0x"||De!==0||k(H(Ke,5)[0])!==v)throw new o("Hookr collision state or launch fee changed. Request a fresh launch preview.");return await Le(i,t),{txs:C,inputs:ee,summary:ke,tokenAddress:s,poolId:m,feeTarget:T,feeTreasury:u.launchFee.treasury,terms:ie({request:n,blockNumber:t.number,blockHash:t.hash,owner:r,tokenAddress:s,poolId:m,poolKey:p,member:we,gateTerms:e.gateTerms,launchFee:v,feeTarget:T,feeTreasury:u.launchFee.treasury,hookrMinimumPips:G,exactApprovals:C.slice(0,-1),refunds:{quote:h-S,retainedSupply:e.token.supply-F},gasEstimate:null,gasEstimateReason:"The local sender estimates the ordered exact calls after funding approvals and confirms the gas limit and maximum fee.",lane:he,pins:K})}}function nt(a){if(!Array.isArray(a)||a.length<1||a.length>3)throw new o("Hookr launch requires only the locally reconstructed finite approvals and one launch transaction.");for(let n of a)A(n,["to","data","value","chainId","description"],["to","data","value","chainId","description"])}function mt(a,n){if(nt(a),a.length!==n.length||a.some((r,e)=>r.to.toLowerCase()!==n[e].to.toLowerCase()||r.data.toLowerCase()!==n[e].data.toLowerCase()||r.value!==n[e].value||r.chainId!==4663))throw new o("Hookr launch differs from the locally reconstructed exact parameters, approvals and funding.")}function ht(a){return[{name:Ge,inputSchema:ae,execute:async(n,r)=>{let e=await tt(a,n,r);return{txs:e.txs,preview:await a.preview(e.txs,r),terms:e.terms,summary:e.summary}}}]}export{Ge as a,g as b,z as c,ae as d,Ye as e,tt as f,nt as g,mt as h,ht as i};
|
|
1
|
+
import{a as Be}from"./EGYVRQUR.js";import{a as y}from"./WWNAGOCD.js";import{A as qe,s as oe,x as xe}from"./2THSW4QN.js";import{a as w,b as re,d as ve,e as A,f as d,h as $,i as q,j as k,k as N,l as H,m as R,n as ie,o as f,p as c,q as I,r as j,s as He,t as Se}from"./T7TFUH5K.js";import{b as K,f as Pe,g as V,h as Te,i as Le}from"./MQK6OP7S.js";import{i as ne}from"./7KWZ5QJU.js";import{a as be}from"./QHBS3PVU.js";import{s as ge}from"./FWD4L3CJ.js";import{a as o}from"./XSD5NL7J.js";import{encodeAbiParameters as _e,encodeFunctionData as Qe,erc20Abi as We,formatUnits as Ae,getAddress as ue,parseAbi as _,zeroAddress as b,zeroHash as se}from"viem";var Ge="hookr_launch",g=ue(K.launcherV1),z=ue(K.rulesV1),Je=[{type:"tuple",components:[{name:"flags",type:"uint16"},{name:"minScore",type:"uint32"},{name:"tierScore",type:"uint32"},{name:"tierPips",type:"uint24"},{name:"reviewers",type:"bytes32"}]}],X=(a,n=Object.keys(a))=>({type:"object",properties:a,required:n,additionalProperties:!1}),Re={type:"string",pattern:"^0x[0-9a-fA-F]{40}$"},ae=X({token:{oneOf:[X({kind:{const:"new",type:"string"},name:{type:"string",minLength:1,maxLength:48},symbol:{type:"string",minLength:1,maxLength:12},supply:w,salt:re}),X({kind:{const:"existing",type:"string"},address:Re})]},quote:{...Re,description:"Qualified ETH (zero address) or pinned USDG quote. Other quote funding routes await qualification."},sqrtPriceX96:{...w,description:"Integer sqrt(currency1/currency0) times 2^96 for the sorted PoolKey."},tickLower:{type:"integer",minimum:-887272,maximum:887272},tickUpper:{type:"integer",minimum:-887272,maximum:887272},liquidity:w,amount0Max:w,amount1Max:w,agentGate:X({minScore:w,tierScore:w,tierPips:w,reviewerSetId:re}),lpRewardsBps:w,arbRecapture:{type:"boolean"},deadline:w});function Ye(a){let n=A(a,Object.keys(ae.properties),ae.required),r=R(n.token);if(r.kind==="existing")throw A(r,["kind","address"],["kind","address"]),q(r.address),new o("Existing-token Hookr launches await a qualified funding route. Use token.kind new.");if(A(r,["kind","name","symbol","supply","salt"],["kind","name","symbol","supply","salt"]),r.kind!=="new")throw new o("Choose token.kind new; existing tokens are not supported yet.");let e=(P,M)=>{if(typeof P!="string"||!P.trim()||new TextEncoder().encode(P).length>M||[...P].some(Q=>Q.codePointAt(0)<32)||/[\u007f-\u009f\u2028-\u202e\u2066-\u2069\ud800-\udfff]/u.test(P))throw new o(`Use nonempty public token text within ${M} UTF-8 bytes without control characters.`);return P},i=d(r.supply,108);if(!i)throw new o("Hookr new-token supply must be positive and at most 2^108-1 base units.");let t=q(n.quote);if(![b,ue(ge.mainnet.usdg)].includes(t))throw new o("Use native ETH (zero address) or the pinned USDG quote; other quote funding routes await qualification.");let l=n.tickLower,u=n.tickUpper;if(typeof l!="number"||typeof u!="number")throw new o("Provide integer aligned Hookr ticks.");xe(l,u,y.tickSpacing);let s=d(n.sqrtPriceX96,160);if(s<=ne(l)||s>=ne(u))throw new o("Hookr opening price must be strictly inside the aligned tick range.");let p=d(n.liquidity,127);if(!p)throw new o("Hookr liquidity must be positive and at most int128 max.");let m=d(n.amount0Max,128),L=d(n.amount1Max,128),x=qe({liquidity:p,tickLower:l,tickUpper:u,sqrtPriceX96:s,roundUp:!0});if(x.amount0>=1n<<127n||x.amount1>=1n<<127n||!x.amount0||!x.amount1||x.amount0>m||x.amount1>L)throw new o("Hookr exact rounded-up debts must be positive and fit both approved funding caps. Reduce liquidity or increase the caps.");let h=A(n.agentGate,["minScore","tierScore","tierPips","reviewerSetId"],["minScore","tierScore","tierPips","reviewerSetId"]),F=Number(d(h.minScore,32)),S=Number(d(h.tierScore,32)),B=Number(d(h.tierPips,24)),O=$(h.reviewerSetId);if(B>5e4||S===0!=(B===0)||(F!==0||S!==0)!=(O!==se))throw new o("Use tierPips at most 50000, paired nonzero tier score/pips, and a registered reviewer set only for scored gates. Identity-only uses all zero values.");let U=Number(d(n.lpRewardsBps,16));if(U>1e3)throw new o("Hookr LP Rewards plus burn must not exceed 1000 bps; this profile has zero burn.");if(typeof n.arbRecapture!="boolean")throw new o("Choose arbRecapture true or false explicitly.");return{token:{existing:b,name:e(r.name,48),symbol:e(r.symbol,12),supply:i,salt:$(r.salt)},quote:t,sqrtPriceX96:s,tickLower:l,tickUpper:u,liquidity:p,amount0Max:m,amount1Max:L,debts:x,gateTerms:{flags:1,minScore:F,tierScore:S,tierPips:B,reviewers:O},lpRewardsBps:U,arbRecapture:n.arbRecapture,deadline:d(n.deadline,64)}}async function Ze(a,n,r,e){return q(await c(a,g,f("launcherV1"),"predictToken",[n,r],e))}async function et(a,n,r,e,i){let t=r.gate;if(!t.walletAgent||!(e?t.healthyForScores:t.healthyIdentityOnly))throw new o("Hookr needs a healthy on-chain agent identity. Own an ERC-8004 identity or link its current agent wallet on the Hookr gate; Oak setup linking alone is insufficient.");let l=(p,m)=>c(a,t.identity,_(["function balanceOf(address) view returns (uint256)","function ownerOf(uint256) view returns (address)","function getAgentWallet(uint256) view returns (address)"]),p,m,i),u=k(await l("balanceOf",[n])),s=!1;if(t.link.linked){let p=BigInt(t.link.agentId);s=q(await l("getAgentWallet",[p]))===n,!s&&u>0n&&(s=q(await l("ownerOf",[p]))===n)}if(!u&&!s||e&&!s)throw new o("Hookr on-chain identity ownership or gate link is missing or stale. Link a current ERC-8004 agent ID on the Hookr gate before launching; scored gates require that link even for an NFT owner.")}async function tt(a,n,r){let e=Ye(n);if(a.network==="testnet")throw new o("Hookr launch requires Robinhood Chain 4663.");let i=a.clientFor(4663),t=await Te(i);if(e.deadline<=t.timestamp||e.deadline>t.timestamp+y.deadlineSeconds)throw new o("Set a fresh Hookr deadline within the next 300 seconds of chain time.");let l=e.gateTerms.reviewers!==se,u=await Be(i,r,t.number,l?[e.gateTerms.reviewers]:[]);if(!u.rootOpenForWallet||u.newMarketsPaused||!u.launcherAdmitted)throw new o("Hookr new markets or the reviewed Launcher are closed. Retry only after registry admission is restored.");await et(i,r,u,l,t.number);let s=await Ze(i,r,e.token,t.number);if(s===b||s===e.quote)throw new o("Hookr predicted token collides with its quote. Choose a fresh salt.");let p={currency0:BigInt(s)<BigInt(e.quote)?s:e.quote,currency1:BigInt(s)<BigInt(e.quote)?e.quote:s,fee:8388608,tickSpacing:y.tickSpacing,hooks:I},m=oe(p),L=p.currency0===s,x=L?e.amount0Max:e.amount1Max,h=L?e.amount1Max:e.amount0Max,F=L?e.debts.amount0:e.debts.amount1,S=L?e.debts.amount1:e.debts.amount0;if(x>e.token.supply)throw new o("Hookr new-token deposit cap exceeds its fixed supply.");let[B,O,U,P,M,Q,Ie,Fe]=await Promise.all([i.getCode({address:s,blockNumber:t.number}),i.getTransactionCount({address:s,blockNumber:t.number}),c(i,g,f("launcherV1"),"memberKey",[s,e.quote,y.tickSpacing,I],t.number),c(i,I,f("rootV1"),"knownPool",[m],t.number),c(i,g,f("launcherV1"),"SKIP_TAKEN",[],t.number),c(i,j,f("registry"),"isQuote",[e.quote],t.number),c(i,j,f("registry"),"quoteIsBraked",[e.quote],t.number),c(i,z,f("rulesV1"),"minProtocolShareBps",[],t.number)]),[Ce,$e]=H(U,2);if(e.token.salt===$(M))throw new o("SKIP_TAKEN is unsupported. Choose an ordinary new-token salt.");if(B&&B!=="0x"||O!==0||N(P)||!N($e)||oe(R(Ce))!==m)throw new o("Hookr token address or pool is already taken or its predicted key differs. Choose a fresh salt and rebuild.");if(!N(Q)||N(H(Ie,2)[0]))throw new o("The Hookr quote is not currently qualified or is braked. Choose an admitted quote.");let ce=R(u.gate.admission),Ne=R(ce.caps),pe=d(Ne.maxLpFeePips,24),Oe=BigInt(u.coreAdmission.caps.maxLpFeePips),W=BigInt(y.baseLpFeePips)+pe;if(BigInt(e.gateTerms.tierPips)>pe||W>Oe||W>600000n)throw new o("Hookr gate tier or total LP fee exceeds the live admission cap. Lower the tier or wait for compatible admission.");let de=q(await c(i,z,f("rulesV1"),"protocolRecipient",[],t.number));await V(i,t.number,[de]);let[Ue,Me,Ee]=H(await c(i,de,_(["function feeTerms(address,bool,bytes32) view returns (uint16,uint16,uint16)"]),"feeTerms",[b,e.arbRecapture,m],t.number),3),le=k(Ue,16),G=k(Ee,16);if(k(Me,16)!==0n||G>10000n)throw new o("Hookr treasury minimum or integrator terms exceed the reviewed profile.");let me=k(Fe,16),E=le>me?le:me;if(E<2000n||E>5000n)throw new o("Hookr protocol share is outside the reviewed 2000\u20135000 bps profile.");let J=BigInt(e.lpRewardsBps)*100n+(!e.arbRecapture&&e.lpRewardsBps===0?G:0n);if(J>BigInt(u.coreAdmission.caps.maxQuoteTakePips))throw new o("Hookr LP Rewards and minimum quote charge exceed the live quote-take cap. Lower LP Rewards.");let Y={on:e.arbRecapture,traderBps:0,lpBps:e.arbRecapture?1e4:0,period:0,maxPrizeBps:0,potReleaseBps:0,minBuyQuote:0n,releaseBlocks:0},he=null;if(e.arbRecapture){let[D,ye]=await Promise.all([c(i,z,_(["function recaptureDefaults() view returns ((bool on,uint16 traderBps,uint16 lpBps,uint32 period,uint16 maxPrizeBps,uint16 potReleaseBps,uint128 minBuyQuote,uint32 releaseBlocks) rc,uint16 potBps)"]),"recaptureDefaults",[],t.number),c(i,j,f("registry"),"activeLaneOf",[I],t.number)]);Y.releaseBlocks=Number(k(R(H(D,2)[0]).releaseBlocks,32));let[Ve,je,ze,Xe]=H(ye,4),te=q(Ve);if(await V(i,t.number,[te]),te===b||$(je)!==Pe(te).codeHash||k(ze,32)===0n||k(Xe,16)>10000n||!Y.releaseBlocks)throw new o("Hookr recapture lane is unavailable. Use arbRecapture false until its executor and gas floor are reviewed.");he=ie(ye)}let we={quote:e.quote,tickSpacing:y.tickSpacing,sqrtPriceX96:e.sqrtPriceX96,tickLower:e.tickLower,tickUpper:e.tickUpper,liquidity:e.liquidity,amount0Max:e.amount0Max,amount1Max:e.amount1Max,config:{subject:s,quote:e.quote,rules:z,advisory:Se,liquidityOwner:g,baseLpFeePips:y.baseLpFeePips,caps:{maxLpFeePips:Number(W),maxQuoteTakePips:Number(J),maxSubjectTakeBps:0},rulesGasLimit:Number(u.coreAdmission.gasLimit),advisoryGasLimit:Number(d(ce.gasLimit,32)),advisoryPhases:1,advisoryFailOpen:!1,policyId:se},rules:{guardEndBlock:0,maxFeePips:y.baseLpFeePips,snipeTaxPips:0,snipeFloorPips:0,snipeDecaySeconds:0,dynamicFeeSens:0,burnBps:0,lpBps:e.lpRewardsBps,potBps:0,royaltyBps:0,protocolShareBps:Number(E),potEveryNBuys:0,maxBuyQuoteAmount:0n,potMinBuyQuote:0n,royaltyTo:b,integrator:b},recapture:Y},v=BigInt(u.launchFee.amount);if(v>10000000000000000n)throw new o("Hookr launch fee exceeds the reviewed 0.01 ETH maximum.");let T=b;if(v&&(await V(i,t.number,[u.launchFee.treasury]),T=q(await c(i,u.launchFee.treasury,_(["function target() view returns (address)"]),"target",[],t.number)),T===b||T===g||T===r||T===He))throw new o("Hookr launch fee recipient is outside the reviewed payment profile.");let Z=v+(e.quote===b?h:0n),ee=[],C=[];if(e.quote!==b){let D=k(await c(i,e.quote,We,"allowance",[r,g],t.number));D!==0n&&D!==h&&C.push(a.approval(e.quote,g,"0",4663)),C.push(a.approval(e.quote,g,h.toString(),4663)),ee.push({token:e.quote,amount:h})}Z&&ee.push({token:be,amount:Z,to:g});let ke=`Launch public, permanent token ${JSON.stringify(e.token.name)} (${JSON.stringify(e.token.symbol)}), fixed supply ${Ae(e.token.supply,18)} (18 decimals). Create one agents-only pool (identity check on every buy). Price currency1/currency0 = ${e.sqrtPriceX96*e.sqrtPriceX96}/${1n<<192n}; sqrtPriceX96 ${e.sqrtPriceX96}, ticks ${e.tickLower} to ${e.tickUpper}, spacing ${y.tickSpacing}. Deposit at most ${e.amount0Max} currency0 and ${e.amount1Max} currency1 base units; exact launch debts ${e.debts.amount0} and ${e.debts.amount1}. Currency0 ${p.currency0}; currency1 ${p.currency1}. Launch fee ${v} wei to ${T} (${Ae(v,18)} ETH). Unused quote funding (${h-S} base units) and retained token supply (${e.token.supply-F} base units) return to ${r} in this transaction. Family owner ${r}; token ${s}; pool ${m}. LP base fee 3000 pips; gate flags 1, scores ${e.gateTerms.minScore}/${e.gateTerms.tierScore}, tier ${e.gateTerms.tierPips} pips; LP Rewards ${e.lpRewardsBps} bps; burn 0; quote-take cap ${J} pips (includes Hookr minimum); protocol share ${E} bps. Arb recapture ${e.arbRecapture}; deadline ${e.deadline}. No lock.`;C.push(a.unsignedTx({to:g,data:Qe({abi:f("launcherV1"),functionName:"launchAdvised",args:[e.token,I,[we],[_e(Je,[e.gateTerms])],e.deadline]}),value:Z.toString(),chainId:4663,description:ke}));let[fe,De,Ke]=await Promise.all([i.getCode({address:s}),i.getTransactionCount({address:s}),i.readContract({address:g,abi:ve,functionName:"launchFee"})]);if(fe&&fe!=="0x"||De!==0||k(H(Ke,5)[0])!==v)throw new o("Hookr collision state or launch fee changed. Request a fresh launch preview.");return await Le(i,t),{txs:C,inputs:ee,summary:ke,tokenAddress:s,poolId:m,feeTarget:T,feeTreasury:u.launchFee.treasury,terms:ie({request:n,blockNumber:t.number,blockHash:t.hash,owner:r,tokenAddress:s,poolId:m,poolKey:p,member:we,gateTerms:e.gateTerms,launchFee:v,feeTarget:T,feeTreasury:u.launchFee.treasury,hookrMinimumPips:G,exactApprovals:C.slice(0,-1),refunds:{quote:h-S,retainedSupply:e.token.supply-F},gasEstimate:null,gasEstimateReason:"The local sender estimates the ordered exact calls after funding approvals and confirms the gas limit and maximum fee.",lane:he,pins:K})}}function nt(a){if(!Array.isArray(a)||a.length<1||a.length>3)throw new o("Hookr launch requires only the locally reconstructed finite approvals and one launch transaction.");for(let n of a)A(n,["to","data","value","chainId","description"],["to","data","value","chainId","description"])}function mt(a,n){if(nt(a),a.length!==n.length||a.some((r,e)=>r.to.toLowerCase()!==n[e].to.toLowerCase()||r.data.toLowerCase()!==n[e].data.toLowerCase()||r.value!==n[e].value||r.chainId!==4663))throw new o("Hookr launch differs from the locally reconstructed exact parameters, approvals and funding.")}function ht(a){return[{name:Ge,inputSchema:ae,execute:async(n,r)=>{let e=await tt(a,n,r);return{txs:e.txs,preview:await a.preview(e.txs,r),terms:e.terms,summary:e.summary}}}]}export{Ge as a,g as b,z as c,ae as d,Ye as e,tt as f,nt as g,mt as h,ht as i};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as q,o as U}from"./3NJ5KQ3Q.js";import{a as ye}from"./RVDUSNWW.js";import{a as le,b as ue,c as me}from"./ZV5HIQXC.js";import{a as ce}from"./RUX3RY7Y.js";import{a as fe,b as pe}from"./XBE3B6Y2.js";import{e as F,h as O,m as de}from"./PV5FDT6O.js";import{b as se}from"./SPJCSEKP.js";import{a as B}from"./IOYRL6AY.js";import{c as ae}from"./VEQBHI6O.js";import{c as D,e as x,g as k,k as te,l as oe,m as re,n as ie}from"./NWNYJ26T.js";import{a as h,i as ne}from"./FWD4L3CJ.js";import{a as i}from"./XSD5NL7J.js";import{a as N}from"./JXOEJPJ4.js";import{decodeFunctionResult as Ie,encodeAbiParameters as j,encodeFunctionData as M,erc20Abi as J,isAddress as Pe,parseAbi as Ae,parseAbiParameters as V,toHex as W,zeroAddress as z}from"viem";var A=ne[h].clanker,he=Ae(["function deployToken(((address tokenAdmin,string name,string symbol,bytes32 salt,string image,string metadata,string context,uint256 originatingChainId) tokenConfig,(address hook,address pairedToken,int24 tickIfToken0IsClanker,int24 tickSpacing,bytes poolData) poolConfig,(address locker,address[] rewardAdmins,address[] rewardRecipients,uint16[] rewardBps,int24[] tickLower,int24[] tickUpper,uint16[] positionBps,bytes lockerData) lockerConfig,(address mevModule,bytes mevModuleData) mevModuleConfig,(address extension,uint256 msgValue,uint16 extensionBps,bytes extensionData)[] extensionConfigs) config) payable returns (address)","function tokenDeploymentInfo(address) view returns ((address,address,address,address[]))"]),T=Ae(["function availableFees(address,address) view returns (uint256)","function claim(address,address)","function collectRewards(address)","function mevModuleEnabled(bytes32) view returns (bool)","function mevModuleOperational(bytes32) returns (bool)"]),C={address:A.paired_weth.address,symbol:"WETH",decimals:18,chainId:h},Se="https://www.clanker.world/api/tokens",ge={type:"string",pattern:"^\\d+$"},be={type:"string",pattern:"^0x[0-9a-fA-F]{64}$"};function I(e){return oe(te(e,F),F)}function we(e,t){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new i(`Provide an explicit bytes32 ${t}.`);return e}function P(e,t,s=!1){if(e===void 0&&!s)return"";if(typeof e!="string"||s&&!e.trim())throw new i(`Provide ${t} as text.`);return e}function Z(e,t=256){return ie(e,`Amount exceeds the uint${t} range.`,{bits:t})}function G(e){return re(e,"The contract returned an invalid amount.").toString()}function L(e,t){let s=Object.keys(e).find(u=>!t.includes(u));if(s)throw new i(`Unsupported Clanker input: ${s}.`)}function ke(e,t){return t.changes.map(({token:s,amount:u})=>{let b=u.startsWith("-");return`${b?"-":"+"}${e.formatAmount(b?u.slice(1):u,s.decimals)} ${s.symbol} (${s.address}, chain ${s.chainId})`}).join("; ")}function ve(e){return x(e)&&Array.isArray(e.data)&&Number.isSafeInteger(e.total)&&Number(e.total)>=0&&Number.isSafeInteger(e.tokensDeployed)&&Number(e.tokensDeployed)>=0&&(e.cursor===null||e.cursor===void 0||typeof e.cursor=="string")&&e.data.every(t=>x(t)&&typeof t.name=="string"&&typeof t.symbol=="string"&&Number.isSafeInteger(t.chain_id)&&["contract_address","admin","msg_sender","factory_address"].every(s=>typeof t[s]=="string"&&Pe(t[s],{strict:!1})))}function K(e,t=0){return typeof e=="string"?N(e):e===null||typeof e=="boolean"?e:typeof e=="number"?Number.isFinite(e)?e:null:t>=4?null:Array.isArray(e)?e.slice(0,20).map(s=>K(s,t+1)):x(e)?Object.fromEntries(Object.entries(e).filter(([s])=>/^[A-Za-z0-9_]{1,40}$/.test(s)).slice(0,40).map(([s,u])=>[s,K(u,t+1)])):null}function _e(e){return{...K(e),contract_address:e.contract_address,admin:e.admin,msg_sender:e.msg_sender,chain_id:e.chain_id,factory_address:e.factory_address,name:N(e.name),symbol:N(e.symbol)}}function $e(e){try{if(typeof e!="string"||!/^[A-Za-z0-9_-]{1,256}={0,2}$/.test(e))throw new Error;let t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));if(!x(t)||typeof t.id!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z?$/.test(t.id)||!Number.isFinite(Date.parse(t.id)))throw new Error;return e}catch{throw new i("Use the cursor returned by the previous clanker_browse page.")}}async function Ne(e,t={}){L(t,["q","limit","cursor","deployer"]);let s=t.limit??10;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>20)throw new i("Choose an indexer limit from 1 to 20.");let u=new URL(Se);u.searchParams.set("chainId",String(h)),u.searchParams.set("limit",String(s)),t.q!==void 0&&u.searchParams.set("q",P(t.q,"search")),t.cursor!==void 0&&u.searchParams.set("cursor",P(t.cursor,"cursor",!0)),t.deployer!==void 0&&u.searchParams.set("msgSender",I(t.deployer));let b=await ae(e.http,u.toString(),{headers:{"User-Agent":"Oak-Clanker/1.0"}},ve);return{tokens:b.data.filter(S=>S.chain_id===h&&k(S.factory_address,A.factory.address)),total:b.total,cursor:b.cursor||null,tokensDeployed:b.tokensDeployed}}var De=e=>{let t=()=>e.clientFor(h),s=async n=>{try{return await n()}catch(o){throw new i(e.plainError(o))}},u=(n,o,a,c="0")=>e.unsignedTx({to:n,data:o,value:c,chainId:h,description:a}),b=async(n,o)=>G(await t().readContract({address:A.fee_locker.address,abi:T,functionName:"availableFees",args:[n,o]})),S=async n=>{if(k(n,C.address))return C;let[o,a]=await Promise.all([t().readContract({address:n,abi:J,functionName:"symbol"}),t().readContract({address:n,abi:J,functionName:"decimals"})]);if(typeof o!="string"||!o.trim()||!Number.isInteger(a)||a<0||a>255)throw new i("The contract returned invalid token metadata.");return{address:n,chainId:h,symbol:o,decimals:a}},Q=async n=>{n.cursor!==void 0&&$e(n.cursor);let o=await Ne(e,n);return{...o,tokens:o.tokens.map(_e)}},xe=async(n,o)=>{if(L(n,["name","symbol","salt","image","metadata","context","vanity","initialBuy","minAmountOut","slippageBps","rewards","vault","airdrop","feeBps","pool"]),n.vanity!==void 0&&n.vanity!==!1)throw new i("Clanker launches use vanity false and an explicit salt.");let a=P(n.name,"token name",!0),c=P(n.symbol,"token symbol",!0),g=we(n.salt,"salt"),y=Z(n.initialBuy??"0"),l=n.slippageBps??q;if(typeof l!="number")throw new i("Slippage must be an integer from 0 to 9999 bps.");U("0",l);let r=n.minAmountOut===void 0?void 0:Z(n.minAmountOut,128);if(r!==void 0&&r<=1n)throw new i("Initial-buy minimum must exceed one base unit.");if(!y&&r!==void 0)throw new i("A minimum requires a positive initial buy.");let m=ue(n,o);O(n.feeBps??100,0,1e3);let f=pe(n);if(y&&!k(f.poolConfig.pairedToken,C.address))throw new i("An initial ETH buy currently requires a WETH-paired pool. Launch without an initial buy and obtain a protected swap quote separately.");let d=n.rewards??[{admin:o,recipient:o,bps:1e4,feePreference:0}];if(!Array.isArray(d)||!d.length||d.length>7)throw new i("Provide one to seven reward allocations.");let w=d.map(p=>{if(!x(p))throw new i("Provide reward allocations as objects.");return L(p,["admin","recipient","bps","feePreference"]),{admin:I(p.admin),recipient:I(p.recipient),bps:O(p.bps,1,1e4),feePreference:O(p.feePreference??0,0,2)}});if(w.reduce((p,v)=>p+v.bps,0)!==1e4)throw new i("Reward allocations must total 10000 bps.");let _={tokenConfig:{tokenAdmin:o,name:a,symbol:c,salt:g,image:P(n.image,"image"),metadata:P(n.metadata,"metadata"),context:n.context===void 0?JSON.stringify({interface:"Oak",platform:"robinhood"}):P(n.context,"context"),originatingChainId:BigInt(h)},poolConfig:f.poolConfig,lockerConfig:{locker:A.locker.address,rewardAdmins:w.map(p=>p.admin),rewardRecipients:w.map(p=>p.recipient),rewardBps:w.map(p=>p.bps),tickLower:f.tickLower,tickUpper:f.tickUpper,positionBps:f.positionBps,lockerData:j(V("(uint8[])"),[[w.map(p=>p.feePreference)]])},mevModuleConfig:{mevModule:A.mev_module.address,mevModuleData:j(V("(uint24,uint24,uint256)"),[[666777,41673,15n]])},extensionConfigs:m},Ce=await t().simulateContract({address:A.factory.address,abi:he,functionName:"deployToken",args:[_],account:o,value:0n,gas:B}),E=I(Ce.result),X=p=>{let v=[...m,...y?[{extension:A.devbuy.address,msgValue:y,extensionBps:0,extensionData:j(V("(address,address,uint24,int24,address),uint128,address"),[[z,z,0,0,z],p,o])}]:[]];return u(A.factory.address,M({abi:he,functionName:"deployToken",args:[{..._,extensionConfigs:v}]}),`Launch ${a} (${c}); initial buy ${y} native ETH base units.`,y.toString())};if(y&&r===void 0){let v=(await e.preview([X(0n)],o)).changes.filter($=>$.token.chainId===h&&k($.token.address,E)&&$.token.decimals===18).reduce(($,ee)=>$+(/^-?\d+$/.test(ee.amount)?BigInt(ee.amount):(()=>{throw new i("Invalid initial-buy simulation amount.")})()),0n);if(v<=0n)throw new i("Initial-buy simulation returned no token output.");if(r=Z(U(v.toString(),l),128),r<=1n)throw new i("Initial-buy output is too small for a protected minimum.")}let Y=[X(r??0n)],H=await e.preview(Y,o);return{txs:Y,preview:H,predictedToken:E,token:{address:E,chainId:h,symbol:c,decimals:18},...r!==void 0?{minAmountOut:r.toString()}:{},summary:`Launch ${c} at ${E} (CREATE2 address predicted from simulation); vanity false; salt ${g}. Supply 100000000000000000000000000000 base units (18 decimals). ${f.feeSummary}; protocol adds 20% of LP fees. Pool and LP allocations: ${JSON.stringify(f)}. Reward allocations: ${JSON.stringify(w)}. Extensions: ${JSON.stringify({vault:n.vault,airdrop:n.airdrop})}. Sniper fees 666777 to 41673 over 15 seconds. ${H.summary} ${ke(e,H)}`}},Te=async(n,o)=>{if(L(n,["token","poolId","collect"]),n.collect!==void 0&&typeof n.collect!="boolean")throw new i("collect must be boolean.");if(n.collect===!1&&n.poolId!==void 0)throw new i("poolId requires collection.");if(n.collect===!0&&n.token===void 0)throw new i("Collection requires a Clanker token.");if(n.poolId!==void 0&&n.token===void 0)throw new i("A pool ID requires its Clanker token.");let a=[C],c=[];if(n.token!==void 0){let r=I(n.token);if(k(r,C.address))throw new i("Provide the launched Clanker token, not WETH.");if(n.collect!==!1){let m=await de(e,r),{poolId:f,hook:d,locker:w}=m;if(n.poolId!==void 0&&!k(we(n.poolId,"pool ID for fee collection"),f))throw new i("The supplied pool ID does not match the onchain Clanker pool.");k(m.pairedToken,C.address)||a.splice(0,1,await S(m.pairedToken));let _=await t().readContract({address:d,abi:T,functionName:"mevModuleEnabled",args:[f]});if(typeof _!="boolean")throw new i("The hook returned an invalid MEV guard state.");_&&c.push(u(d,M({abi:T,functionName:"mevModuleOperational",args:[f]}),"Update the Clanker pool MEV guard before collection.")),c.push(u(w,M({abi:T,functionName:"collectRewards",args:[r]}),"Collect pending LP fees into the fee locker."))}a.push(await S(r))}let g;if(c.length){if(await t().getChainId()!==h)throw new i("Fee simulation endpoint is on the wrong chain.");let r=[...c.map(d=>({from:o,gas:W(B),to:d.to,data:d.data,value:W(BigInt(d.value))})),...a.map(d=>({from:o,gas:W(B),to:A.fee_locker.address,data:M({abi:T,functionName:"availableFees",args:[o,d.address]}),value:"0x0"}))],m=await t().request({method:"eth_simulateV1",params:[{blockStateCalls:[{calls:r}],validation:!1,traceTransfers:!1},"latest"]},{retryCount:0});if(!Array.isArray(m)||m.length!==1||!x(m[0])||!Array.isArray(m[0].calls)||m[0].calls.length!==r.length)throw new i("The endpoint returned an unexpected fee simulation response.");let f=m[0].calls;if(!f.every(d=>x(d)&&d.status==="0x1"&&!d.error))throw new i("Clanker fee collection simulation failed.");g=f.slice(c.length).map(d=>{if(!x(d)||typeof d.returnData!="string"||!/^0x[0-9a-fA-F]{64}$/.test(d.returnData))throw new i("The endpoint returned an invalid fee balance.");return G(Ie({abi:T,functionName:"availableFees",data:d.returnData}))})}else g=await Promise.all(a.map(r=>b(o,r.address)));let y=a.flatMap((r,m)=>BigInt(g[m])>0n?[{token:r,amount:g[m]}]:[]);if(!y.length)throw new i("No claimable fees for this wallet; pending LP fees may require the MEV window to end.");for(let{token:r}of y)c.push(u(A.fee_locker.address,M({abi:T,functionName:"claim",args:[o,r.address]}),`Claim ${r.symbol} fees to ${o}.`));let l=await e.preview(c,o);return{txs:c,preview:l,fees:y,summary:`Claim fees to ${o}. WETH fees aggregate across all Clanker launches for this recipient. ${l.summary} ${ke(e,l)}`}},R=(n,o,a,c)=>({name:`clanker_${n}`,inputSchema:{type:"object",properties:o,required:a,additionalProperties:!1},execute:(g,y)=>s(async()=>c(g,I(y)))});return{tools:[R("launch",{name:{type:"string"},symbol:{type:"string"},salt:be,image:{type:"string"},metadata:{type:"string"},context:{type:"string"},vanity:{const:!1},initialBuy:{...ge,description:"Native ETH base units, 18 decimals."},minAmountOut:{...ge,description:"Minimum new token base units, 18 decimals; derived from simulation when omitted."},slippageBps:{type:"integer",minimum:0,maximum:9999,default:q},feeBps:{type:"integer",minimum:0,maximum:1e3,default:100},pool:fe,rewards:{type:"array",minItems:1,maxItems:7,items:{type:"object",properties:{admin:D,recipient:D,bps:{type:"integer",minimum:1,maximum:1e4},feePreference:{type:"integer",minimum:0,maximum:2}},required:["admin","recipient","bps"],additionalProperties:!1}},...le},["name","symbol","salt"],async(n,o)=>{let a=await xe(n,o);return{...a,summary:`${a.summary} After the launch is mined, use clanker_status to inspect ${a.predictedToken} and clanker_claim to collect creator fees.`}}),R("claim",{token:{...D,description:"Launched token; derives its onchain pool and collects pending LP fees before claiming."},poolId:{...be,description:"Optional assertion against the derived pool ID."},collect:{type:"boolean",default:!0,description:"Set false to claim only already-collected fees."}},[],Te),R("browse",{q:{type:"string"},limit:{type:"integer",minimum:1,maximum:20},cursor:{type:"string"},deployer:D},[],Q)],positions:n=>s(async()=>{I(n);let o=new Map,a=new Set,c;do{let l=await Q({deployer:n,limit:20,...c?{cursor:c}:{}});for(let r of l.tokens)k(r.msg_sender,n)&&o.set(r.contract_address.toLowerCase(),r);if(l.cursor&&a.has(l.cursor))throw new i("The Clanker indexer repeated a pagination cursor.");l.cursor&&a.add(l.cursor),c=l.cursor??void 0}while(c);let g=[],y=[C];for(let[l,r]of o){let m=await S(r.contract_address),f={...m,symbol:N(m.symbol)},d=G(await t().readContract({address:f.address,abi:J,functionName:"balanceOf",args:[n]}));g.push({module:"clanker",id:`launch:${l}`,chainId:h,assets:[{token:f,amount:d}],description:`Indexed launch ${r.name}; wallet token balance, not locked LP principal.`}),y.some(w=>k(w.address,f.address))||y.push(f)}for(let l of y){let r=await b(n,l.address);BigInt(r)>0n&&g.push({module:"clanker",id:`fees:${l.address.toLowerCase()}`,chainId:h,assets:[{token:l,amount:r}],description:"Collected fees across launches for this recipient. Pending LP fees excluded; token-side discovery covers indexed launches by this wallet."})}return g})}},ze=e=>se("clanker",[De(e),ce(e),me(e),ye(e)]);export{Ne as a,De as b,ze as c};
|
|
1
|
+
import{b as q,o as U}from"./BOVMED7R.js";import{a as ce}from"./RUX3RY7Y.js";import{a as fe,b as pe}from"./XBE3B6Y2.js";import{a as ye}from"./RVDUSNWW.js";import{a as le,b as ue,c as me}from"./ZV5HIQXC.js";import{e as F,h as O,m as de}from"./PV5FDT6O.js";import{b as se}from"./SPJCSEKP.js";import{a as B}from"./IOYRL6AY.js";import{c as ae}from"./VEQBHI6O.js";import{c as D,e as x,g as k,k as te,l as oe,m as re,n as ie}from"./NWNYJ26T.js";import{a as h,i as ne}from"./FWD4L3CJ.js";import{a as i}from"./XSD5NL7J.js";import{a as N}from"./JXOEJPJ4.js";import{decodeFunctionResult as Ie,encodeAbiParameters as j,encodeFunctionData as M,erc20Abi as J,isAddress as Pe,parseAbi as Ae,parseAbiParameters as V,toHex as W,zeroAddress as z}from"viem";var A=ne[h].clanker,he=Ae(["function deployToken(((address tokenAdmin,string name,string symbol,bytes32 salt,string image,string metadata,string context,uint256 originatingChainId) tokenConfig,(address hook,address pairedToken,int24 tickIfToken0IsClanker,int24 tickSpacing,bytes poolData) poolConfig,(address locker,address[] rewardAdmins,address[] rewardRecipients,uint16[] rewardBps,int24[] tickLower,int24[] tickUpper,uint16[] positionBps,bytes lockerData) lockerConfig,(address mevModule,bytes mevModuleData) mevModuleConfig,(address extension,uint256 msgValue,uint16 extensionBps,bytes extensionData)[] extensionConfigs) config) payable returns (address)","function tokenDeploymentInfo(address) view returns ((address,address,address,address[]))"]),T=Ae(["function availableFees(address,address) view returns (uint256)","function claim(address,address)","function collectRewards(address)","function mevModuleEnabled(bytes32) view returns (bool)","function mevModuleOperational(bytes32) returns (bool)"]),C={address:A.paired_weth.address,symbol:"WETH",decimals:18,chainId:h},Se="https://www.clanker.world/api/tokens",ge={type:"string",pattern:"^\\d+$"},be={type:"string",pattern:"^0x[0-9a-fA-F]{64}$"};function I(e){return oe(te(e,F),F)}function we(e,t){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new i(`Provide an explicit bytes32 ${t}.`);return e}function P(e,t,s=!1){if(e===void 0&&!s)return"";if(typeof e!="string"||s&&!e.trim())throw new i(`Provide ${t} as text.`);return e}function Z(e,t=256){return ie(e,`Amount exceeds the uint${t} range.`,{bits:t})}function G(e){return re(e,"The contract returned an invalid amount.").toString()}function L(e,t){let s=Object.keys(e).find(u=>!t.includes(u));if(s)throw new i(`Unsupported Clanker input: ${s}.`)}function ke(e,t){return t.changes.map(({token:s,amount:u})=>{let b=u.startsWith("-");return`${b?"-":"+"}${e.formatAmount(b?u.slice(1):u,s.decimals)} ${s.symbol} (${s.address}, chain ${s.chainId})`}).join("; ")}function ve(e){return x(e)&&Array.isArray(e.data)&&Number.isSafeInteger(e.total)&&Number(e.total)>=0&&Number.isSafeInteger(e.tokensDeployed)&&Number(e.tokensDeployed)>=0&&(e.cursor===null||e.cursor===void 0||typeof e.cursor=="string")&&e.data.every(t=>x(t)&&typeof t.name=="string"&&typeof t.symbol=="string"&&Number.isSafeInteger(t.chain_id)&&["contract_address","admin","msg_sender","factory_address"].every(s=>typeof t[s]=="string"&&Pe(t[s],{strict:!1})))}function K(e,t=0){return typeof e=="string"?N(e):e===null||typeof e=="boolean"?e:typeof e=="number"?Number.isFinite(e)?e:null:t>=4?null:Array.isArray(e)?e.slice(0,20).map(s=>K(s,t+1)):x(e)?Object.fromEntries(Object.entries(e).filter(([s])=>/^[A-Za-z0-9_]{1,40}$/.test(s)).slice(0,40).map(([s,u])=>[s,K(u,t+1)])):null}function _e(e){return{...K(e),contract_address:e.contract_address,admin:e.admin,msg_sender:e.msg_sender,chain_id:e.chain_id,factory_address:e.factory_address,name:N(e.name),symbol:N(e.symbol)}}function $e(e){try{if(typeof e!="string"||!/^[A-Za-z0-9_-]{1,256}={0,2}$/.test(e))throw new Error;let t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));if(!x(t)||typeof t.id!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z?$/.test(t.id)||!Number.isFinite(Date.parse(t.id)))throw new Error;return e}catch{throw new i("Use the cursor returned by the previous clanker_browse page.")}}async function Ne(e,t={}){L(t,["q","limit","cursor","deployer"]);let s=t.limit??10;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>20)throw new i("Choose an indexer limit from 1 to 20.");let u=new URL(Se);u.searchParams.set("chainId",String(h)),u.searchParams.set("limit",String(s)),t.q!==void 0&&u.searchParams.set("q",P(t.q,"search")),t.cursor!==void 0&&u.searchParams.set("cursor",P(t.cursor,"cursor",!0)),t.deployer!==void 0&&u.searchParams.set("msgSender",I(t.deployer));let b=await ae(e.http,u.toString(),{headers:{"User-Agent":"Oak-Clanker/1.0"}},ve);return{tokens:b.data.filter(S=>S.chain_id===h&&k(S.factory_address,A.factory.address)),total:b.total,cursor:b.cursor||null,tokensDeployed:b.tokensDeployed}}var De=e=>{let t=()=>e.clientFor(h),s=async n=>{try{return await n()}catch(o){throw new i(e.plainError(o))}},u=(n,o,a,c="0")=>e.unsignedTx({to:n,data:o,value:c,chainId:h,description:a}),b=async(n,o)=>G(await t().readContract({address:A.fee_locker.address,abi:T,functionName:"availableFees",args:[n,o]})),S=async n=>{if(k(n,C.address))return C;let[o,a]=await Promise.all([t().readContract({address:n,abi:J,functionName:"symbol"}),t().readContract({address:n,abi:J,functionName:"decimals"})]);if(typeof o!="string"||!o.trim()||!Number.isInteger(a)||a<0||a>255)throw new i("The contract returned invalid token metadata.");return{address:n,chainId:h,symbol:o,decimals:a}},Q=async n=>{n.cursor!==void 0&&$e(n.cursor);let o=await Ne(e,n);return{...o,tokens:o.tokens.map(_e)}},xe=async(n,o)=>{if(L(n,["name","symbol","salt","image","metadata","context","vanity","initialBuy","minAmountOut","slippageBps","rewards","vault","airdrop","feeBps","pool"]),n.vanity!==void 0&&n.vanity!==!1)throw new i("Clanker launches use vanity false and an explicit salt.");let a=P(n.name,"token name",!0),c=P(n.symbol,"token symbol",!0),g=we(n.salt,"salt"),y=Z(n.initialBuy??"0"),l=n.slippageBps??q;if(typeof l!="number")throw new i("Slippage must be an integer from 0 to 9999 bps.");U("0",l);let r=n.minAmountOut===void 0?void 0:Z(n.minAmountOut,128);if(r!==void 0&&r<=1n)throw new i("Initial-buy minimum must exceed one base unit.");if(!y&&r!==void 0)throw new i("A minimum requires a positive initial buy.");let m=ue(n,o);O(n.feeBps??100,0,1e3);let f=pe(n);if(y&&!k(f.poolConfig.pairedToken,C.address))throw new i("An initial ETH buy currently requires a WETH-paired pool. Launch without an initial buy and obtain a protected swap quote separately.");let d=n.rewards??[{admin:o,recipient:o,bps:1e4,feePreference:0}];if(!Array.isArray(d)||!d.length||d.length>7)throw new i("Provide one to seven reward allocations.");let w=d.map(p=>{if(!x(p))throw new i("Provide reward allocations as objects.");return L(p,["admin","recipient","bps","feePreference"]),{admin:I(p.admin),recipient:I(p.recipient),bps:O(p.bps,1,1e4),feePreference:O(p.feePreference??0,0,2)}});if(w.reduce((p,v)=>p+v.bps,0)!==1e4)throw new i("Reward allocations must total 10000 bps.");let _={tokenConfig:{tokenAdmin:o,name:a,symbol:c,salt:g,image:P(n.image,"image"),metadata:P(n.metadata,"metadata"),context:n.context===void 0?JSON.stringify({interface:"Oak",platform:"robinhood"}):P(n.context,"context"),originatingChainId:BigInt(h)},poolConfig:f.poolConfig,lockerConfig:{locker:A.locker.address,rewardAdmins:w.map(p=>p.admin),rewardRecipients:w.map(p=>p.recipient),rewardBps:w.map(p=>p.bps),tickLower:f.tickLower,tickUpper:f.tickUpper,positionBps:f.positionBps,lockerData:j(V("(uint8[])"),[[w.map(p=>p.feePreference)]])},mevModuleConfig:{mevModule:A.mev_module.address,mevModuleData:j(V("(uint24,uint24,uint256)"),[[666777,41673,15n]])},extensionConfigs:m},Ce=await t().simulateContract({address:A.factory.address,abi:he,functionName:"deployToken",args:[_],account:o,value:0n,gas:B}),E=I(Ce.result),X=p=>{let v=[...m,...y?[{extension:A.devbuy.address,msgValue:y,extensionBps:0,extensionData:j(V("(address,address,uint24,int24,address),uint128,address"),[[z,z,0,0,z],p,o])}]:[]];return u(A.factory.address,M({abi:he,functionName:"deployToken",args:[{..._,extensionConfigs:v}]}),`Launch ${a} (${c}); initial buy ${y} native ETH base units.`,y.toString())};if(y&&r===void 0){let v=(await e.preview([X(0n)],o)).changes.filter($=>$.token.chainId===h&&k($.token.address,E)&&$.token.decimals===18).reduce(($,ee)=>$+(/^-?\d+$/.test(ee.amount)?BigInt(ee.amount):(()=>{throw new i("Invalid initial-buy simulation amount.")})()),0n);if(v<=0n)throw new i("Initial-buy simulation returned no token output.");if(r=Z(U(v.toString(),l),128),r<=1n)throw new i("Initial-buy output is too small for a protected minimum.")}let Y=[X(r??0n)],H=await e.preview(Y,o);return{txs:Y,preview:H,predictedToken:E,token:{address:E,chainId:h,symbol:c,decimals:18},...r!==void 0?{minAmountOut:r.toString()}:{},summary:`Launch ${c} at ${E} (CREATE2 address predicted from simulation); vanity false; salt ${g}. Supply 100000000000000000000000000000 base units (18 decimals). ${f.feeSummary}; protocol adds 20% of LP fees. Pool and LP allocations: ${JSON.stringify(f)}. Reward allocations: ${JSON.stringify(w)}. Extensions: ${JSON.stringify({vault:n.vault,airdrop:n.airdrop})}. Sniper fees 666777 to 41673 over 15 seconds. ${H.summary} ${ke(e,H)}`}},Te=async(n,o)=>{if(L(n,["token","poolId","collect"]),n.collect!==void 0&&typeof n.collect!="boolean")throw new i("collect must be boolean.");if(n.collect===!1&&n.poolId!==void 0)throw new i("poolId requires collection.");if(n.collect===!0&&n.token===void 0)throw new i("Collection requires a Clanker token.");if(n.poolId!==void 0&&n.token===void 0)throw new i("A pool ID requires its Clanker token.");let a=[C],c=[];if(n.token!==void 0){let r=I(n.token);if(k(r,C.address))throw new i("Provide the launched Clanker token, not WETH.");if(n.collect!==!1){let m=await de(e,r),{poolId:f,hook:d,locker:w}=m;if(n.poolId!==void 0&&!k(we(n.poolId,"pool ID for fee collection"),f))throw new i("The supplied pool ID does not match the onchain Clanker pool.");k(m.pairedToken,C.address)||a.splice(0,1,await S(m.pairedToken));let _=await t().readContract({address:d,abi:T,functionName:"mevModuleEnabled",args:[f]});if(typeof _!="boolean")throw new i("The hook returned an invalid MEV guard state.");_&&c.push(u(d,M({abi:T,functionName:"mevModuleOperational",args:[f]}),"Update the Clanker pool MEV guard before collection.")),c.push(u(w,M({abi:T,functionName:"collectRewards",args:[r]}),"Collect pending LP fees into the fee locker."))}a.push(await S(r))}let g;if(c.length){if(await t().getChainId()!==h)throw new i("Fee simulation endpoint is on the wrong chain.");let r=[...c.map(d=>({from:o,gas:W(B),to:d.to,data:d.data,value:W(BigInt(d.value))})),...a.map(d=>({from:o,gas:W(B),to:A.fee_locker.address,data:M({abi:T,functionName:"availableFees",args:[o,d.address]}),value:"0x0"}))],m=await t().request({method:"eth_simulateV1",params:[{blockStateCalls:[{calls:r}],validation:!1,traceTransfers:!1},"latest"]},{retryCount:0});if(!Array.isArray(m)||m.length!==1||!x(m[0])||!Array.isArray(m[0].calls)||m[0].calls.length!==r.length)throw new i("The endpoint returned an unexpected fee simulation response.");let f=m[0].calls;if(!f.every(d=>x(d)&&d.status==="0x1"&&!d.error))throw new i("Clanker fee collection simulation failed.");g=f.slice(c.length).map(d=>{if(!x(d)||typeof d.returnData!="string"||!/^0x[0-9a-fA-F]{64}$/.test(d.returnData))throw new i("The endpoint returned an invalid fee balance.");return G(Ie({abi:T,functionName:"availableFees",data:d.returnData}))})}else g=await Promise.all(a.map(r=>b(o,r.address)));let y=a.flatMap((r,m)=>BigInt(g[m])>0n?[{token:r,amount:g[m]}]:[]);if(!y.length)throw new i("No claimable fees for this wallet; pending LP fees may require the MEV window to end.");for(let{token:r}of y)c.push(u(A.fee_locker.address,M({abi:T,functionName:"claim",args:[o,r.address]}),`Claim ${r.symbol} fees to ${o}.`));let l=await e.preview(c,o);return{txs:c,preview:l,fees:y,summary:`Claim fees to ${o}. WETH fees aggregate across all Clanker launches for this recipient. ${l.summary} ${ke(e,l)}`}},R=(n,o,a,c)=>({name:`clanker_${n}`,inputSchema:{type:"object",properties:o,required:a,additionalProperties:!1},execute:(g,y)=>s(async()=>c(g,I(y)))});return{tools:[R("launch",{name:{type:"string"},symbol:{type:"string"},salt:be,image:{type:"string"},metadata:{type:"string"},context:{type:"string"},vanity:{const:!1},initialBuy:{...ge,description:"Native ETH base units, 18 decimals."},minAmountOut:{...ge,description:"Minimum new token base units, 18 decimals; derived from simulation when omitted."},slippageBps:{type:"integer",minimum:0,maximum:9999,default:q},feeBps:{type:"integer",minimum:0,maximum:1e3,default:100},pool:fe,rewards:{type:"array",minItems:1,maxItems:7,items:{type:"object",properties:{admin:D,recipient:D,bps:{type:"integer",minimum:1,maximum:1e4},feePreference:{type:"integer",minimum:0,maximum:2}},required:["admin","recipient","bps"],additionalProperties:!1}},...le},["name","symbol","salt"],async(n,o)=>{let a=await xe(n,o);return{...a,summary:`${a.summary} After the launch is mined, use clanker_status to inspect ${a.predictedToken} and clanker_claim to collect creator fees.`}}),R("claim",{token:{...D,description:"Launched token; derives its onchain pool and collects pending LP fees before claiming."},poolId:{...be,description:"Optional assertion against the derived pool ID."},collect:{type:"boolean",default:!0,description:"Set false to claim only already-collected fees."}},[],Te),R("browse",{q:{type:"string"},limit:{type:"integer",minimum:1,maximum:20},cursor:{type:"string"},deployer:D},[],Q)],positions:n=>s(async()=>{I(n);let o=new Map,a=new Set,c;do{let l=await Q({deployer:n,limit:20,...c?{cursor:c}:{}});for(let r of l.tokens)k(r.msg_sender,n)&&o.set(r.contract_address.toLowerCase(),r);if(l.cursor&&a.has(l.cursor))throw new i("The Clanker indexer repeated a pagination cursor.");l.cursor&&a.add(l.cursor),c=l.cursor??void 0}while(c);let g=[],y=[C];for(let[l,r]of o){let m=await S(r.contract_address),f={...m,symbol:N(m.symbol)},d=G(await t().readContract({address:f.address,abi:J,functionName:"balanceOf",args:[n]}));g.push({module:"clanker",id:`launch:${l}`,chainId:h,assets:[{token:f,amount:d}],description:`Indexed launch ${r.name}; wallet token balance, not locked LP principal.`}),y.some(w=>k(w.address,f.address))||y.push(f)}for(let l of y){let r=await b(n,l.address);BigInt(r)>0n&&g.push({module:"clanker",id:`fees:${l.address.toLowerCase()}`,chainId:h,assets:[{token:l,amount:r}],description:"Collected fees across launches for this recipient. Pending LP fees excluded; token-side discovery covers indexed launches by this wallet."})}return g})}},ze=e=>se("clanker",[De(e),ce(e),me(e),ye(e)]);export{Ne as a,De as b,ze as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as x}from"./
|
|
1
|
+
import{a as x}from"./BBTPRZ6T.js";import{b as M}from"./4I3OU56B.js";import{c as V}from"./MOE3EVAL.js";import{c as B}from"./6I4NTKB2.js";import{k as F}from"./PSBQWDYI.js";import{c as P}from"./TVWMTMEF.js";import{a as _}from"./A3PN3PK3.js";import{b as O,o as R}from"./BOVMED7R.js";import{b as I}from"./SPJCSEKP.js";import{a as S}from"./43LI5NKJ.js";import{a as H}from"./66F5ZH34.js";import{g as A,m as G,n as W}from"./NWNYJ26T.js";import{a as c,i as N}from"./FWD4L3CJ.js";import{a as u}from"./XSD5NL7J.js";import{encodeFunctionData as L,getAddress as b,parseAbi as z}from"viem";var m=z(["function asset() view returns (address)","function decimals() view returns (uint8)","function totalAssets() view returns (uint256)","function performanceFee() view returns (uint256)","function managementFee() view returns (uint256)","function balanceOf(address) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function previewRedeem(uint256 shares) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256 shares)","function redeem(uint256 shares,address receiver,address owner) returns (uint256 assets)"]),Q=z(["function deposit() payable"]),p=N[c],T=[{key:"core",name:"Longbow Core USDG",vault:p.vaults.longbowCore.address,asset:p.tokens.USDG.address,symbol:"USDG",decimals:6},{key:"frontier",name:"Longbow Frontier USDG",vault:p.vaults.longbowFrontier.address,asset:p.tokens.USDG.address,symbol:"USDG",decimals:6},{key:"eth",name:"Longbow ETH",vault:p.vaults.longbowEth.address,asset:p.tokens.WETH.address,symbol:"WETH",decimals:18}],D=[{key:"v1-usdg",name:"Longbow USDG Core V1 (legacy)",vault:b("0x8cb8AA35228c96C1C4E956E69AbAEBCc2aA7Dcfe"),asset:p.tokens.USDG.address,symbol:"USDG",decimals:6},{key:"v1-weth",name:"Longbow WETH Core V1 (legacy)",vault:b("0x93777a9b917be3c8259c84456222f43a01dd6492"),asset:p.tokens.WETH.address,symbol:"WETH",decimals:18}];function j(s,i){return W(s,`${i} must be positive and within the uint256 range.`,{notString:`${i} must be a positive integer string in base units.`,positive:!0})}function h(s){return G(s,"Longbow returned an invalid integer response.")}function q(s,i=!1){if(typeof s!="string")throw new u("Provide the address of a current Longbow vault.");let w=D.find(y=>A(y.vault,s));if(w&&!i)throw new u("Longbow V1 vaults are withdraw-only; deposit into a current V2 vault from longbow_list instead.");let g=w??T.find(y=>A(y.vault,s));if(!g)throw new u("Provide the address of a current Longbow vault, or a Longbow V1 vault to withdraw from. Other vaults are not supported.");return g}function C(s,i){if(Object.keys(s).some(w=>!i.includes(w)))throw new u("Unsupported Longbow input. Use the fields in the tool schema.")}var X=s=>{async function i(e){try{return await e()}catch(t){throw new u(s.plainError(t))}}async function w(){let e=s.clientFor(c);if(await e.getChainId()!==c)throw new u("Longbow requires a client on chain 4663.");return e}async function g(e,t){let[o,r,a,n]=await Promise.all([e.readContract({address:t.vault,abi:m,functionName:"asset"}),e.readContract({address:t.vault,abi:m,functionName:"decimals"}),e.readContract({address:t.asset,abi:m,functionName:"decimals"}),_(e,t.vault)]);if(typeof o!="string"||!A(o,t.asset))throw new u("Longbow vault asset does not match the recorded deployment.");if(r!==18||a!==t.decimals)throw new u("Longbow token decimals do not match the recorded deployment.");return{vault:t.vault,key:t.key,name:t.name,asset:{address:b(t.asset),symbol:t.symbol,decimals:a,chainId:c},share:{address:t.vault,symbol:n,decimals:r,chainId:c}}}async function y(e,t,o,r){let a=R(o.amount,O);if(BigInt(a)===0n)throw new u("The expected output is too small for a nonzero simulation minimum.");let n=await s.preview(e,t);if(n.changes.filter(l=>l.token.chainId===o.token.chainId&&A(l.token.address,o.token.address)&&l.token.decimals===o.token.decimals).reduce((l,v)=>l+BigInt(v.amount),0n)<BigInt(a))throw new u("Longbow simulated output is below the expected minimum.");let d=n.changes.map(({token:l,amount:v})=>{let U=v.startsWith("-");return`${U?"-":"+"}${s.formatAmount(U?v.slice(1):v,l.decimals)} ${l.symbol} (${l.address}, chain ${l.chainId})`}).join("; ");return{txs:e,preview:n,expectedOutput:o,minimumOutput:{token:o.token,amount:a},minimumEnforcedOnchain:!1,summary:`${r} ${d}. Simulation only; no on-chain minimum is enforced by these ERC-4626 calls. ${n.summary}`}}async function Y(e){C(e,[]);let t=await w();return Promise.all(T.map(async o=>{let[r,a,n,f]=await Promise.all([g(t,o),t.readContract({address:o.vault,abi:m,functionName:"totalAssets"}),t.readContract({address:o.vault,abi:m,functionName:"performanceFee"}),t.readContract({address:o.vault,abi:m,functionName:"managementFee"})]);return{...r,totalAssets:{token:r.asset,amount:h(a).toString()},fees:{performanceFeeE18:h(n).toString(),managementFeeE18:h(f).toString()},caveat:"Morpho V2 max views can be zero even when writes succeed. Simulate the requested action; listing does not prove availability."}}))}async function K(e,t){C(e,["vault","amount","wrapEth"]),S(t);let o=q(e.vault),r=j(e.amount,"Deposit amount");if(e.wrapEth!==void 0&&typeof e.wrapEth!="boolean")throw new u("wrapEth must be a boolean.");if(e.wrapEth&&!A(o.asset,p.tokens.WETH.address))throw new u("Only a WETH vault accepts explicit ETH wrapping.");let a=await w(),n=await g(a,o),f=h(await a.readContract({address:n.vault,abi:m,functionName:"previewDeposit",args:[r]})),d=[];return e.wrapEth&&d.push(s.unsignedTx({to:n.asset.address,data:L({abi:Q,functionName:"deposit"}),value:r.toString(),chainId:c,description:`Wrap ${s.formatAmount(r.toString(),18)} ETH into WETH for ${n.name}.`})),d.push(s.approval(n.asset.address,n.vault,r.toString(),c)),d.push(s.unsignedTx({to:n.vault,data:L({abi:m,functionName:"deposit",args:[r,b(t)]}),value:"0",chainId:c,description:`Deposit ${s.formatAmount(r.toString(),n.asset.decimals)} ${n.asset.symbol} into ${n.name}.`})),y(d,t,{token:n.share,amount:f.toString()},`Deposit into ${n.name}.`)}async function J(e,t){C(e,["vault","shares"]),S(t);let o=q(e.vault,!0),r=e.shares==="all"?void 0:j(e.shares,"Redeem shares"),a=await w(),n=await g(a,o),f=h(await a.readContract({address:n.vault,abi:m,functionName:"balanceOf",args:[t]})),d=r??f;if(d===0n||d>f)throw new u("The wallet has insufficient Longbow shares for this redemption.");let l=h(await a.readContract({address:n.vault,abi:m,functionName:"previewRedeem",args:[d]})),v=[s.unsignedTx({to:n.vault,data:L({abi:m,functionName:"redeem",args:[d,b(t),b(t)]}),value:"0",chainId:c,description:`Redeem ${s.formatAmount(d.toString(),n.share.decimals)} shares from ${n.name} into ${n.asset.symbol}.`})];return y(v,t,{token:n.asset,amount:l.toString()},`Redeem from ${n.name}.`)}let E={type:"string",enum:T.map(e=>e.vault),description:"Current vault address on chain 4663."},$=H("Positive integer base units, never a human-unit decimal."),k=(e,t,o,r)=>({name:e,inputSchema:{type:"object",description:e==="longbow_deposit"?"Deposit the selected vault\u2019s USDG (6 decimals) or WETH (18 decimals) in base units for shares. Exit with longbow_withdraw; check positions after confirmation.":e==="longbow_withdraw"?"Redeem shares in 18-decimal base units, or shares all for a full exit. Returns USDG or WETH according to the selected vault.":"List current Longbow vault assets and shares; exit existing shares with longbow_withdraw.",properties:t,required:o,additionalProperties:!1},execute:(a,n)=>i(()=>r(a,n))});return{tools:[k("longbow_list",{},[],Y),k("longbow_deposit",{vault:E,amount:$,wrapEth:{type:"boolean",default:!1,description:"Explicitly wrap this amount of native ETH before depositing into the WETH vault."}},["vault","amount"],K),k("longbow_withdraw",{vault:{...E,enum:[...E.enum,...D.map(e=>e.vault)],description:"Current vault address, or a Longbow V1 vault (withdraw-only) on chain 4663."},shares:{anyOf:[$,{const:"all"}],description:"Share base units (18 decimals), or all for the fresh wallet share balance. Returns the underlying asset, including WETH."}},["vault","shares"],J)],positions:e=>i(async()=>{S(e);let t=await w();return(await Promise.all([...T,...D].map(async r=>{let a=await g(t,r),n=h(await t.readContract({address:a.vault,abi:m,functionName:"balanceOf",args:[e]}));if(n===0n)return[];let f=h(await t.readContract({address:a.vault,abi:m,functionName:"previewRedeem",args:[n]}));return[{module:"longbow",id:`${c}:${a.vault.toLowerCase()}`,chainId:c,assets:[{token:a.asset,amount:f.toString()}],description:`${a.name}: ${s.formatAmount(n.toString(),a.share.decimals)} shares (${a.share.address}, ${a.share.decimals} decimals). Underlying is a preview, not a guaranteed redemption.`}]}))).flat()})}};function he(s){return I("longbow",[X(s),P(s),F(s),B(s),M(s),V(s),{tools:x(s,"longbow",T.map(i=>({vault:i.vault,asset:{address:b(i.asset),symbol:i.symbol,decimals:i.decimals,chainId:c}})))}])}export{D as a,X as b,he as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as Z,c as z,d as J,e as K}from"./
|
|
1
|
+
import{a as H}from"./CDPSMI3Z.js";import{b as Z,c as z,d as J,e as K}from"./QBIY6FQN.js";import{a as W}from"./C7AXJHBT.js";import{a as j}from"./K3RDPI5J.js";import{a as L}from"./A3PN3PK3.js";import{c as V}from"./7WSHW7KW.js";import{b as $,o as q}from"./BOVMED7R.js";import{b as _}from"./SPJCSEKP.js";import{a as x,d as I,e as B}from"./43LI5NKJ.js";import{a as P}from"./66F5ZH34.js";import{g as A,m as R,n as E}from"./NWNYJ26T.js";import{a as h,d as F,i as N,j as S}from"./FWD4L3CJ.js";import{a as o}from"./XSD5NL7J.js";import{getAddress as O,parseAbi as te}from"viem";var n=O(N[4663].vaults.groveAlm.address),ne="0x29626c2d8ca49a51e4deceec5499e52983c42bd5",m=te(["function asset() view returns (address)","function decimals() view returns (uint8)","function totalAssets() view returns (uint256)","function totalSupply() view returns (uint256)","function balanceOf(address) view returns (uint256)","function maxDeposit(address) view returns (uint256)","function maxWithdraw(address) view returns (uint256)","function previewDeposit(uint256) view returns (uint256)","function previewRedeem(uint256) view returns (uint256)","function performanceFee() view returns (uint256)","function managementFee() view returns (uint256)"]),T=P("Positive integer in token base units."),U={type:"string",description:`Public Grove vault only: ${n}. Defaults to this vault.`},Q={type:"integer",minimum:0,maximum:9999,default:$};function C(t){return E(t,"Amount must be positive and within the uint256 range.",{notString:"Amount must be a positive integer string in base units.",positive:!0})}function v(t){return R(t,"Grove returned an invalid integer read.")}function M(t,d,l){if(x(d),Object.keys(t).some(u=>!["vault",...l].includes(u)))throw new o("Unsupported Grove argument.");if(t.vault!==void 0){if(typeof t.vault!="string")throw new o("Provide the public Grove vault address.");if(t.vault.toLowerCase()===ne)throw new o("The Grove ALM proxy is allocator infrastructure, not the public ERC-4626 vault.");if(x(t.vault),!A(t.vault,n))throw new o("Only the public Grove ERC-4626 vault is supported.")}}function X(t,d,l){let u=l===void 0?$:l;if(typeof u!="number")throw new o("Slippage must be an integer from 0 to 9999 bps.");let e=BigInt(q(t.toString(),u)),a=d===void 0?e:C(d);if(a<=0n||a>t)throw new o("The minimum output must be positive and no greater than the quoted output.");return a}function Y(t,d){let l=0n;for(let u of t.changes)if(!(u.token.chainId!==d.chainId||!A(u.token.address,d.address))){if(u.token.decimals!==d.decimals||typeof u.amount!="string"||!/^-?\d+$/.test(u.amount))throw new o("Grove preview returned invalid token metadata or amounts.");l+=BigInt(u.amount)}return l}var ae=t=>{async function d(e){try{return await e()}catch(a){throw new o(t.plainError(a))}}async function l(){let e=t.clientFor(h);if(await e.getChainId()!==h)throw new o("Grove requires an RPC endpoint on chain 4663.");let a=await e.readContract({address:n,abi:m,functionName:"asset"});if(typeof a!="string"||!A(a,S))throw new o("The public Grove vault must use canonical USDG on chain 4663.");let[i,s,r]=await Promise.all([e.readContract({address:O(S),abi:m,functionName:"decimals"}),e.readContract({address:n,abi:m,functionName:"decimals"}),L(e,n)]);if(i!==F||s!==18)throw new o("Grove token decimals differ from the evidenced USDG/share interface.");let p={address:O(S),chainId:h,decimals:i,symbol:"USDG"};return{client:e,asset:p,shareToken:{address:n,chainId:h,decimals:s,symbol:r}}}async function u(e,a,i,s,r,p){let f=await t.preview(e,a);if(Y(f,i)!==-s)throw new o("Grove simulation did not show the exact requested token outflow.");if(Y(f,r)<p)throw new o("Grove simulated output is below the minimum.");let g=f.changes.map(({token:w,amount:b})=>{let y=b.startsWith("-");return`${y?"-":"+"}${t.formatAmount(y?b.slice(1):b,w.decimals)} ${w.symbol} (${w.address}, chain ${w.chainId})`}).join("; ");return{txs:e,summary:`${f.summary} ${g}. Minimum ${p} base units of ${r.address} is a preview check, not enforced on-chain by standard ERC-4626. Re-preview before signing; execution output can change.`}}return{tools:[z(t,"grove_details",n),j(t,"grove_analytics",n),H(t,"grove_manage",n),...W(t,"grove",n),{name:"grove_list",inputSchema:{type:"object",properties:{vault:U},additionalProperties:!1},execute:(e,a)=>d(async()=>{M(e,a,[]);let{client:i,asset:s,shareToken:r}=await l(),[p,f,c,g,w,b]=await Promise.all([i.readContract({address:n,abi:m,functionName:"totalAssets"}),i.readContract({address:n,abi:m,functionName:"totalSupply"}),i.readContract({address:n,abi:m,functionName:"maxDeposit",args:[a]}),i.readContract({address:n,abi:m,functionName:"maxWithdraw",args:[a]}),i.readContract({address:n,abi:m,functionName:"performanceFee"}),i.readContract({address:n,abi:m,functionName:"managementFee"})]);return[{vault:n,chainId:h,name:"Grove x Steakhouse USDG",asset:s,shareToken:r,totalAssets:{token:s,amount:v(p).toString()},totalSupply:{token:r,amount:v(f).toString()},maxDeposit:v(c)===0n?null:c.toString(),maxWithdraw:v(g)===0n?null:g.toString(),maxViewCaveat:"Zero Morpho V2 maximum views mean unknown capacity. Simulate the requested action; full exits use the fresh share balance.",fees:{performanceFeeRaw:v(w).toString(),managementFeeRaw:v(b).toString(),scale:"1000000000000000000",managementFeeTimeUnit:"second",performanceFeeBasis:"accrued interest"}}]})},{name:"grove_deposit",inputSchema:{type:"object",description:"Deposit USDG in base units (1 USDG = 1000000) for 18-decimal vault shares. Exit with grove_withdraw; check positions after confirmation.",properties:{vault:U,amount:T,minSharesOut:T,slippageBps:Q},required:["amount"],additionalProperties:!1},execute:(e,a)=>d(async()=>{M(e,a,["amount","minSharesOut","slippageBps"]);let i=C(e.amount),{client:s,asset:r,shareToken:p}=await l(),f=v(await s.readContract({address:n,abi:m,functionName:"previewDeposit",args:[i]})),c=X(f,e.minSharesOut,e.slippageBps),g=I(n,r.address,i.toString(),a,h),w=[t.approval(r.address,n,i.toString(),h),t.unsignedTx(g.txs[1])];return u(w,a,r,i,p,c)})},{name:"grove_withdraw",inputSchema:{type:"object",description:"Redeem shares in 18-decimal base units, or shares all for a full exit to USDG. Check positions after confirmation.",properties:{vault:U,shares:{oneOf:[T,{const:"all",description:"Redeem the fresh full share balance."}]},minAmountOut:T,slippageBps:Q,force:{type:"boolean"},maxPenaltyAssets:P()},required:["shares"],additionalProperties:!1},execute:(e,a)=>d(async()=>{M(e,a,["shares","minAmountOut","slippageBps","force","maxPenaltyAssets"]);let i=e.shares==="all"?void 0:C(e.shares),{client:s,asset:r,shareToken:p}=await l(),f=v(await s.readContract({address:n,abi:m,functionName:"balanceOf",args:[a]})),c=i??f;if(c===0n||c>f)throw new o("The Grove share balance is insufficient for this withdrawal.");if(e.force!==void 0&&typeof e.force!="boolean")throw new o("force must be a boolean.");if(e.force===!0){if(e.shares!=="all"||e.slippageBps!==void 0)throw new o("Force exit requires shares all and an explicit minAmountOut; omit slippageBps.");let k=V(e.maxPenaltyAssets),ee=C(e.minAmountOut),G=await Z(t,s,n,a,c,k),D=await t.preview([G.tx],a);return K(D.changes,n,c,ee),{txs:[G.tx],preview:D,summary:`${J(G.plan)} ${D.summary}`}}if(e.maxPenaltyAssets!==void 0)throw new o("maxPenaltyAssets requires force true.");let g=v(await s.readContract({address:n,abi:m,functionName:"previewRedeem",args:[c]})),w=X(g,e.minAmountOut,e.slippageBps),y=B(n,c.toString(),a,h).txs.map(k=>t.unsignedTx({...k,description:`Redeem ${c} Grove share base units to the wallet.`}));return u(y,a,p,c,r,w)})}],positions:e=>d(async()=>{x(e);let{client:a,asset:i,shareToken:s}=await l(),r=v(await a.readContract({address:n,abi:m,functionName:"balanceOf",args:[e]}));if(r===0n)return[];let p=v(await a.readContract({address:n,abi:m,functionName:"previewRedeem",args:[r]}));return[{module:"grove",id:`${h}:${n.toLowerCase()}`,chainId:h,assets:[{token:i,amount:p.toString()}],description:`${t.formatAmount(r.toString(),s.decimals)} Grove shares (${r} base units, ${s.decimals} decimals, ${n}); estimated USDG redemption, subject to simulation.`}]})}},we=t=>_("grove",[ae(t)]);export{ae as a,we as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as p,g as l}from"./V5JWGWXC.js";import{a as r,g as d}from"./YWSX6IE6.js";import{a}from"./XSD5NL7J.js";async function P(i,t,c={},u){r(t);let o=()=>{if(c.signal?.aborted)throw new a("Chop read was cancelled.")};o();try{let m=await p(i,u);o();let s=i.clientFor(4663),g=await d(s);return[...(await Promise.all(m.logs.map(async n=>{o();let e=await l(s,n,t,g);return o(),BigInt(e.logTokens.amount)===0n&&BigInt(e.stakedLp.amount)===0n&&BigInt(e.pendingChop.amount)===0n?[]:[{module:"chop",id:`4663:${n.log.address}`,chainId:4663,assets:[e.logTokens,e.stakedLp,e.pendingChop],description:`Chop log held: ${e.logTokens.amount} base units; redeemable net underlying ${e.net.amount} base units (${n.underlying.address}, decimals ${n.underlying.decimals}); staked LP ${e.stakedLp.amount} base units; unpaid CHOP ${e.pendingChop.amount} base units.`,oakNotice:e.warnings}]}))).flat(),{module:"chop",id:"4663:coverage",chainId:4663,assets:[],incomplete:!0,description:"Chop positions cover currently verified registry logs only. Delisted or unverified log holdings are not included."}]}catch{return o(),[{module:"chop",id:"4663:coverage",chainId:4663,assets:[],incomplete:!0,description:"Chop positions are incomplete because a chain read is unavailable. Please try again."}]}}export{P as a};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as ke,b as Te}from"./3GOHSYHW.js";import{b as be,o as we}from"./3NJ5KQ3Q.js";import{a as ye}from"./3MLUCYCB.js";import{c as ie}from"./VEQBHI6O.js";import{a as U}from"./66F5ZH34.js";import{b as re,c as N,d as fe,g as p,i as he,n as ge}from"./NWNYJ26T.js";import{a as l,i as oe,l as d}from"./FWD4L3CJ.js";import{a as i}from"./XSD5NL7J.js";import{a as I}from"./JXOEJPJ4.js";import{decodeEventLog as qe,encodeAbiParameters as Oe,encodeFunctionData as M,erc20Abi as j,getAddress as Se,keccak256 as Ue,parseAbi as D,parseAbiItem as Me,toHex as He,zeroAddress as F}from"viem";var ce=oe[l].pons.launchAndBuyRouter.address,ve=oe[l].ponsTrade.state_view.address,J={address:F,chainId:l,symbol:"ETH",decimals:18},f=D(["function getLaunchedToken(address) view returns ((address token,address curve,address deployer,address creatorFeeRecipient,address pairToken,uint256 graduationThreshold,uint24 poolFee,int24 tickSpacing,uint16 creatorTaxBps,bool buybackEnabled,uint8 phase,uint256 sweptQuote,uint256 sweptTokens,uint256 sweptAt,bool exists))","function previewLaunchEconomics(uint256,address) view returns (bytes32)","function launchFee() view returns (uint256)","function canLaunch(address) view returns (bool)","function launchConfigCount() view returns (uint256)","function approvedPairTokens(address) view returns (bool)","function pairTokenEconomics(address) view returns (uint256 phantomQuote,uint256 graduationThreshold,uint8 decimals)","function transferCreatorFeeRecipient(address token,address newRecipient)","function setBuybackEnabled(address token,bool enabled)","function getLaunchConfig(uint256) view returns ((uint256 supply,uint256 curveFeeBps,uint256 phantomQuote,uint256 graduationThreshold,uint24 poolFee,int24 tickSpacing,bool enabled))","function maxCreatorTaxBps() view returns (uint256)","function getLaunchFeePolicy(address) view returns ((address,uint16,uint16,uint16,uint16))","function memeHook() view returns (address)","function createGraduatedPool(address)"]),Q=D(["function factory() view returns (address)","function feeEscrow() view returns (address)","function getReserves() view returns (uint256,uint256)","function realQuoteReserve() view returns (uint256)","function feeBps() view returns (uint256)"]),je=D(["function launchFactory() view returns (address)"]),De=D(["function currentFeePolicy() view returns ((address,uint16,uint16,uint16,uint16))"]),Pe=D(["function getSlot0(bytes32) view returns (uint160,int24,uint24,uint24)","function getLiquidity(bytes32) view returns (uint128)"]),ae=D(["function launchToken((string,string,string,string,(string,string,string,string,string),address,uint16,bool,bytes32,bytes32),uint256,address) payable","function launchToken((string,string,string,string,(string,string,string,string,string),address,uint16,bool,bytes32,bytes32),uint256,address,address[]) payable","function launchAndBuy((string,string,string,string,(string,string,string,string,string),address,uint16,bool,bytes32,bytes32),uint256,address,uint256,uint256,address,address[]) payable"]),Ie=Me("event TokenLaunched(address indexed token,address indexed curve,address indexed deployer,address pairToken,uint256 launchConfigId,uint256 graduationThreshold)"),We=["curve","pending pool creation","graduated","rescued"],Ge=10000n,Ce=2000n;function A(t){return he(t,"Provide a token or wallet address.",fe)}function H(t){return ge(t,"Amount exceeds the uint256 range.",{notString:"Amounts must be integer strings in base units."})}function Ae(t,e){if(typeof t!="string"||!t.trim())throw new i(`Provide ${e}.`);return t}function R(t,e){return{token:t,amount:e.toString()}}function Ne(t,e,n,r,o){let a=t*BigInt(n)/10000n,s=r?(t-a)*BigInt(o)/10000n:0n;return{baseBps:t.toString(),creatorTaxBps:e.toString(),totalBps:(t+BigInt(e)).toString(),protocolBps:a.toString(),creatorBps:(t-a-s+BigInt(e)).toString(),buybackBps:s.toString(),buybackEnabled:r}}async function V(t,e,n){if(p(e,F))return J;let r=t.clientFor(l),[o,a]=await Promise.all([r.readContract({address:e,abi:j,functionName:"symbol",blockNumber:n}),r.readContract({address:e,abi:j,functionName:"decimals",blockNumber:n})]);return{address:Se(e),chainId:l,symbol:I(o),decimals:a}}async function X(t,e,n){let r=t.clientFor(l),[o,a]=await Promise.all([r.readContract({address:e,abi:je,functionName:"launchFactory",blockNumber:n}),r.readContract({address:d,abi:f,functionName:"getLaunchedToken",args:[e],blockNumber:n})]);if(!p(o,d)||!a.exists||!p(a.token,e))throw new i("This token is not a launch from the supported Pons factory.");if(a.phase>3)throw new i("Pons returned an unknown launch phase.");return a}async function ue(t,e,n){let r=t.clientFor(l),o=await X(t,e,n),[a,s,u,c,h,g,y]=await Promise.all([V(t,e,n),V(t,o.pairToken,n),r.readContract({address:e,abi:j,functionName:"totalSupply",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"factory",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"feeEscrow",blockNumber:n}),r.readContract({address:d,abi:f,functionName:"memeHook",blockNumber:n}),r.readContract({address:d,abi:f,functionName:"getLaunchFeePolicy",args:[e],blockNumber:n})]);if(!p(c,d))throw new i("The Pons curve does not belong to the supported factory.");let m=BigInt(y[3]),x=o.sweptQuote,b=null,T=null,_=null;if(o.phase===0){let[v,S,w]=await Promise.all([r.readContract({address:o.curve,abi:Q,functionName:"getReserves",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"realQuoteReserve",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"feeBps",blockNumber:n})]);if(x=S,m=w,o.graduationThreshold<=0n||v[1]<=0n)throw new i("Pons returned unavailable curve reserves or threshold.");b=S*1000000n/o.graduationThreshold,b>1000000n&&(b=1000000n),T=R(s,v[0]*10n**BigInt(a.decimals)/v[1])}else if(o.phase===2){let v=[e,o.pairToken].sort(($,C)=>BigInt($)<BigInt(C)?-1:1),S=Ue(Oe([{type:"address"},{type:"address"},{type:"uint24"},{type:"int24"},{type:"address"}],[v[0],v[1],o.poolFee,o.tickSpacing,g])),[w,q]=await Promise.all([r.readContract({address:ve,abi:Pe,functionName:"getSlot0",args:[S],blockNumber:n}),r.readContract({address:ve,abi:Pe,functionName:"getLiquidity",args:[S],blockNumber:n})]);if(w[0]===0n)throw new i("The graduated Pons pool price is unavailable.");let E=w[0]**2n,O=10n**BigInt(a.decimals);T=R(s,p(v[0],e)?E*O/(1n<<192n):(1n<<192n)*O/E),_={id:S,sqrtPriceX96:w[0].toString(),tick:w[1],protocolFee:w[2],lpFee:w[3],liquidity:q.toString()},b=1000000n}else o.phase===1&&(b=1000000n);return{token:a,pairToken:s,blockNumber:n.toString(),factory:d,curve:o.curve,hook:g,escrow:h,creator:o.deployer,creatorFeeRecipient:o.creatorFeeRecipient,phase:o.phase,phaseName:We[o.phase],tradable:o.phase===0||o.phase===2,graduationThreshold:R(s,o.graduationThreshold),raised:R(s,x),sweptTokens:R(a,o.sweptTokens),sweptAt:o.sweptAt.toString(),progressPpm:b?.toString()??null,totalSupply:R(a,u),fees:Ne(m,o.creatorTaxBps,y[1],o.buybackEnabled,y[2]),pool:_,spot:T,priceKind:"Marginal spot per whole token; not an execution quote or time average."}}async function Qe(t,e,n,r){let o=t.clientFor(l),[a,s]=await Promise.all([o.readContract({address:e.token.address,abi:j,functionName:"balanceOf",args:[n],blockNumber:r}),p(e.pairToken.address,F)?o.getBalance({address:n,blockNumber:r}):o.readContract({address:e.pairToken.address,abi:j,functionName:"balanceOf",args:[n],blockNumber:r})]),u;try{let c=await ke(t,e.token.address,n,!1,r),h=c.credited.some(g=>BigInt(g.amount)>0n)||BigInt(c.buybackVest.releasable.amount)>0n;u={isRecipient:c.isRecipient,recipient:c.recipient,escrow:c.escrow,credited:c.credited,pendingBeforeSweep:c.pendingBeforeSweep,operatorWait:c.operatorWait??null,buybackVest:c.buybackVest,nextStep:[c.isRecipient&&(h||c.txs.length||c.pendingBeforeSweep.length&&!c.operatorWait)?"pons_claim builds the sweep, vest release and escrow claims for this wallet.":"",!c.isRecipient&&h?"Escrow credits belong to this holder; only the current creator fee recipient can sweep or release this coin.":"",c.operatorWait?`${Te(c.operatorWait)} Oak cannot run it; credited amounts stay claimable.`:""].filter(Boolean).join(" ")||"Nothing to sweep or claim for this holder."}}catch(c){u={unavailable:t.plainError(c)}}return{holder:n,holding:R(e.token,a),pairBalance:R(e.pairToken,s),creatorFees:u,note:"Sell the actual holding shown here, not a quoted output. Balances are read at the status block."}}async function Ve(t,e,n){try{let r=await t.clientFor(l).getBlockNumber({cacheTime:0}),o=await ue(t,A(e),r);return n===void 0?o:{...o,account:await Qe(t,o,A(n),r)}}catch(r){throw new i(t.plainError(r))}}var xe="https://ponsfamily.com/api/launches",ze=t=>{let e=t;return!!e&&Array.isArray(e.items)&&e.items.length<=100&&(e.nextCursor===null||e.nextCursor===void 0||typeof e.nextCursor=="string")&&e.items.every(n=>!!n&&typeof n.address=="string"&&re.test(n.address)&&typeof n.factory=="string"&&re.test(n.factory))};async function Je(t,e){let n=e.limit??20;if(typeof n!="number"||!Number.isInteger(n)||n<1||n>40)throw new i("Choose a search or listing limit from 1 to 40.");let r=new URL(xe);if(e.query!==void 0){if(typeof e.query!="string"||!e.query.trim()||e.query.length>100)throw new i("Provide a name, symbol or address query of 1 to 100 characters.");r.searchParams.set("q",e.query.trim())}else r.searchParams.set("sort","newest");if(e.cursor!==void 0){if(e.query!==void 0)throw new i("Search returns one page; use cursor only for the newest-first listing.");if(typeof e.cursor!="string"||!/^[0-9]{1,20}(\.0x[0-9a-fA-F]{40})?$/.test(e.cursor))throw new i("Use the nextCursor returned by the previous pons_browse page.");r.searchParams.set("cursor",e.cursor)}r.searchParams.set("limit",String(n));let o=await ie(t.http,r,{method:"GET",redirect:"error"},ze);if(o.nextCursor&&!/^[0-9]{1,20}(\.0x[0-9a-fA-F]{40})?$/.test(o.nextCursor))throw new i("Pons returned a malformed listing cursor.");let a=o.items.filter(h=>p(h.factory,d)),s=[...new Map(a.map(h=>[h.address.toLowerCase(),Se(h.address)])).values()].slice(0,n),u=await t.clientFor(l).getBlockNumber({cacheTime:0});return{items:await Promise.all(s.map(h=>ue(t,h,u))),statusBlock:u.toString(),source:xe,nextCursor:e.query===void 0?o.nextCursor??null:null,excludedOtherFactories:o.items.length-a.length,coverage:e.query!==void 0?"Pons index search over every launch (one page, at most 40). Results are discovery only; each one was re-read on chain from the pinned factory.":"Newest-first page of Pons's complete launch index; pass nextCursor to continue until it is null. Each item was re-read on chain; launches from other Pons factories are dropped."}}async function Ke(t,e={}){if(e.query!==void 0||e.cursor!==void 0||e.complete===!0)try{if(e.fromBlock!==void 0||e.toBlock!==void 0)throw new i("Use block bounds for an on-chain window, or query/cursor for the Pons index, not both.");return await Je(t,e)}catch(n){throw new i(t.plainError(n))}return Re(t,e)}async function Re(t,e={}){try{let n=t.clientFor(l),r=await n.getBlockNumber({cacheTime:0}),o=e.toBlock===void 0?r:H(e.toBlock),a=e.fromBlock===void 0?o>=Ce?o-Ce+1n:0n:H(e.fromBlock),s=e.limit??20;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>100)throw new i("Choose a launch limit from 1 to 100.");if(a>o||o>r||o-a+1n>Ge)throw new i("Choose an ordered range of at most 10000 mined blocks.");let u=await n.getLogs({address:d,event:Ie,fromBlock:a,toBlock:o,strict:!0}),c=new Map;for(let y of u.filter(m=>p(m.address,d)&&!m.removed&&m.blockNumber!==null&&m.blockNumber>=a&&m.blockNumber<=o).sort((m,x)=>m.blockNumber===x.blockNumber?(x.logIndex??0)-(m.logIndex??0):m.blockNumber>x.blockNumber?-1:1)){let m=A(y.args.token);c.set(m.toLowerCase(),m)}let h=[...c.values()];return{items:await Promise.all(h.slice(0,s).map(y=>ue(t,y,r))),fromBlock:a.toString(),toBlock:o.toString(),statusBlock:r.toString(),truncated:h.length>s,coverage:"Only launches in the requested block range; this is not a complete launch history."}}catch(n){throw new i(t.plainError(n))}}async function K(t,e,n,r){let o=(Array.isArray(e)?e:[e]).map(t.unsignedTx),a=await t.preview(o,n),s=a.changes.map(u=>{let c=u.amount.startsWith("-");return`${c?"-":""}${t.formatAmount(c?u.amount.slice(1):u.amount,u.token.decimals)} ${u.token.symbol} (${u.token.chainId}:${u.token.address})`});return{txs:o,preview:a,summary:`${r} ${a.summary}${s.length?` Changes: ${s.join(", ")}.`:""}`}}var z=["twitter","telegram","discord","website","farcaster"],Be=5242880,$e="https://ponsfamily.com/api/ipfs/image";function se(t,e){if(t==="")return"";if(typeof t!="string"||t.length>2048)throw new i(`Provide a public HTTPS or IPFS ${e}.`);try{let n=new URL(t);if(!["https:","ipfs:"].includes(n.protocol)||!n.hostname||n.username||n.password)throw new Error}catch{throw new i(`Provide a public HTTPS or IPFS ${e}.`)}return t}function Xe(t){if(t===void 0)return;if(!t||typeof t!="object"||Array.isArray(t))throw new i("Provide image mimeType and base64.");let e=t,n={"image/png":"png","image/jpeg":"jpg","image/webp":"webp"};if(Object.keys(e).some(s=>!["mimeType","base64"].includes(s))||typeof e.mimeType!="string"||!n[e.mimeType])throw new i("Use a PNG, JPEG, or WebP image.");if(typeof e.base64!="string"||!e.base64.length||e.base64.length>4*Math.ceil(Be/3)||e.base64.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(e.base64))throw new i("Provide a base64 image of 1 to 5242880 bytes.");let r=atob(e.base64);if(!r.length||r.length>Be||btoa(r)!==e.base64)throw new i("Provide a base64 image of 1 to 5242880 bytes.");let o=Uint8Array.from(r,s=>s.charCodeAt(0));if(!(e.mimeType==="image/png"?r.startsWith(`\x89PNG\r
|
|
1
|
+
import{a as ke,b as Te}from"./DL6AEWEM.js";import{b as be,o as we}from"./BOVMED7R.js";import{a as ye}from"./QHBS3PVU.js";import{c as ie}from"./VEQBHI6O.js";import{a as U}from"./66F5ZH34.js";import{b as re,c as N,d as fe,g as p,i as he,n as ge}from"./NWNYJ26T.js";import{a as l,i as oe,l as d}from"./FWD4L3CJ.js";import{a as i}from"./XSD5NL7J.js";import{a as I}from"./JXOEJPJ4.js";import{decodeEventLog as qe,encodeAbiParameters as Oe,encodeFunctionData as M,erc20Abi as j,getAddress as Se,keccak256 as Ue,parseAbi as D,parseAbiItem as Me,toHex as He,zeroAddress as F}from"viem";var ce=oe[l].pons.launchAndBuyRouter.address,ve=oe[l].ponsTrade.state_view.address,J={address:F,chainId:l,symbol:"ETH",decimals:18},f=D(["function getLaunchedToken(address) view returns ((address token,address curve,address deployer,address creatorFeeRecipient,address pairToken,uint256 graduationThreshold,uint24 poolFee,int24 tickSpacing,uint16 creatorTaxBps,bool buybackEnabled,uint8 phase,uint256 sweptQuote,uint256 sweptTokens,uint256 sweptAt,bool exists))","function previewLaunchEconomics(uint256,address) view returns (bytes32)","function launchFee() view returns (uint256)","function canLaunch(address) view returns (bool)","function launchConfigCount() view returns (uint256)","function approvedPairTokens(address) view returns (bool)","function pairTokenEconomics(address) view returns (uint256 phantomQuote,uint256 graduationThreshold,uint8 decimals)","function transferCreatorFeeRecipient(address token,address newRecipient)","function setBuybackEnabled(address token,bool enabled)","function getLaunchConfig(uint256) view returns ((uint256 supply,uint256 curveFeeBps,uint256 phantomQuote,uint256 graduationThreshold,uint24 poolFee,int24 tickSpacing,bool enabled))","function maxCreatorTaxBps() view returns (uint256)","function getLaunchFeePolicy(address) view returns ((address,uint16,uint16,uint16,uint16))","function memeHook() view returns (address)","function createGraduatedPool(address)"]),Q=D(["function factory() view returns (address)","function feeEscrow() view returns (address)","function getReserves() view returns (uint256,uint256)","function realQuoteReserve() view returns (uint256)","function feeBps() view returns (uint256)"]),je=D(["function launchFactory() view returns (address)"]),De=D(["function currentFeePolicy() view returns ((address,uint16,uint16,uint16,uint16))"]),Pe=D(["function getSlot0(bytes32) view returns (uint160,int24,uint24,uint24)","function getLiquidity(bytes32) view returns (uint128)"]),ae=D(["function launchToken((string,string,string,string,(string,string,string,string,string),address,uint16,bool,bytes32,bytes32),uint256,address) payable","function launchToken((string,string,string,string,(string,string,string,string,string),address,uint16,bool,bytes32,bytes32),uint256,address,address[]) payable","function launchAndBuy((string,string,string,string,(string,string,string,string,string),address,uint16,bool,bytes32,bytes32),uint256,address,uint256,uint256,address,address[]) payable"]),Ie=Me("event TokenLaunched(address indexed token,address indexed curve,address indexed deployer,address pairToken,uint256 launchConfigId,uint256 graduationThreshold)"),We=["curve","pending pool creation","graduated","rescued"],Ge=10000n,Ce=2000n;function A(t){return he(t,"Provide a token or wallet address.",fe)}function H(t){return ge(t,"Amount exceeds the uint256 range.",{notString:"Amounts must be integer strings in base units."})}function Ae(t,e){if(typeof t!="string"||!t.trim())throw new i(`Provide ${e}.`);return t}function R(t,e){return{token:t,amount:e.toString()}}function Ne(t,e,n,r,o){let a=t*BigInt(n)/10000n,s=r?(t-a)*BigInt(o)/10000n:0n;return{baseBps:t.toString(),creatorTaxBps:e.toString(),totalBps:(t+BigInt(e)).toString(),protocolBps:a.toString(),creatorBps:(t-a-s+BigInt(e)).toString(),buybackBps:s.toString(),buybackEnabled:r}}async function V(t,e,n){if(p(e,F))return J;let r=t.clientFor(l),[o,a]=await Promise.all([r.readContract({address:e,abi:j,functionName:"symbol",blockNumber:n}),r.readContract({address:e,abi:j,functionName:"decimals",blockNumber:n})]);return{address:Se(e),chainId:l,symbol:I(o),decimals:a}}async function X(t,e,n){let r=t.clientFor(l),[o,a]=await Promise.all([r.readContract({address:e,abi:je,functionName:"launchFactory",blockNumber:n}),r.readContract({address:d,abi:f,functionName:"getLaunchedToken",args:[e],blockNumber:n})]);if(!p(o,d)||!a.exists||!p(a.token,e))throw new i("This token is not a launch from the supported Pons factory.");if(a.phase>3)throw new i("Pons returned an unknown launch phase.");return a}async function ue(t,e,n){let r=t.clientFor(l),o=await X(t,e,n),[a,s,u,c,h,g,y]=await Promise.all([V(t,e,n),V(t,o.pairToken,n),r.readContract({address:e,abi:j,functionName:"totalSupply",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"factory",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"feeEscrow",blockNumber:n}),r.readContract({address:d,abi:f,functionName:"memeHook",blockNumber:n}),r.readContract({address:d,abi:f,functionName:"getLaunchFeePolicy",args:[e],blockNumber:n})]);if(!p(c,d))throw new i("The Pons curve does not belong to the supported factory.");let m=BigInt(y[3]),x=o.sweptQuote,b=null,T=null,_=null;if(o.phase===0){let[v,S,w]=await Promise.all([r.readContract({address:o.curve,abi:Q,functionName:"getReserves",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"realQuoteReserve",blockNumber:n}),r.readContract({address:o.curve,abi:Q,functionName:"feeBps",blockNumber:n})]);if(x=S,m=w,o.graduationThreshold<=0n||v[1]<=0n)throw new i("Pons returned unavailable curve reserves or threshold.");b=S*1000000n/o.graduationThreshold,b>1000000n&&(b=1000000n),T=R(s,v[0]*10n**BigInt(a.decimals)/v[1])}else if(o.phase===2){let v=[e,o.pairToken].sort(($,C)=>BigInt($)<BigInt(C)?-1:1),S=Ue(Oe([{type:"address"},{type:"address"},{type:"uint24"},{type:"int24"},{type:"address"}],[v[0],v[1],o.poolFee,o.tickSpacing,g])),[w,q]=await Promise.all([r.readContract({address:ve,abi:Pe,functionName:"getSlot0",args:[S],blockNumber:n}),r.readContract({address:ve,abi:Pe,functionName:"getLiquidity",args:[S],blockNumber:n})]);if(w[0]===0n)throw new i("The graduated Pons pool price is unavailable.");let E=w[0]**2n,O=10n**BigInt(a.decimals);T=R(s,p(v[0],e)?E*O/(1n<<192n):(1n<<192n)*O/E),_={id:S,sqrtPriceX96:w[0].toString(),tick:w[1],protocolFee:w[2],lpFee:w[3],liquidity:q.toString()},b=1000000n}else o.phase===1&&(b=1000000n);return{token:a,pairToken:s,blockNumber:n.toString(),factory:d,curve:o.curve,hook:g,escrow:h,creator:o.deployer,creatorFeeRecipient:o.creatorFeeRecipient,phase:o.phase,phaseName:We[o.phase],tradable:o.phase===0||o.phase===2,graduationThreshold:R(s,o.graduationThreshold),raised:R(s,x),sweptTokens:R(a,o.sweptTokens),sweptAt:o.sweptAt.toString(),progressPpm:b?.toString()??null,totalSupply:R(a,u),fees:Ne(m,o.creatorTaxBps,y[1],o.buybackEnabled,y[2]),pool:_,spot:T,priceKind:"Marginal spot per whole token; not an execution quote or time average."}}async function Qe(t,e,n,r){let o=t.clientFor(l),[a,s]=await Promise.all([o.readContract({address:e.token.address,abi:j,functionName:"balanceOf",args:[n],blockNumber:r}),p(e.pairToken.address,F)?o.getBalance({address:n,blockNumber:r}):o.readContract({address:e.pairToken.address,abi:j,functionName:"balanceOf",args:[n],blockNumber:r})]),u;try{let c=await ke(t,e.token.address,n,!1,r),h=c.credited.some(g=>BigInt(g.amount)>0n)||BigInt(c.buybackVest.releasable.amount)>0n;u={isRecipient:c.isRecipient,recipient:c.recipient,escrow:c.escrow,credited:c.credited,pendingBeforeSweep:c.pendingBeforeSweep,operatorWait:c.operatorWait??null,buybackVest:c.buybackVest,nextStep:[c.isRecipient&&(h||c.txs.length||c.pendingBeforeSweep.length&&!c.operatorWait)?"pons_claim builds the sweep, vest release and escrow claims for this wallet.":"",!c.isRecipient&&h?"Escrow credits belong to this holder; only the current creator fee recipient can sweep or release this coin.":"",c.operatorWait?`${Te(c.operatorWait)} Oak cannot run it; credited amounts stay claimable.`:""].filter(Boolean).join(" ")||"Nothing to sweep or claim for this holder."}}catch(c){u={unavailable:t.plainError(c)}}return{holder:n,holding:R(e.token,a),pairBalance:R(e.pairToken,s),creatorFees:u,note:"Sell the actual holding shown here, not a quoted output. Balances are read at the status block."}}async function Ve(t,e,n){try{let r=await t.clientFor(l).getBlockNumber({cacheTime:0}),o=await ue(t,A(e),r);return n===void 0?o:{...o,account:await Qe(t,o,A(n),r)}}catch(r){throw new i(t.plainError(r))}}var xe="https://ponsfamily.com/api/launches",ze=t=>{let e=t;return!!e&&Array.isArray(e.items)&&e.items.length<=100&&(e.nextCursor===null||e.nextCursor===void 0||typeof e.nextCursor=="string")&&e.items.every(n=>!!n&&typeof n.address=="string"&&re.test(n.address)&&typeof n.factory=="string"&&re.test(n.factory))};async function Je(t,e){let n=e.limit??20;if(typeof n!="number"||!Number.isInteger(n)||n<1||n>40)throw new i("Choose a search or listing limit from 1 to 40.");let r=new URL(xe);if(e.query!==void 0){if(typeof e.query!="string"||!e.query.trim()||e.query.length>100)throw new i("Provide a name, symbol or address query of 1 to 100 characters.");r.searchParams.set("q",e.query.trim())}else r.searchParams.set("sort","newest");if(e.cursor!==void 0){if(e.query!==void 0)throw new i("Search returns one page; use cursor only for the newest-first listing.");if(typeof e.cursor!="string"||!/^[0-9]{1,20}(\.0x[0-9a-fA-F]{40})?$/.test(e.cursor))throw new i("Use the nextCursor returned by the previous pons_browse page.");r.searchParams.set("cursor",e.cursor)}r.searchParams.set("limit",String(n));let o=await ie(t.http,r,{method:"GET",redirect:"error"},ze);if(o.nextCursor&&!/^[0-9]{1,20}(\.0x[0-9a-fA-F]{40})?$/.test(o.nextCursor))throw new i("Pons returned a malformed listing cursor.");let a=o.items.filter(h=>p(h.factory,d)),s=[...new Map(a.map(h=>[h.address.toLowerCase(),Se(h.address)])).values()].slice(0,n),u=await t.clientFor(l).getBlockNumber({cacheTime:0});return{items:await Promise.all(s.map(h=>ue(t,h,u))),statusBlock:u.toString(),source:xe,nextCursor:e.query===void 0?o.nextCursor??null:null,excludedOtherFactories:o.items.length-a.length,coverage:e.query!==void 0?"Pons index search over every launch (one page, at most 40). Results are discovery only; each one was re-read on chain from the pinned factory.":"Newest-first page of Pons's complete launch index; pass nextCursor to continue until it is null. Each item was re-read on chain; launches from other Pons factories are dropped."}}async function Ke(t,e={}){if(e.query!==void 0||e.cursor!==void 0||e.complete===!0)try{if(e.fromBlock!==void 0||e.toBlock!==void 0)throw new i("Use block bounds for an on-chain window, or query/cursor for the Pons index, not both.");return await Je(t,e)}catch(n){throw new i(t.plainError(n))}return Re(t,e)}async function Re(t,e={}){try{let n=t.clientFor(l),r=await n.getBlockNumber({cacheTime:0}),o=e.toBlock===void 0?r:H(e.toBlock),a=e.fromBlock===void 0?o>=Ce?o-Ce+1n:0n:H(e.fromBlock),s=e.limit??20;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>100)throw new i("Choose a launch limit from 1 to 100.");if(a>o||o>r||o-a+1n>Ge)throw new i("Choose an ordered range of at most 10000 mined blocks.");let u=await n.getLogs({address:d,event:Ie,fromBlock:a,toBlock:o,strict:!0}),c=new Map;for(let y of u.filter(m=>p(m.address,d)&&!m.removed&&m.blockNumber!==null&&m.blockNumber>=a&&m.blockNumber<=o).sort((m,x)=>m.blockNumber===x.blockNumber?(x.logIndex??0)-(m.logIndex??0):m.blockNumber>x.blockNumber?-1:1)){let m=A(y.args.token);c.set(m.toLowerCase(),m)}let h=[...c.values()];return{items:await Promise.all(h.slice(0,s).map(y=>ue(t,y,r))),fromBlock:a.toString(),toBlock:o.toString(),statusBlock:r.toString(),truncated:h.length>s,coverage:"Only launches in the requested block range; this is not a complete launch history."}}catch(n){throw new i(t.plainError(n))}}async function K(t,e,n,r){let o=(Array.isArray(e)?e:[e]).map(t.unsignedTx),a=await t.preview(o,n),s=a.changes.map(u=>{let c=u.amount.startsWith("-");return`${c?"-":""}${t.formatAmount(c?u.amount.slice(1):u.amount,u.token.decimals)} ${u.token.symbol} (${u.token.chainId}:${u.token.address})`});return{txs:o,preview:a,summary:`${r} ${a.summary}${s.length?` Changes: ${s.join(", ")}.`:""}`}}var z=["twitter","telegram","discord","website","farcaster"],Be=5242880,$e="https://ponsfamily.com/api/ipfs/image";function se(t,e){if(t==="")return"";if(typeof t!="string"||t.length>2048)throw new i(`Provide a public HTTPS or IPFS ${e}.`);try{let n=new URL(t);if(!["https:","ipfs:"].includes(n.protocol)||!n.hostname||n.username||n.password)throw new Error}catch{throw new i(`Provide a public HTTPS or IPFS ${e}.`)}return t}function Xe(t){if(t===void 0)return;if(!t||typeof t!="object"||Array.isArray(t))throw new i("Provide image mimeType and base64.");let e=t,n={"image/png":"png","image/jpeg":"jpg","image/webp":"webp"};if(Object.keys(e).some(s=>!["mimeType","base64"].includes(s))||typeof e.mimeType!="string"||!n[e.mimeType])throw new i("Use a PNG, JPEG, or WebP image.");if(typeof e.base64!="string"||!e.base64.length||e.base64.length>4*Math.ceil(Be/3)||e.base64.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(e.base64))throw new i("Provide a base64 image of 1 to 5242880 bytes.");let r=atob(e.base64);if(!r.length||r.length>Be||btoa(r)!==e.base64)throw new i("Provide a base64 image of 1 to 5242880 bytes.");let o=Uint8Array.from(r,s=>s.charCodeAt(0));if(!(e.mimeType==="image/png"?r.startsWith(`\x89PNG\r
|
|
2
2
|
|
|
3
3
|
`):e.mimeType==="image/jpeg"?o[0]===255&&o[1]===216&&o[2]===255:r.startsWith("RIFF")&&r.slice(8,12)==="WEBP"))throw new i("Image bytes do not match the declared PNG, JPEG, or WebP type.");return{bytes:o,mimeType:e.mimeType,extension:n[e.mimeType]}}async function Ye(t,e,n){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new i("Provide a mined Pons launch transaction hash.");let o=await t.clientFor(l).getTransactionReceipt({hash:e});if(o.status!=="success"||!p(o.from,n))throw new i("The Pons launch must be a successful transaction from this wallet.");let a=o.logs.flatMap(c=>{if(!p(c.address,d))return[];try{return[qe({abi:[Ie],data:c.data,topics:c.topics,strict:!0}).args]}catch{return[]}}).filter(c=>p(c.deployer,n));if(a.length!==1)throw new i("The receipt does not contain exactly one Pons launch for this wallet.");let s=a[0].token,u=await X(t,s,o.blockNumber);return{transactionHash:e,token:await V(t,s,o.blockNumber),curve:u.curve,creator:u.deployer,creatorFeeRecipient:u.creatorFeeRecipient,chainId:l,summary:`Pons launch mined: ${s}. Creator fee recipient ${u.creatorFeeRecipient}. Use pons_status to inspect the launch and pons_claim to collect creator fees.`}}async function Ze(t,e,n){let r=Ae(e.name,"a coin name"),o=Ae(e.symbol,"a coin symbol");if(e.creatorFeeRecipient===void 0)throw new i("Provide an explicit nonzero creatorFeeRecipient; it is never defaulted to the agent wallet.");let a=A(e.creatorFeeRecipient);if(p(a,F))throw new i("Provide a nonzero creator fee recipient.");if(!p(a,n))throw new i("Pons creator fee recipient must be the signing wallet.");let s=A(e.pairToken??F),u=H(e.launchConfigId??"0"),c=H(e.initialBuy??"0"),h=A(e.buyRecipient??n);if(p(h,F))throw new i("Provide a nonzero initial buy recipient.");if(c===0n&&e.buyRecipient!==void 0)throw new i("A buy recipient requires an initial buy.");let g=H(e.minTokensOut??"0");if(c>0n&&e.minTokensOut!==void 0&&g<=1n)throw new i("Initial buy minimum must exceed one token base unit.");if(c>0n&&!p(h,n)&&e.minTokensOut===void 0)throw new i("Provide minTokensOut for an initial buy sent to another wallet.");if(c===0n&&g!==0n)throw new i("A launch without an initial buy must have a zero token minimum.");let y=e.creatorTaxBps??100;if(typeof y!="number"||!Number.isInteger(y)||y<0||y>65535)throw new i("Creator tax must be an integer number of basis points.");let m=e.buybackEnabled??!1;if(typeof m!="boolean")throw new i("Buyback enabled must be true or false.");let x=e.metadata??["",""],b=e.links??["","","","",""];if(!Array.isArray(x)||x.length!==2||!x.every(k=>typeof k=="string")||!Array.isArray(b)||b.length!==5||!b.every(k=>typeof k=="string"))throw new i("Provide two metadata strings and five link strings in ABI order.");if(e.metadata!==void 0&&(e.logo!==void 0||e.description!==void 0||e.image!==void 0))throw new i("Use named logo, description and image inputs or legacy metadata, not both.");if(e.links!==void 0&&e.socials!==void 0)throw new i("Use named socials or legacy links, not both.");let T=se(e.logo??x[0],"coin image URI"),_=e.description??x[1];if(typeof _!="string")throw new i("Provide a coin description string.");let v=e.socials;if(v!==void 0&&(!v||typeof v!="object"||Array.isArray(v)||Object.keys(v).some(k=>!z.includes(k))))throw new i("Provide twitter, telegram, discord, website and farcaster social links.");let S=z.map((k,P)=>se(v===void 0?b[P]:v[k]??"",`${k} link`)),w=Xe(e.image);if(w&&T)throw new i("Provide an image upload or an existing logo URI, not both.");let q=e.snipeTaxExemptions??[];if(!Array.isArray(q)||q.length>31)throw new i("Provide at most 31 snipe tax exemption addresses.");let E=q.map(A),O=e.salt??He(crypto.getRandomValues(new Uint8Array(32)));if(typeof O!="string"||!/^0x[0-9a-fA-F]{64}$/.test(O))throw new i("Salt must be 32 hex-encoded bytes.");let $=t.clientFor(l),C=await $.getBlockNumber({cacheTime:0}),[de,Ee]=await Promise.all([$.readContract({address:d,abi:f,functionName:"canLaunch",args:[n],blockNumber:C}),$.readContract({address:d,abi:f,functionName:"launchConfigCount",blockNumber:C})]);if(!de)throw new i("This wallet cannot launch on Pons. Ask Pons for launch access and retry when canLaunch is true.");if(u>=Ee)throw new i("Choose an existing Pons launchConfigId using pons_launch_options.");let[Y,W,Le,_e]=await Promise.all([$.readContract({address:d,abi:f,functionName:"launchFee",blockNumber:C}),$.readContract({address:d,abi:f,functionName:"getLaunchConfig",args:[u],blockNumber:C}),$.readContract({address:d,abi:f,functionName:"maxCreatorTaxBps",blockNumber:C}),$.readContract({address:d,abi:f,functionName:"memeHook",blockNumber:C})]);if(!W.enabled)throw new i("This Pons launch configuration is disabled. Choose an enabled launchConfigId.");let L=J,le=W.phantomQuote,pe=W.graduationThreshold;if(!p(s,F)){let[k,P]=await Promise.all([$.readContract({address:d,abi:f,functionName:"approvedPairTokens",args:[s],blockNumber:C}),$.readContract({address:d,abi:f,functionName:"pairTokenEconomics",args:[s],blockNumber:C})]);if(!k||P[0]<=0n||P[1]<=0n)throw new i("This pair token is not approved with usable Pons economics. Choose a supported pair.");if(L=await V(t,s,C),P[2]!==L.decimals)throw new i("Pair token decimals disagree with Pons. Ask Pons to refresh pair economics.");[le,pe]=P}if(BigInt(y)>Le)throw new i("Creator tax exceeds the current Pons maximum.");let[Z,ee]=await Promise.all([$.readContract({address:d,abi:f,functionName:"previewLaunchEconomics",args:[u,s],blockNumber:C}),$.readContract({address:_e,abi:De,functionName:"currentFeePolicy",blockNumber:C})]);if(e.expectedEconomics!==void 0&&e.expectedEconomics!==Z)throw new i("Pons launch economics changed. Refresh the launch preview.");let G=Ne(W.curveFeeBps,y,ee[1],m,ee[2]),ne="";if(w){let k=new FormData;k.append("image",new Blob([w.bytes],{type:w.mimeType}),`coin.${w.extension}`);let P=await ie(t.http,$e,{method:"POST",body:k,redirect:"error"},B=>!!B&&typeof B=="object"&&typeof B.uri=="string");if(T=se(P.uri,"uploaded coin image URI"),!T)throw new i("Pons returned an empty image URI. Retry with a public image URI.");ne=`Image (${w.bytes.length} bytes, ${w.mimeType}) uploaded via multipart POST to ${$e}; URI ${I(T)}. This off-chain upload persists even if launch is cancelled or fails; Pons retention/deletion is unknown.`}let te=k=>{let P=[r,o,T,_,S,a,y,m,Z,O],B={to:c===0n?d:ce,chainId:l,value:(Y+(p(s,F)?c:0n)).toString(),data:c===0n?E.length?M({abi:ae,functionName:"launchToken",args:[P,u,s,E]}):M({abi:ae,functionName:"launchToken",args:[P,u,s]}):M({abi:ae,functionName:"launchAndBuy",args:[P,u,s,c,k,h,E]}),description:`Launch ${I(r)} through the Pons ${c===0n?"factory":"router"} from ${n}; creator fees to ${a}. ${ne}`.trim()};return c>0n&&!p(s,F)?[t.approval(s,ce,c.toString(),l),B]:[B]};if(c>0n&&e.minTokensOut===void 0){let P=(await t.preview(te(0n).map(t.unsignedTx),n)).changes.filter(B=>B.token.chainId===l&&!p(B.token.address,F)&&!p(B.token.address,ye)&&!p(B.token.address,s)&&B.token.decimals===18&&/^\d+$/.test(B.amount)&&BigInt(B.amount)>0n);if(P.length!==1)throw new i("Pons launch preview did not identify a unique initial buy token output.");if(g=BigInt(we(P[0].amount,be)),g<=1n)throw new i("Initial buy minimum must exceed one token base unit.")}let me=await K(t,te(g),n,`Unsigned Pons launch from ${n}: ${I(r)} (${I(o)}), image ${T?I(T):"none"}, description ${I(_)}, links ${JSON.stringify(Object.fromEntries(z.map((k,P)=>[k,I(S[P])])))}. canLaunch=true at block ${C}; config ${u}, supply ${W.supply}, phantom quote ${le}, graduation threshold ${pe} pair base units. Pair ${L.symbol} (${l}:${L.address}, ${L.decimals} decimals). Initial buy ${t.formatAmount(c.toString(),L.decimals)} ${L.symbol} to ${h}; minimum ${g} token base units (18 decimals). Launch fee ${t.formatAmount(Y.toString(),18)} ETH plus gas; exact transaction value ${te(g).at(-1).value} wei. Curve fees ${G.totalBps} bps total, ${G.protocolBps} bps protocol, ${G.creatorBps} bps creator, ${G.buybackBps} bps buyback; creator tax ${y} bps, buybacks ${m?"on":"off"}, graduated hook fee ${ee[3]} bps plus creator tax. Creator fee recipient ${a}. Extra opening-tax exemptions ${JSON.stringify(E)}. Name, metadata, pair, tax and launch economics are fixed after launch. ${ne}`);return{...me,creatorFeeWarning:void 0,preview:{...me.preview,warnings:[]},canLaunch:de,blockNumber:C.toString(),launchConfigId:u.toString(),pairToken:L,salt:O,logo:T&&I(T),economics:Z,launchFee:R(J,Y),initialBuy:R(L,c),minimum:{amount:g.toString(),decimals:18,token:{chainId:l,address:null,name:I(r),symbol:I(o)},addressStatus:"Read the mined token address with pons_launch transactionHash; the local bridge does this automatically."},fees:G}}async function en(t,e,n){let r=t.clientFor(l),o=await r.getBlockNumber({cacheTime:0}),a=A(e.pairToken??F),[s,u,c,h]=await Promise.all([r.readContract({address:d,abi:f,functionName:"canLaunch",args:[n],blockNumber:o}),r.readContract({address:d,abi:f,functionName:"launchConfigCount",blockNumber:o}),r.readContract({address:d,abi:f,functionName:"launchFee",blockNumber:o}),r.readContract({address:d,abi:f,functionName:"maxCreatorTaxBps",blockNumber:o})]),g=H(e.offset??"0"),y=await Promise.all(Array.from({length:Number(u>g?u-g>100n?100n:u-g:0n)},async(_,v)=>{let S=g+BigInt(v),w=await r.readContract({address:d,abi:f,functionName:"getLaunchConfig",args:[S],blockNumber:o});return{id:S.toString(),...Object.fromEntries(Object.entries(w).map(([q,E])=>[q,typeof E=="bigint"?E.toString():E]))}})),m=p(a,F),[x,b,T]=await Promise.all([m?!0:r.readContract({address:d,abi:f,functionName:"approvedPairTokens",args:[a],blockNumber:o}),m?void 0:r.readContract({address:d,abi:f,functionName:"pairTokenEconomics",args:[a],blockNumber:o}),V(t,a,o)]);return{chainId:l,factory:d,router:ce,blockNumber:o.toString(),canLaunch:s,launchFee:R(J,c),maxCreatorTaxBps:h.toString(),configs:y,configCount:u.toString(),nextOffset:g+BigInt(y.length)<u?(g+BigInt(y.length)).toString():null,pairToken:T,pairApproved:x&&(!b||b[0]>0n&&b[1]>0n&&b[2]===T.decimals),pairEconomics:b?{phantomQuote:b[0].toString(),graduationThreshold:b[1].toString(),decimals:b[2]}:null,pairDiscovery:"Native ETH or any approved ERC-20 address with usable pairTokenEconomics; query each candidate address. The factory has no pair enumeration read."}}async function Fe(t,e,n,r){let o=A(e.token),a=await X(t,o,await t.clientFor(l).getBlockNumber({cacheTime:0}));if(!p(a.creatorFeeRecipient,n))throw new i(`Only the current creator fee recipient ${a.creatorFeeRecipient} can change this setting. Use that wallet.`);if(r){let s=A(e.creatorFeeRecipient);if(p(s,F))throw new i("Provide a nonzero creator fee recipient.");return K(t,{to:d,chainId:l,value:"0",data:M({abi:f,functionName:"transferCreatorFeeRecipient",args:[o,s]}),description:`Transfer future creator fees and the buyback vest beneficiary for ${o} to ${s}.`},n,`Unsigned Pons fee recipient transfer to ${s}; previously credited fees stay with ${n}. This wallet loses future fee controls. Cost: gas only.`)}if(typeof e.enabled!="boolean")throw new i("Buyback enabled must be true or false.");return K(t,{to:d,chainId:l,value:"0",data:M({abi:f,functionName:"setBuybackEnabled",args:[o,e.enabled]}),description:`Turn Pons buybacks ${e.enabled?"on":"off"} for ${o}.`},n,`Unsigned Pons buyback change: ${e.enabled?"on; funded from the creator fee share, tokens vest over five years":"off; existing vest stays locked on its schedule"}. Cost: gas only.`)}var nn=t=>{function e(n,r,o,a){return{name:n,inputSchema:{type:"object",properties:r,required:o,additionalProperties:!1,...n==="pons_launch"?{anyOf:[{required:["transactionHash"]},{required:["name","symbol","creatorFeeRecipient"]}]}:{},...n==="pons_browse"?{allOf:[{if:{anyOf:[{required:["query"]},{required:["cursor"]},{properties:{complete:{const:!0}},required:["complete"]}]},then:{properties:{limit:{maximum:40}}}}]}:{}},execute:async(s,u)=>{try{A(u);for(let c of Object.keys(s))if(!(c in r))throw new i(`Unknown ${n} input: ${c}.`);return await a(s,u)}catch(c){throw new i(t.plainError(c))}}}}return{tools:[e("pons_browse",{fromBlock:U(),toBlock:U(),limit:{type:"integer",minimum:1,maximum:100,description:"At most 40 for query, cursor or complete listings; at most 100 for an on-chain block window."},query:{type:"string",minLength:1,maxLength:100,description:"Name, symbol or address search over every Pons launch (Pons index; results re-read on chain)."},cursor:{type:"string",maxLength:64,description:"nextCursor from a previous newest-first page."},complete:{type:"boolean",description:"List every launch newest first through the Pons index, paginated with cursor."}},[],n=>Ke(t,n)),e("pons_status",{token:N,holder:N},["token"],(n,r)=>Ve(t,A(n.token),A(n.holder??r))),e("pons_launch_options",{pairToken:N,offset:U()},[],(n,r)=>en(t,n,r)),e("pons_transfer_creator_fee_recipient",{token:N,creatorFeeRecipient:N},["token","creatorFeeRecipient"],(n,r)=>Fe(t,n,r,!0)),e("pons_set_buyback",{token:N,enabled:{type:"boolean"}},["token","enabled"],(n,r)=>Fe(t,n,r,!1)),e("pons_launch",{name:{type:"string",minLength:1},symbol:{type:"string",minLength:1},creatorFeeRecipient:N,pairToken:N,launchConfigId:U(),buyRecipient:N,logo:{type:"string"},description:{type:"string"},socials:{type:"object",properties:Object.fromEntries(z.map(n=>[n,{type:"string"}])),additionalProperties:!1},image:{type:"object",properties:{mimeType:{type:"string",enum:["image/png","image/jpeg","image/webp"]},base64:{type:"string",minLength:1,maxLength:6990508}},required:["mimeType","base64"],additionalProperties:!1},snipeTaxExemptions:{type:"array",items:N,maxItems:31},transactionHash:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"},initialBuy:U(),minTokensOut:U(),creatorTaxBps:{type:"integer",minimum:0,maximum:65535},buybackEnabled:{type:"boolean"},expectedEconomics:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"},salt:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"},metadata:{type:"array",items:{type:"string"},minItems:2,maxItems:2},links:{type:"array",items:{type:"string"},minItems:5,maxItems:5}},[],(n,r)=>n.transactionHash===void 0?Ze(t,n,r):Ye(t,n.transactionHash,r)),e("pons_graduate",{token:N},["token"],async(n,r)=>{let o=A(n.token);if((await X(t,o,await t.clientFor(l).getBlockNumber({cacheTime:0}))).phase!==1)throw new i("Graduation requires a launch pending pool creation (phase 1).");return K(t,{to:d,chainId:l,value:"0",data:M({abi:f,functionName:"createGraduatedPool",args:[o]}),description:`Create the graduated Pons pool for ${o}.`},r,"Unsigned permissionless graduation retry; recheck status after the transaction is mined.")})],positions:async n=>{try{A(n);let r=await Re(t,{limit:100}),o=r.items.filter(a=>p(a.creator,n)||p(a.creatorFeeRecipient,n));return await Promise.all(o.map(async a=>{let s=await t.clientFor(l).readContract({address:a.token.address,abi:j,functionName:"balanceOf",args:[n],blockNumber:BigInt(a.blockNumber)});return{module:"pons",id:`${l}:${a.token.address}`,chainId:l,assets:[R(a.token,s)],description:`Pons ${a.phaseName}; creator fee recipient ${a.creatorFeeRecipient}. Discovery covers recent launches only (${r.fromBlock}-${r.toBlock}${r.truncated?", truncated":""}).`}}))}catch(r){throw new i(t.plainError(r))}}}},mn=nn;export{X as a,ue as b,Ve as c,Ke as d,nn as e,mn as f};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as i}from"./77CLMPM7.js";var s="This is a bearer note: anyone who sees it can take the money. Oak only claims sealed tickets sent to your receive tag. Nothing was done.",l={gloam_status:[],gloam_shield:["amount"],gloam_pay:["to","amount"],gloam_claim:["ticket"],gloam_cash_out:["note"]};function g(n,e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Gloam arguments are invalid. Nothing was done.");if(Object.values(e).some(r=>typeof r=="string"&&/^(?:gloam1\.|oakgloam1\.)/.test(r)))throw new Error(s);let o=l[n];if(!o)throw new Error("Unknown Gloam tool. Nothing was done.");for(let r of Object.keys(e))if(!o.includes(r))throw new Error("Unexpected Gloam argument. Nothing was done.");let t={};for(let r of o){let a=e[r];if(!(a===void 0&&n==="gloam_claim")){if(typeof a!="string")throw new Error(`Gloam ${r} is invalid. Nothing was done.`);t[r]=a}}if((n==="gloam_shield"||n==="gloam_pay")&&(!/^[0-9]+$/.test(t.amount??"")||BigInt(t.amount)<=0n))throw new Error("Gloam amount must be a positive base-unit string. Nothing was done.");if(n==="gloam_pay"&&!/^gloamr1\.[A-Za-z0-9_-]+$/.test(t.to??""))throw new Error("Provide a valid Gloam receive tag. Nothing was done.");if(n==="gloam_claim"&&t.ticket!==void 0&&!/^gloam2t\.[A-Za-z0-9_-]+$/.test(t.ticket))throw new Error("Provide a sealed Gloam ticket. Nothing was done.");if(n==="gloam_cash_out"&&!/^(?:note_[0-9]+|all)$/.test(t.note??""))throw new Error("Provide a Gloam note handle or all. Nothing was done.");return t}function d(n,e){if(!/^[0-9]+$/.test(e)||BigInt(e)<=0n)throw new Error("Gloam amount must be positive.");return n.filter(o=>o.status==="unspent"&&o.asset.toLowerCase()===i.usdg.toLowerCase()&&/^[0-9]+$/.test(o.amount)&&BigInt(o.amount)>=BigInt(e)).sort((o,t)=>BigInt(o.amount)<BigInt(t.amount)?-1:BigInt(o.amount)>BigInt(t.amount)?1:o.createdAt-t.createdAt)[0]}export{s as a,g as b,d as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Ee}from"./NAZPDRIF.js";import{c as xe}from"./FQ6UZCM6.js";import{a as $e,b as pe,c as Te}from"./QA3UHEO3.js";import{c as Re,d as t,e as R,f as d,g as Ae,h as W,i as v,j as ue,k as L,m as O,n as c,o as ce,p as le,q as me,r as Ce,s as qe}from"./64GOINYS.js";import{a as ke,o as de}from"./3NJ5KQ3Q.js";import{a as ve}from"./66F5ZH34.js";import{c as re,e as Q,g as M}from"./NWNYJ26T.js";import{a as l,i as be}from"./FWD4L3CJ.js";import{a as h}from"./XSD5NL7J.js";import{decodeFunctionData as Fe,erc20Abi as Me}from"viem";var z="0x0000000000000000000000000000000000000000",N=be[l].relay.depository.address.toLowerCase(),Se=30,ze=w=>{let U=qe(w);async function he(n){let e;try{e=await U(`/intents/status/v3?requestId=${encodeURIComponent(n)}`)}catch(C){if(w.plainError(C)!=="The request timed out. Please try again.")throw C;return{requestId:n,status:"unknown",timedOut:!0,fulfilled:!1,settled:!1,pollAgain:!0,needsAttention:!1,inTxHashes:[],txHashes:[],originChainId:void 0,destinationChainId:void 0,summary:"The status request timed out. Bridge settlement is unknown; poll again."}}if(typeof e.status!="string")throw new h("Relay returned an invalid bridge status.");let i=ce(e.inTxHashes),p=ce(e.txHashes),u=e.originChainId===void 0?void 0:W(e.originChainId),a=e.destinationChainId===void 0?void 0:W(e.destinationChainId),s=le(e.failReason),m=le(e.refundFailReason),r=e.status==="success"&&p.length>0&&a!==void 0,q=e.status==="refund"&&p.length>0&&u!==void 0,g=e.status==="failure"&&m!==void 0,A=["waiting","depositing","pending","submitted","failure","refund","success"].includes(e.status)?e.status==="failure"&&/TIMEOUT|EXPIRED/.test(typeof e.failReason=="string"?e.failReason:"")?"timeout":e.status:"unknown",k=r?"Relay reports destination fulfillment.":q?"Relay reports a refund on the origin chain; the destination was not fulfilled.":g?"The bridge failed and automatic refund is unavailable. Review the request with Relay.":"Bridge settlement is not confirmed. Poll Relay again; an origin receipt alone does not prove destination fulfillment.";return{requestId:n,status:A,relayStatus:e.status,fulfilled:r,settled:r||q,pollAgain:!r&&!q&&!g,needsAttention:g,timedOut:!1,inTxHashes:i,txHashes:p,originChainId:u,destinationChainId:a,failReason:s,refundFailReason:m,...e.updatedAt===void 0?{}:{updatedAt:v(String(e.updatedAt))},summary:k}}async function De(n,e){let i=s=>({destinationVerified:!1,destinationCheck:s}),p;try{if(p=w.clientFor(n),await p.getChainId()!==n)return i(`The configured RPC does not serve chain ${n}; destination receipts were not checked.`)}catch{return i(`No RPC is available for chain ${n}; destination receipts were not checked.`)}let u=[];for(let s of e)try{let m=await p.getTransactionReceipt({hash:s});u.push({hash:s,status:m.status,blockNumber:m.blockNumber.toString()})}catch{return{...i(`Receipt ${s} is not available on chain ${n} yet; poll again.`),destinationReceipts:u}}let a=u.length>0&&u.every(s=>s.status==="success");return{destinationVerified:a,destinationReceipts:u,destinationCheck:a?`Every Relay destination transaction has a successful receipt on chain ${n}. Amounts are not decoded here; compare the recipient balance for the exact delivered amount.`:`A Relay destination transaction did not succeed on chain ${n}; do not treat this bridge as delivered.`}}async function Pe(n){let e=await w.clientFor(l).readContract({address:n,abi:Me,functionName:"decimals"}),i=typeof e=="bigint"?Number(e):e;if(typeof i!="number"||!Number.isInteger(i)||i<0||i>255)throw new h("Could not read valid ERC-20 decimals() on-chain.");return i}async function _e(n,e){let i=d(e),p=d(n.recipient??i),u=W(n.destinationChainId);if(u===l)throw new h("Choose a destination chain other than 4663.");let a=Ae(n.originCurrency??z),s=a!==z,m=d(n.destinationCurrency??z),r=v(n.amount);if(r==="0")throw new h("Provide a positive bridge amount.");let q=n.minAmountOut===void 0?void 0:v(n.minAmountOut),g=n.slippageBps??pe;if(typeof g!="number")throw new h("Slippage must be an integer from 0 to 9999 bps.");de("0",g);let I=R((await U("/chains")).chains).map(t),A=I.find(o=>o.id===l),k=I.find(o=>o.id===u);if(!A||!k||A.disabled!==!1||k.disabled!==!1||A.depositEnabled!==!0||A.vmType!=="evm"||k.vmType!=="evm")throw new h("Relay does not currently support this outbound chain route.");if(!xe(u))throw new h(`Relay has no supported Oak return path from chain ${u}. Choose a destination supported by relay_bridge_in before bridge-out.`);let C=await $e(w.clientFor,u,i,"server"),b=s?await Pe(a):18,P=Math.floor(Date.now()/1e3)+ke,$=await U("/quote/v2",{user:i,recipient:p,originChainId:l,destinationChainId:u,originCurrency:a,destinationCurrency:m,amount:r,tradeType:"EXACT_INPUT",...s?{explicitDeposit:!0}:{}}),E=L($.requestId),S=t($.details),B=O(S.currencyIn),f=O(S.currencyOut),T={token:f.token,amount:v(t(S.currencyOut).minimumAmount)};if(c(d(S.sender)===i&&d(S.recipient)===p&&B.token.chainId===l&&B.token.address===a&&B.token.decimals===b&&B.amount===r&&f.token.chainId===u&&f.token.address===m&&BigInt(T.amount)>0n&&BigInt(T.amount)<=BigInt(f.amount)),m===z&&c(f.token.decimals===t(k.currency).decimals),q!==void 0){if(T.amount!==q)throw new h("Relay order minimum must exactly match minAmountOut. Request a new quote.")}else if(BigInt(T.amount)<BigInt(de(f.amount,g)))throw Te(f.amount,T.amount);let J=t(t($.protocol).v2),j=L(J.orderId),Z=t(J.orderData),Y=t(Z.output),ee=ue(Y.deadline),K=R(Z.inputs).map(t);c(K.length>0);let te=K.flatMap(o=>{let y=R(o.refunds).map(t);return c(y.length>0),y.map(we=>{if(d(we.recipient)!==i)throw new h("Relay refund recipient does not match the agent wallet. Request a new quote.");return ue(we.deadline)})}),Oe=te.reduce((o,y)=>Math.min(o,y),ee),ne=Math.min(P,Oe-Se),fe=()=>{if(Date.now()/1e3>=ne)throw new h("The Relay quote expired or its order/refund deadline leaves too little time to sign and send. Request a fresh bridge quote.")};fe();let H=R(Y.payments).map(t),ie=t(t(A.protocol).v2),Ne=t(t(k.protocol).v2),V=t(J.paymentDetails);c(Y.chainId===Ne.chainId&&H.length===1&&R(Y.calls).length===0&&d(H[0].recipient)===p&&d(H[0].currency)===m&&v(H[0].minimumAmount)===T.amount&&v(H[0].expectedAmount)===f.amount&&V.chainId===ie.chainId&&d(V.currency)===a&&v(V.amount)===r),c(d(V.depository)===N&&d(ie.depository)===N);let oe=t(K[0].payment);c(K.length===1&&oe.chainId===ie.chainId&&d(oe.currency)===a&&v(oe.amount)===r);let F=R($.steps).map(t),_=s&&F.length===2?F[0]:void 0;c(F.length===(_?2:1));let G=F[F.length-1];c(G.kind==="transaction"&&G.id==="deposit"&&G.requestId===E);let X=R(G.items).map(t);c(X.length===1&&X[0].status==="incomplete");let x=t(X[0].data),ye=t(X[0].check);if(c(ye.method==="GET"&&ye.endpoint===`/intents/status/v3?requestId=${E}`&&x.chainId===l&&d(x.from)===i&&d(x.to)===N&&v(x.value)===(s?"0":r)),typeof x.data!="string"||!(s?/^0x[0-9a-fA-F]{264}$/:/^0x[0-9a-fA-F]{136}$/).test(x.data))throw new h(`Relay returned unexpected ${s?"ERC-20":"native"} deposit calldata.`);let D=Fe({abi:Re,data:x.data});D.functionName==="depositErc20"?c(s&&d(D.args[0])===i&&d(D.args[1])===a&&D.args[2]===BigInt(r)&&M(D.args[3],j)):c(!s&&d(D.args[0])===i&&M(D.args[1],j));let Be=I.filter(o=>o.vmType==="evm"&&Q(o.protocol)&&Q(o.protocol.v2)).map(o=>t(t(o.protocol).v2).chainId).filter(o=>typeof o=="string");if(!M(Ee(Z,Be),j))throw new h("Relay order ID does not match the checked quote terms. Request a new quote.");let ae=s?w.approval(a,N,r,l):void 0;if(_&&ae){c(_.kind==="transaction"&&_.id==="approve"&&_.requestId===E);let o=R(_.items).map(t);c(o.length===1&&o[0].status==="incomplete");let y=t(o[0].data);c(y.chainId===l&&d(y.from)===i&&d(y.to)===a&&v(y.value)==="0"&&typeof y.data=="string"&&M(y.data,ae.data))}let ge=[...ae?await Ce(w,a,N,r,l,i):[],w.unsignedTx({to:N,data:x.data,value:s?"0":r,chainId:l,description:s?`Deposit ${r} base units of ${a} for Relay request ${E}.`:`Deposit native ETH for Relay request ${E}.`})],Ie=t($.fees);for(let o of Object.values(Ie))O(o);let se=await w.preview(ge,i);fe();let He=se.changes.map(o=>{let y=o.amount.startsWith("-");return`${y?"-":""}${w.formatAmount(y?o.amount.slice(1):o.amount,o.token.decimals)} ${o.token.symbol}`}).join(", ");return{txs:ge,requestId:E,orderId:j,recipient:p,originChainId:l,destinationChainId:u,expiresAt:String(ne),orderDeadline:String(ee),refundDeadlines:te.map(String),returnPath:C,amountIn:B,amountOut:f,minAmountOut:T,fees:Ie,expandedPriceImpact:S.expandedPriceImpact,timeEstimate:S.timeEstimate,preview:se,summary:`${C} Bridge to ${p} on chain ${u}; asset ${f.token.address} on chain ${f.token.chainId} (${me(f.token.symbol)}); expected ${f.amount}, minimum ${T.amount} base units (${f.token.decimals} decimals). Order deadline ${ee} Unix seconds; refund deadlines ${te.join(", ")} Unix seconds; accept before ${ne} Unix seconds to reserve ${Se}s to sign and send. Origin preview: ${He||se.summary}. Relay route fees are included in the quote; origin gas is separate. Poll relay_status with requestId ${E} after local submission; destination fulfillment is not yet confirmed.`}}return{tools:[{name:"relay_bridge_out",inputSchema:{type:"object",required:["destinationChainId","amount"],additionalProperties:!1,properties:{destinationChainId:{type:"integer",minimum:1},amount:{type:"string",pattern:"^[1-9][0-9]*$"},recipient:re,originCurrency:re,slippageBps:{type:"integer",minimum:0,maximum:9999,default:pe},destinationCurrency:{type:"string"},minAmountOut:ve()}},execute:async(n,e)=>{try{return await _e(n,e)}catch(i){throw new h(w.plainError(i))}}},{name:"relay_status",inputSchema:{type:"object",required:["requestId"],additionalProperties:!1,properties:{requestId:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"},verifyDestination:{type:"boolean"}}},execute:async n=>{let e=await he(L(n.requestId));return n.verifyDestination!==!0||!e.fulfilled||e.destinationChainId===void 0?e:{...e,...await De(e.destinationChainId,e.txHashes)}}}],positions:async n=>{let e=d(n);if(!process.env.OAK_RELAY_API_KEY?.trim())return[{module:"relay",id:"relay-discovery-unavailable",chainId:l,assets:[],incomplete:!0,description:'Relay pending bridge discovery requires OAK_RELAY_API_KEY on the server. The request-history API requires this key; no pending bridges were checked. Ask the operator to configure it, or check a known request with relay_status {"requestId":"<id>"}. Legacy vault shares on other chains can be checked with relay_vault_status {"chainId":1} or {"chainId":42161}.'}];let i=new Map;for(let p of["outbound","inbound"]){let u=new Set,a;do{let s=new URLSearchParams({user:e,[p==="outbound"?"originChainId":"destinationChainId"]:String(l),limit:"100",includePendingRequests:"true"});a&&s.set("continuation",a);let m=await U(`/requests/v3?${s}`);for(let r of R(m.requests).map(t)){let q=Q(r.depositAddress)?r.depositAddress.depositor:void 0;if(![r.user,r.sender,q].some($=>typeof $=="string"&&$.toLowerCase()===e))throw new h("Relay returned a request for another wallet.");let g=L(r.id);if(i.has(g))continue;let I=await he(g);if(I.settled)continue;let A=t(r.data),k=t(t(A.route).quoted),C=O(t(k.origin).inputCurrency),b={...C,token:{...C.token,symbol:me(C.token.symbol)??"unknown"}},P=O(t(k.destination).outputCurrency);c(p==="outbound"?b.token.chainId===l&&P.token.chainId!==l:b.token.chainId!==l&&P.token.chainId===l),I.originChainId!==void 0&&c(I.originChainId===b.token.chainId),I.destinationChainId!==void 0&&c(I.destinationChainId===P.token.chainId),i.set(g,{module:"relay",id:g,chainId:b.token.chainId,assets:[b],description:`Relay ${p} ${I.status}: ${b.amount} ${b.token.symbol} base units (${b.token.decimals} decimals) from chain ${b.token.chainId} toward ${d(r.recipient)} on chain ${P.token.chainId}. ${I.summary} Track with relay_status requestId ${g}.`})}if(m.continuation!==void 0&&m.continuation!==null&&typeof m.continuation!="string")throw new h("Relay returned invalid pagination.");if(a=typeof m.continuation=="string"&&m.continuation?m.continuation:void 0,a){if(u.has(a))throw new h("Relay repeated its pagination cursor. Pending positions are incomplete.");u.add(a)}}while(a)}return[...i.values()]}}};export{ze as a};
|
|
1
|
+
import{c as xe}from"./AW7AXQCZ.js";import{a as Ee}from"./NAZPDRIF.js";import{a as $e,b as pe,c as Te}from"./QA3UHEO3.js";import{c as Re,d as t,e as R,f as d,g as Ae,h as W,i as v,j as ue,k as L,m as O,n as c,o as ce,p as le,q as me,r as Ce,s as qe}from"./64GOINYS.js";import{a as ke,o as de}from"./BOVMED7R.js";import{a as ve}from"./66F5ZH34.js";import{c as re,e as Q,g as M}from"./NWNYJ26T.js";import{a as l,i as be}from"./FWD4L3CJ.js";import{a as h}from"./XSD5NL7J.js";import{decodeFunctionData as Fe,erc20Abi as Me}from"viem";var z="0x0000000000000000000000000000000000000000",N=be[l].relay.depository.address.toLowerCase(),Se=30,ze=w=>{let U=qe(w);async function he(n){let e;try{e=await U(`/intents/status/v3?requestId=${encodeURIComponent(n)}`)}catch(C){if(w.plainError(C)!=="The request timed out. Please try again.")throw C;return{requestId:n,status:"unknown",timedOut:!0,fulfilled:!1,settled:!1,pollAgain:!0,needsAttention:!1,inTxHashes:[],txHashes:[],originChainId:void 0,destinationChainId:void 0,summary:"The status request timed out. Bridge settlement is unknown; poll again."}}if(typeof e.status!="string")throw new h("Relay returned an invalid bridge status.");let i=ce(e.inTxHashes),p=ce(e.txHashes),u=e.originChainId===void 0?void 0:W(e.originChainId),a=e.destinationChainId===void 0?void 0:W(e.destinationChainId),s=le(e.failReason),m=le(e.refundFailReason),r=e.status==="success"&&p.length>0&&a!==void 0,q=e.status==="refund"&&p.length>0&&u!==void 0,g=e.status==="failure"&&m!==void 0,A=["waiting","depositing","pending","submitted","failure","refund","success"].includes(e.status)?e.status==="failure"&&/TIMEOUT|EXPIRED/.test(typeof e.failReason=="string"?e.failReason:"")?"timeout":e.status:"unknown",k=r?"Relay reports destination fulfillment.":q?"Relay reports a refund on the origin chain; the destination was not fulfilled.":g?"The bridge failed and automatic refund is unavailable. Review the request with Relay.":"Bridge settlement is not confirmed. Poll Relay again; an origin receipt alone does not prove destination fulfillment.";return{requestId:n,status:A,relayStatus:e.status,fulfilled:r,settled:r||q,pollAgain:!r&&!q&&!g,needsAttention:g,timedOut:!1,inTxHashes:i,txHashes:p,originChainId:u,destinationChainId:a,failReason:s,refundFailReason:m,...e.updatedAt===void 0?{}:{updatedAt:v(String(e.updatedAt))},summary:k}}async function De(n,e){let i=s=>({destinationVerified:!1,destinationCheck:s}),p;try{if(p=w.clientFor(n),await p.getChainId()!==n)return i(`The configured RPC does not serve chain ${n}; destination receipts were not checked.`)}catch{return i(`No RPC is available for chain ${n}; destination receipts were not checked.`)}let u=[];for(let s of e)try{let m=await p.getTransactionReceipt({hash:s});u.push({hash:s,status:m.status,blockNumber:m.blockNumber.toString()})}catch{return{...i(`Receipt ${s} is not available on chain ${n} yet; poll again.`),destinationReceipts:u}}let a=u.length>0&&u.every(s=>s.status==="success");return{destinationVerified:a,destinationReceipts:u,destinationCheck:a?`Every Relay destination transaction has a successful receipt on chain ${n}. Amounts are not decoded here; compare the recipient balance for the exact delivered amount.`:`A Relay destination transaction did not succeed on chain ${n}; do not treat this bridge as delivered.`}}async function Pe(n){let e=await w.clientFor(l).readContract({address:n,abi:Me,functionName:"decimals"}),i=typeof e=="bigint"?Number(e):e;if(typeof i!="number"||!Number.isInteger(i)||i<0||i>255)throw new h("Could not read valid ERC-20 decimals() on-chain.");return i}async function _e(n,e){let i=d(e),p=d(n.recipient??i),u=W(n.destinationChainId);if(u===l)throw new h("Choose a destination chain other than 4663.");let a=Ae(n.originCurrency??z),s=a!==z,m=d(n.destinationCurrency??z),r=v(n.amount);if(r==="0")throw new h("Provide a positive bridge amount.");let q=n.minAmountOut===void 0?void 0:v(n.minAmountOut),g=n.slippageBps??pe;if(typeof g!="number")throw new h("Slippage must be an integer from 0 to 9999 bps.");de("0",g);let I=R((await U("/chains")).chains).map(t),A=I.find(o=>o.id===l),k=I.find(o=>o.id===u);if(!A||!k||A.disabled!==!1||k.disabled!==!1||A.depositEnabled!==!0||A.vmType!=="evm"||k.vmType!=="evm")throw new h("Relay does not currently support this outbound chain route.");if(!xe(u))throw new h(`Relay has no supported Oak return path from chain ${u}. Choose a destination supported by relay_bridge_in before bridge-out.`);let C=await $e(w.clientFor,u,i,"server"),b=s?await Pe(a):18,P=Math.floor(Date.now()/1e3)+ke,$=await U("/quote/v2",{user:i,recipient:p,originChainId:l,destinationChainId:u,originCurrency:a,destinationCurrency:m,amount:r,tradeType:"EXACT_INPUT",...s?{explicitDeposit:!0}:{}}),E=L($.requestId),S=t($.details),B=O(S.currencyIn),f=O(S.currencyOut),T={token:f.token,amount:v(t(S.currencyOut).minimumAmount)};if(c(d(S.sender)===i&&d(S.recipient)===p&&B.token.chainId===l&&B.token.address===a&&B.token.decimals===b&&B.amount===r&&f.token.chainId===u&&f.token.address===m&&BigInt(T.amount)>0n&&BigInt(T.amount)<=BigInt(f.amount)),m===z&&c(f.token.decimals===t(k.currency).decimals),q!==void 0){if(T.amount!==q)throw new h("Relay order minimum must exactly match minAmountOut. Request a new quote.")}else if(BigInt(T.amount)<BigInt(de(f.amount,g)))throw Te(f.amount,T.amount);let J=t(t($.protocol).v2),j=L(J.orderId),Z=t(J.orderData),Y=t(Z.output),ee=ue(Y.deadline),K=R(Z.inputs).map(t);c(K.length>0);let te=K.flatMap(o=>{let y=R(o.refunds).map(t);return c(y.length>0),y.map(we=>{if(d(we.recipient)!==i)throw new h("Relay refund recipient does not match the agent wallet. Request a new quote.");return ue(we.deadline)})}),Oe=te.reduce((o,y)=>Math.min(o,y),ee),ne=Math.min(P,Oe-Se),fe=()=>{if(Date.now()/1e3>=ne)throw new h("The Relay quote expired or its order/refund deadline leaves too little time to sign and send. Request a fresh bridge quote.")};fe();let H=R(Y.payments).map(t),ie=t(t(A.protocol).v2),Ne=t(t(k.protocol).v2),V=t(J.paymentDetails);c(Y.chainId===Ne.chainId&&H.length===1&&R(Y.calls).length===0&&d(H[0].recipient)===p&&d(H[0].currency)===m&&v(H[0].minimumAmount)===T.amount&&v(H[0].expectedAmount)===f.amount&&V.chainId===ie.chainId&&d(V.currency)===a&&v(V.amount)===r),c(d(V.depository)===N&&d(ie.depository)===N);let oe=t(K[0].payment);c(K.length===1&&oe.chainId===ie.chainId&&d(oe.currency)===a&&v(oe.amount)===r);let F=R($.steps).map(t),_=s&&F.length===2?F[0]:void 0;c(F.length===(_?2:1));let G=F[F.length-1];c(G.kind==="transaction"&&G.id==="deposit"&&G.requestId===E);let X=R(G.items).map(t);c(X.length===1&&X[0].status==="incomplete");let x=t(X[0].data),ye=t(X[0].check);if(c(ye.method==="GET"&&ye.endpoint===`/intents/status/v3?requestId=${E}`&&x.chainId===l&&d(x.from)===i&&d(x.to)===N&&v(x.value)===(s?"0":r)),typeof x.data!="string"||!(s?/^0x[0-9a-fA-F]{264}$/:/^0x[0-9a-fA-F]{136}$/).test(x.data))throw new h(`Relay returned unexpected ${s?"ERC-20":"native"} deposit calldata.`);let D=Fe({abi:Re,data:x.data});D.functionName==="depositErc20"?c(s&&d(D.args[0])===i&&d(D.args[1])===a&&D.args[2]===BigInt(r)&&M(D.args[3],j)):c(!s&&d(D.args[0])===i&&M(D.args[1],j));let Be=I.filter(o=>o.vmType==="evm"&&Q(o.protocol)&&Q(o.protocol.v2)).map(o=>t(t(o.protocol).v2).chainId).filter(o=>typeof o=="string");if(!M(Ee(Z,Be),j))throw new h("Relay order ID does not match the checked quote terms. Request a new quote.");let ae=s?w.approval(a,N,r,l):void 0;if(_&&ae){c(_.kind==="transaction"&&_.id==="approve"&&_.requestId===E);let o=R(_.items).map(t);c(o.length===1&&o[0].status==="incomplete");let y=t(o[0].data);c(y.chainId===l&&d(y.from)===i&&d(y.to)===a&&v(y.value)==="0"&&typeof y.data=="string"&&M(y.data,ae.data))}let ge=[...ae?await Ce(w,a,N,r,l,i):[],w.unsignedTx({to:N,data:x.data,value:s?"0":r,chainId:l,description:s?`Deposit ${r} base units of ${a} for Relay request ${E}.`:`Deposit native ETH for Relay request ${E}.`})],Ie=t($.fees);for(let o of Object.values(Ie))O(o);let se=await w.preview(ge,i);fe();let He=se.changes.map(o=>{let y=o.amount.startsWith("-");return`${y?"-":""}${w.formatAmount(y?o.amount.slice(1):o.amount,o.token.decimals)} ${o.token.symbol}`}).join(", ");return{txs:ge,requestId:E,orderId:j,recipient:p,originChainId:l,destinationChainId:u,expiresAt:String(ne),orderDeadline:String(ee),refundDeadlines:te.map(String),returnPath:C,amountIn:B,amountOut:f,minAmountOut:T,fees:Ie,expandedPriceImpact:S.expandedPriceImpact,timeEstimate:S.timeEstimate,preview:se,summary:`${C} Bridge to ${p} on chain ${u}; asset ${f.token.address} on chain ${f.token.chainId} (${me(f.token.symbol)}); expected ${f.amount}, minimum ${T.amount} base units (${f.token.decimals} decimals). Order deadline ${ee} Unix seconds; refund deadlines ${te.join(", ")} Unix seconds; accept before ${ne} Unix seconds to reserve ${Se}s to sign and send. Origin preview: ${He||se.summary}. Relay route fees are included in the quote; origin gas is separate. Poll relay_status with requestId ${E} after local submission; destination fulfillment is not yet confirmed.`}}return{tools:[{name:"relay_bridge_out",inputSchema:{type:"object",required:["destinationChainId","amount"],additionalProperties:!1,properties:{destinationChainId:{type:"integer",minimum:1},amount:{type:"string",pattern:"^[1-9][0-9]*$"},recipient:re,originCurrency:re,slippageBps:{type:"integer",minimum:0,maximum:9999,default:pe},destinationCurrency:{type:"string"},minAmountOut:ve()}},execute:async(n,e)=>{try{return await _e(n,e)}catch(i){throw new h(w.plainError(i))}}},{name:"relay_status",inputSchema:{type:"object",required:["requestId"],additionalProperties:!1,properties:{requestId:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"},verifyDestination:{type:"boolean"}}},execute:async n=>{let e=await he(L(n.requestId));return n.verifyDestination!==!0||!e.fulfilled||e.destinationChainId===void 0?e:{...e,...await De(e.destinationChainId,e.txHashes)}}}],positions:async n=>{let e=d(n);if(!process.env.OAK_RELAY_API_KEY?.trim())return[{module:"relay",id:"relay-discovery-unavailable",chainId:l,assets:[],incomplete:!0,description:'Relay pending bridge discovery requires OAK_RELAY_API_KEY on the server. The request-history API requires this key; no pending bridges were checked. Ask the operator to configure it, or check a known request with relay_status {"requestId":"<id>"}. Legacy vault shares on other chains can be checked with relay_vault_status {"chainId":1} or {"chainId":42161}.'}];let i=new Map;for(let p of["outbound","inbound"]){let u=new Set,a;do{let s=new URLSearchParams({user:e,[p==="outbound"?"originChainId":"destinationChainId"]:String(l),limit:"100",includePendingRequests:"true"});a&&s.set("continuation",a);let m=await U(`/requests/v3?${s}`);for(let r of R(m.requests).map(t)){let q=Q(r.depositAddress)?r.depositAddress.depositor:void 0;if(![r.user,r.sender,q].some($=>typeof $=="string"&&$.toLowerCase()===e))throw new h("Relay returned a request for another wallet.");let g=L(r.id);if(i.has(g))continue;let I=await he(g);if(I.settled)continue;let A=t(r.data),k=t(t(A.route).quoted),C=O(t(k.origin).inputCurrency),b={...C,token:{...C.token,symbol:me(C.token.symbol)??"unknown"}},P=O(t(k.destination).outputCurrency);c(p==="outbound"?b.token.chainId===l&&P.token.chainId!==l:b.token.chainId!==l&&P.token.chainId===l),I.originChainId!==void 0&&c(I.originChainId===b.token.chainId),I.destinationChainId!==void 0&&c(I.destinationChainId===P.token.chainId),i.set(g,{module:"relay",id:g,chainId:b.token.chainId,assets:[b],description:`Relay ${p} ${I.status}: ${b.amount} ${b.token.symbol} base units (${b.token.decimals} decimals) from chain ${b.token.chainId} toward ${d(r.recipient)} on chain ${P.token.chainId}. ${I.summary} Track with relay_status requestId ${g}.`})}if(m.continuation!==void 0&&m.continuation!==null&&typeof m.continuation!="string")throw new h("Relay returned invalid pagination.");if(a=typeof m.continuation=="string"&&m.continuation?m.continuation:void 0,a){if(u.has(a))throw new h("Relay repeated its pagination cursor. Pending positions are incomplete.");u.add(a)}}while(a)}return[...i.values()]}}};export{ze as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as $}from"./
|
|
1
|
+
import{c as $}from"./AW7AXQCZ.js";import{b as S,d as A,e as j,f as T,g as O,h as I,i as P,m as k,n as M,q as f,s as B}from"./64GOINYS.js";import{a as w,e as _}from"./NWNYJ26T.js";import{a as p}from"./FWD4L3CJ.js";import{a as d}from"./XSD5NL7J.js";function U(u){return{...u,token:{...u.token,symbol:f(u.token.symbol)??"unknown"}}}var J=u=>{let R=B(u);async function z(n,i){let g=T(i),r=I(n.originChainId),e=I(n.destinationChainId);if(r!==p&&e!==p)throw new d(`A Relay quote must start or end on chain ${p}.`);let h=O(n.originCurrency??S),b=O(n.destinationCurrency??S),c=T(n.recipient??g),a=P(n.amount);if(a==="0")throw new d("Provide a positive bridge amount.");let t=n.tradeType??"EXACT_INPUT";if(!["EXACT_INPUT","EXACT_OUTPUT","EXPECTED_OUTPUT"].includes(String(t)))throw new d("Choose EXACT_INPUT, EXACT_OUTPUT or EXPECTED_OUTPUT.");let m={};for(let E of["includedSwapSources","excludedSwapSources","includedOriginSwapSources","includedDestinationSwapSources"]){let y=n[E];if(y!==void 0){if(!Array.isArray(y)||y.length>100||y.some(x=>typeof x!="string"||!/^[A-Za-z0-9._ -]{1,128}$/.test(x)))throw new d("Provide valid Relay swap source names.");m[E]=y}}let N=await R("/quote/v2",{user:g,recipient:c,originChainId:r,destinationChainId:e,originCurrency:h,destinationCurrency:b,amount:a,tradeType:t,...m}),o=A(N.details),l=U(k(o.currencyIn)),s=U(k(o.currencyOut)),C=P(A(o.currencyOut).minimumAmount);M(T(o.sender)===g&&T(o.recipient)===c&&l.token.chainId===r&&l.token.address===h&&(t==="EXACT_INPUT"?l.amount===a:s.amount===a)&&s.token.chainId===e&&s.token.address===b&&BigInt(C)<=BigInt(s.amount));let F=Object.fromEntries(Object.entries(A(N.fees)).map(([E,y])=>[E,U(k(y))])),v=typeof o.timeEstimate=="number"&&Number.isFinite(o.timeEstimate)&&o.timeEstimate>=0?o.timeEstimate:void 0,X=e===p,q=X?"relay_bridge_in":"relay_bridge_out",D=t==="EXACT_INPUT"&&Object.keys(m).length===0&&r!==e&&(!X||$(r)!==void 0);return{executable:!1,nextAction:D?q:void 0,originChainId:r,destinationChainId:e,recipient:c,tradeType:t,amountIn:l,amountOut:s,minAmountOut:{token:s.token,amount:C},fees:F,slippage:{source:"provider",minimumAmount:C},...v===void 0?{}:{timeEstimateSeconds:v},summary:`Read-only Relay estimate: ${l.amount} base units of ${l.token.symbol} (${l.token.decimals} decimals) on chain ${r} for about ${s.amount}, minimum ${C}, base units of ${s.token.symbol} (${s.token.decimals} decimals) on chain ${e} for ${c}. Slippage: selected by Relay; Oak sent no slippage setting. The returned minimum above is the quote floor. Relay fees are already deducted from the output; origin gas is separate. Nothing was built or signed, and this estimate cannot be executed. ${D?`To bridge, call ${q}; it fetches a fresh quote and shows its own preview for human confirmation.`:"This estimate shape has no matching Oak execution path. No action will preserve these trade type or routing options."}`}}async function Z(n){let i=n.chainId===void 0?void 0:I(n.chainId),r=j((await R("/chains")).chains).map(A).flatMap(e=>{if(typeof e.id!="number"||!Number.isSafeInteger(e.id)||e.id<=0)return[];if(i!==void 0&&e.id!==i)return[];let h=e.disabled===!1,b=_(e.currency)?e.currency:{},c={chainId:e.id,name:f(e.displayName,"name")??f(e.name,"name")??String(e.id),vmType:f(e.vmType),nativeCurrency:{symbol:f(b.symbol),decimals:typeof b.decimals=="number"?b.decimals:void 0},bridgeIn:e.id!==p&&h&&$(e.id)!==void 0,bridgeOut:e.id!==p&&h&&e.vmType==="evm"};if(i===void 0)return[c];let a=new Map;for(let t of[...Array.isArray(e.featuredTokens)?e.featuredTokens:[],...Array.isArray(e.erc20Currencies)?e.erc20Currencies:[]]){if(!_(t)||typeof t.address!="string"||!new RegExp(w).test(t.address)||typeof t.decimals!="number"||!Number.isInteger(t.decimals)||t.decimals<0||t.decimals>255)continue;let m=T(t.address);a.has(m)||a.set(m,{address:m,symbol:f(t.symbol)??"unknown",decimals:t.decimals,bridgeable:t.supportsBridging===!0})}return[{...c,currencies:[...a.values()]}]});if(i!==void 0&&!r.length)throw new d(`Relay does not list chain ${i}.`);return{chains:r,summary:`${r.length} Relay chain${r.length===1?"":"s"}. bridgeIn marks origins relay_bridge_in can build from; bridgeOut marks destinations relay_bridge_out can reach. Currency lists are Relay-reported display data; bridgeable false means Relay does not bridge that token. Confirm token addresses before bridging.`}}return{tools:[{name:"relay_quote",inputSchema:{type:"object",additionalProperties:!1,required:["originChainId","destinationChainId","amount"],properties:{originChainId:{type:"integer",minimum:1},destinationChainId:{type:"integer",minimum:1},originCurrency:{type:"string",pattern:w},destinationCurrency:{type:"string",pattern:w},amount:{type:"string",pattern:"^[1-9][0-9]*$"},recipient:{type:"string",pattern:w},tradeType:{type:"string",enum:["EXACT_INPUT","EXACT_OUTPUT","EXPECTED_OUTPUT"]},...Object.fromEntries(["includedSwapSources","excludedSwapSources","includedOriginSwapSources","includedDestinationSwapSources"].map(n=>[n,{type:"array",maxItems:100,items:{type:"string",pattern:"^[A-Za-z0-9._ -]{1,128}$"}}]))}},execute:async(n,i)=>{try{return await z(n,i)}catch(g){throw new d(u.plainError(g))}}},{name:"relay_chains",inputSchema:{type:"object",additionalProperties:!1,properties:{chainId:{type:"integer",minimum:1}}},execute:async n=>{try{return await Z(n)}catch(i){throw new d(u.plainError(i))}}}]}};export{J as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as g,d as v}from"./VCOTCVKN.js";import{a as b,c as y,d}from"./QFNT73OF.js";import{ba as m}from"./ACW63WIL.js";import{h as f}from"./NWNYJ26T.js";import{a as c}from"./XSD5NL7J.js";import{erc20Abi as O}from"viem";async function C(r,n,s,l){if(!s.length)return[];let t=await r.multicall({allowFailure:!1,contracts:s.map(u=>({address:u,abi:O,functionName:"balanceOf",args:[n]})),blockNumber:l});if(!Array.isArray(t)||t.length!==s.length)throw new c("Borro share balances could not be read completely. Please try again.");return t.map(d)}async function V(r,n,s={}){y(n);let l=()=>{if(s.signal?.aborted)throw new c("Borro read was cancelled.")};l();let t=r.clientFor(4663),o=await(s.discoverVaults??g(r,s).discoverVaults)(t,{wallet:n,heldOnly:!0,...s.signal?{signal:s.signal}:{}});if(o.incomplete)throw new c("Borro discovery is incomplete, so these positions cannot be shown as complete. Please try again.");let h=o.shareBalances?.map(e=>e.vault)??[...new Set([...o.vaults.map(e=>e.vault),...o.refused.flatMap(e=>e.vault?[e.vault]:[])])],p=o.shareBalances?.map(e=>d(BigInt(e.amount)))??await C(t,n,h,BigInt(o.measuredAtBlock));l();let w=h.flatMap((e,i)=>p[i]>0n?[{vault:e,balance:p[i]}]:[]);return Promise.all(w.map(async({vault:e,balance:i})=>{let a=o.vaults.find(k=>f(k.vault,e));if(!a)throw new c("This wallet holds Borro shares whose vault could not be verified. Check the vault address before withdrawing.");let A=d(await t.readContract({address:e,abi:b,functionName:"convertToAssets",args:[i],blockNumber:BigInt(o.measuredAtBlock)}));l();let P={address:e,symbol:a.vaultSymbol,decimals:18,chainId:4663},B={address:a.asset,symbol:a.symbol,decimals:a.assetDecimals,chainId:4663};return{module:"borro",id:`4663:${e}`,chainId:4663,assets:[v(P,i)],oakNotice:m(),description:`${r.formatAmount(i.toString(),18)} ${a.vaultSymbol} = about ${r.formatAmount(A.toString(),a.assetDecimals)} ${B.symbol} lent through Borro. ${m()}`}}))}export{C as a,V as b};
|
|
@@ -0,0 +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:{codeHash:"0x6a482e5367e1aced7f5448e31e40140e4b899959376d040e0be502c37ce739b1"},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"};export{a};
|