@oakagentkit/core 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dist/api/history.js +1 -1
- package/build/dist/api/modules/borro/index.js +1 -1
- package/build/dist/api/modules/borro/positions.js +1 -1
- package/build/dist/api/modules/borro/reader.js +1 -1
- package/build/dist/api/modules/chop/actions.d.ts +13 -1
- package/build/dist/api/modules/chop/actions.js +1 -1
- package/build/dist/api/modules/chop/checks.js +1 -1
- package/build/dist/api/modules/chop/copy.d.ts +1 -0
- package/build/dist/api/modules/chop/copy.js +1 -1
- package/build/dist/api/modules/chop/display.d.ts +36 -0
- package/build/dist/api/modules/chop/display.js +1 -0
- package/build/dist/api/modules/chop/guard.js +1 -1
- package/build/dist/api/modules/chop/index.js +1 -1
- package/build/dist/api/modules/chop/pins.d.ts +1 -0
- package/build/dist/api/modules/chop/pins.js +1 -1
- package/build/dist/api/modules/chop/positions.js +1 -1
- package/build/dist/api/modules/chop/reader.d.ts +6 -1
- package/build/dist/api/modules/chop/reader.js +1 -1
- package/build/dist/api/modules/chop/types.d.ts +7 -0
- package/build/dist/api/modules/chop/unfarm.d.ts +16 -0
- package/build/dist/api/modules/chop/unfarm.js +1 -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/factor/actions.js +1 -1
- package/build/dist/api/modules/factor/api.js +1 -1
- package/build/dist/api/modules/factor/checks.js +1 -1
- package/build/dist/api/modules/factor/copy.d.ts +11 -11
- package/build/dist/api/modules/factor/copy.js +1 -1
- package/build/dist/api/modules/factor/guard.js +1 -1
- package/build/dist/api/modules/factor/index.js +1 -1
- package/build/dist/api/modules/factor/reader.js +1 -1
- package/build/dist/api/modules/fobo/client.js +1 -1
- package/build/dist/api/modules/fobo/index.js +1 -1
- package/build/dist/api/modules/gloam/index.js +1 -1
- package/build/dist/api/modules/grove/index.js +1 -1
- package/build/dist/api/modules/heyresearch/builder-feed.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/heyresearch/scan.js +1 -1
- package/build/dist/api/modules/heyresearch/token-facts.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/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-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/relay.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/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/pendle/index.js +1 -1
- package/build/dist/api/modules/pendle/reader.js +1 -1
- package/build/dist/api/modules/pendle/trade.js +1 -1
- package/build/dist/api/modules/pons/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/raeto/index.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/quote-guard.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/upoch/index.js +1 -1
- package/build/dist/api/modules/upoch/reads.js +1 -1
- package/build/dist/api/modules/wormhole/index.js +1 -1
- package/build/dist/api/prices.d.ts +5 -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/tokens.d.ts +1 -0
- package/build/dist/api/tokens.js +1 -1
- package/build/dist/api/usd-estimate.d.ts +2 -0
- package/build/dist/api/usd-estimate.js +1 -1
- package/build/dist/chunks/{UBVE2U6X.js → 2FOI2625.js} +1 -1
- package/build/dist/chunks/{5OTQCE2E.js → 2I7XHRTI.js} +1 -1
- package/build/dist/chunks/{SGHSCK22.js → 2PS4GCOZ.js} +1 -1
- package/build/dist/chunks/3BQ5XHDJ.js +1 -0
- package/build/dist/chunks/{PRBIC3UK.js → 3YH5B5NQ.js} +1 -1
- package/build/dist/chunks/{RUSXMQSJ.js → 4HQEJHCD.js} +1 -1
- package/build/dist/chunks/{ZFRTBBIW.js → 4IOHSX3Z.js} +1 -1
- package/build/dist/chunks/5H7NVE6O.js +1 -0
- package/build/dist/chunks/{JJGZ7W3V.js → 6AS3TGOX.js} +1 -1
- package/build/dist/chunks/{RK3PPFRX.js → 6CKCZJ3F.js} +1 -1
- package/build/dist/chunks/{HU2JXDLH.js → 6LVHN33V.js} +1 -1
- package/build/dist/chunks/7OOCAZBE.js +1 -0
- package/build/dist/chunks/{O3XWE4FO.js → 7TRO6MBQ.js} +1 -1
- package/build/dist/chunks/{WX7OYCNS.js → A4FLWHLP.js} +1 -1
- package/build/dist/chunks/{FP7DHVK2.js → A4K5GXVO.js} +1 -1
- package/build/dist/chunks/{AOX6DKYU.js → AL6UXNGH.js} +1 -1
- package/build/dist/chunks/{FQTO7VJG.js → C57DITTF.js} +1 -1
- package/build/dist/chunks/{ZTX4WT62.js → CFPJDLTZ.js} +1 -1
- package/build/dist/chunks/{SRHVSNPX.js → CNDIAF3P.js} +1 -1
- package/build/dist/chunks/{LEHBRAZX.js → CW37EGPL.js} +1 -1
- package/build/dist/chunks/{PQG3ULRT.js → DBOGRUPS.js} +1 -1
- package/build/dist/chunks/{T3QEN3S6.js → E47UYYK4.js} +1 -1
- package/build/dist/chunks/EPOIAXCV.js +3 -0
- package/build/dist/chunks/{DWQJ7NSX.js → FCVH4FYH.js} +1 -1
- package/build/dist/chunks/{V6EVQWAL.js → FHB7QYJO.js} +1 -1
- package/build/dist/chunks/FRT6AC6M.js +1 -0
- package/build/dist/chunks/{Z5YI6KLN.js → FRVCSDKU.js} +1 -1
- package/build/dist/chunks/{EIE2U4OX.js → G5AMH4IP.js} +1 -1
- package/build/dist/chunks/{EQEMI54U.js → GDUKZYE2.js} +1 -1
- package/build/dist/chunks/{GNOHIL4Q.js → GKUPC4DO.js} +1 -1
- package/build/dist/chunks/{K7HTDKAT.js → GMMTHTCP.js} +1 -1
- package/build/dist/chunks/{XHFAF5PZ.js → HDBZZOHJ.js} +1 -1
- package/build/dist/chunks/{Q4HSQL65.js → HPS4KOU4.js} +1 -1
- package/build/dist/chunks/IZP3EKKS.js +1 -0
- package/build/dist/chunks/{P6MPKIU2.js → J7OZLXSG.js} +1 -1
- package/build/dist/chunks/{PXUML7HJ.js → JDHPMS7X.js} +1 -1
- package/build/dist/chunks/{MOZBDCVV.js → JJSCDDQO.js} +1 -1
- package/build/dist/chunks/{EFESPGA2.js → KCZUJ57H.js} +1 -1
- package/build/dist/chunks/{2ILYVUFA.js → KKTOBXIT.js} +1 -1
- package/build/dist/chunks/{L6CVMDWQ.js → KO7ANIKY.js} +1 -1
- package/build/dist/chunks/{2T6O77QZ.js → LKUZAJPZ.js} +1 -1
- package/build/dist/chunks/{5GQJVKVY.js → LZM3DO5Q.js} +1 -1
- package/build/dist/chunks/M6JNGU4E.js +1 -0
- package/build/dist/chunks/{MEB727X5.js → M7OVMIIE.js} +1 -1
- package/build/dist/chunks/{RKM62HC5.js → MJGEGNDU.js} +1 -1
- package/build/dist/chunks/{SYERFEJ4.js → MQXSCNUL.js} +1 -1
- package/build/dist/chunks/N624NR7Y.js +1 -0
- package/build/dist/chunks/{X3YEDVRN.js → N65J3L2H.js} +1 -1
- package/build/dist/chunks/{2TX7HP6M.js → N742W5KX.js} +1 -1
- package/build/dist/chunks/{365B4YEV.js → NIWAVMDR.js} +1 -1
- package/build/dist/chunks/O2QBSINK.js +1 -0
- package/build/dist/chunks/{FA3GBXQP.js → O4P5IQCP.js} +1 -1
- package/build/dist/chunks/{HUKDISRE.js → OB3YMTDI.js} +1 -1
- package/build/dist/chunks/{WXZ4LAKO.js → PV7FEVBD.js} +1 -1
- package/build/dist/chunks/{4M6XBG6X.js → Q3Q3YHEX.js} +1 -1
- package/build/dist/chunks/QA6Z2CYP.js +2 -0
- package/build/dist/chunks/{BDLV42SD.js → QBNASL3T.js} +1 -1
- package/build/dist/chunks/{AHUCYDBC.js → QKIQ7ZKD.js} +1 -1
- package/build/dist/chunks/{7FYM7FJA.js → QMIH6HXH.js} +1 -1
- package/build/dist/chunks/{2QP6WGKZ.js → QQD4PV64.js} +1 -1
- package/build/dist/chunks/{KNBNKG7P.js → R66NSNNQ.js} +1 -1
- package/build/dist/chunks/{VQJXQLFW.js → RP5VCG54.js} +1 -1
- package/build/dist/chunks/{OKXKDDBX.js → RUHNLNVX.js} +1 -1
- package/build/dist/chunks/{VKNKVUAA.js → S37D7HOK.js} +1 -1
- package/build/dist/chunks/S47M3IPR.js +1 -0
- package/build/dist/chunks/S65KXMZ7.js +3 -0
- package/build/dist/chunks/{NYHKIXJR.js → SX5YNFHG.js} +1 -1
- package/build/dist/chunks/{MHONMLF6.js → TGXEKBLV.js} +1 -1
- package/build/dist/chunks/{VHK5AYC2.js → TJU644I7.js} +1 -1
- package/build/dist/chunks/{O56EZB5Y.js → TOIKOIY6.js} +1 -1
- package/build/dist/chunks/{YR44GQG4.js → TZ7S5KRB.js} +1 -1
- package/build/dist/chunks/UEOS6SHR.js +1 -0
- package/build/dist/chunks/{USZCTSPI.js → USGMGKAG.js} +1 -1
- package/build/dist/chunks/{W5FM2OVB.js → UUF4Z6K6.js} +1 -1
- package/build/dist/chunks/{PMFR47H3.js → VREGY7E6.js} +1 -1
- package/build/dist/chunks/{2YYKQGJZ.js → W7BFM6CK.js} +1 -1
- package/build/dist/chunks/{3D7FXI6G.js → WQ2XTDHO.js} +1 -1
- package/build/dist/chunks/WRA3ZC6W.js +1 -0
- package/build/dist/chunks/{K3TZYPSV.js → XADHV2DT.js} +1 -1
- package/build/dist/chunks/{LVFI74ST.js → XNJ6NDQQ.js} +1 -1
- package/build/dist/chunks/{DD47RZFU.js → XTXXWRN2.js} +1 -1
- package/build/dist/chunks/{CZ66MYKR.js → XWC6IC5E.js} +1 -1
- package/build/dist/chunks/{DMB64UIN.js → YWVPK3DV.js} +1 -1
- package/build/dist/chunks/{WNWRF4HE.js → YZHJ4BAP.js} +1 -1
- package/build/dist/chunks/{4PB6MSGZ.js → ZKBOPZH5.js} +1 -1
- package/build/dist/chunks/{5ZVIAGLX.js → ZQPC54J5.js} +1 -1
- package/build/dist/chunks/{HDBDBKEA.js → ZVY7GGSP.js} +1 -1
- package/build/dist/chunks/{LQSPWRHN.js → ZX43P4BK.js} +1 -1
- package/build/dist/chunks/{PQOWIRKQ.js → ZXFJKW6H.js} +1 -1
- package/build/dist/chunks/{N6PHSHBE.js → ZXRIJG6H.js} +1 -1
- package/package.json +1 -1
- package/build/dist/chunks/3AOTYJPX.js +0 -1
- package/build/dist/chunks/4E7FJQLL.js +0 -1
- package/build/dist/chunks/4J245N3F.js +0 -1
- package/build/dist/chunks/BA66J5YQ.js +0 -1
- package/build/dist/chunks/BIY2F6MO.js +0 -1
- package/build/dist/chunks/DGCJZ3HO.js +0 -1
- package/build/dist/chunks/DHX3Q5RV.js +0 -2
- package/build/dist/chunks/EFUACKDK.js +0 -1
- package/build/dist/chunks/JW7GLNLB.js +0 -3
- package/build/dist/chunks/MIKQWF6Q.js +0 -3
- package/build/dist/chunks/P7C3TYI4.js +0 -1
- package/build/dist/chunks/ZNX3YVF2.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as W}from"./USZCTSPI.js";import{b as N}from"./4J245N3F.js";import{a as k}from"./66F5ZH34.js";import{c as b,i as q,l as j}from"./NWNYJ26T.js";import{b as l}from"./TI727O2H.js";import{a as o}from"./XSD5NL7J.js";import{a as R}from"./JXOEJPJ4.js";import{encodeFunctionData as ye,erc20Abi as X,getAddress as S,zeroAddress as U}from"viem";var v={locker:{address:"0xd0f7d8c6e9f6d80c297bebe4f7fd1b9c8125c32f",source:"https://sourcify.dev/server/v2/contract/4663/0xd0f7d8c6e9f6d80c297bebe4f7fd1b9c8125c32f?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-07-08T19:01:30Z",fetchedAt:"2026-10-31",abi:[{name:"Extended",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"newUnlockTime",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"LockOwnershipTransferred",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Locked",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"},{name:"unlockTime",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Withdrawn",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"extend",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newUnlockTime",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"fee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"getLock",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"owner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"},{name:"withdrawn",type:"bool",internalType:"bool"}],internalType:"struct RobinhoodLocker.Lock"}],stateMutability:"view"},{name:"isUnlocked",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"lock",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"lockedAmount",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"locks",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"owner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"},{name:"withdrawn",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"locksByOwner",type:"function",inputs:[{name:"o",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"locksByToken",type:"function",inputs:[{name:"t",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"nextLockId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"setAdmin",type:"function",inputs:[{name:"a",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFee",type:"function",inputs:[{name:"_fee",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"timeRemaining",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"totalLocks",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"transferLockOwnership",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newOwner",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdraw",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"}]},burner:{address:"0x6bf43ca706faa8ea46803299c191484e82280652",source:"https://sourcify.dev/server/v2/contract/4663/0x6bf43ca706faa8ea46803299c191484e82280652?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-07-22T23:28:15Z",fetchedAt:"2026-10-31",abi:[{name:"Burned",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"burner",type:"address",indexed:!0,internalType:"address"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"DEAD",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"burn",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"burns",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"burner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"timestamp",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"burnsByBurner",type:"function",inputs:[{name:"b",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"burnsByToken",type:"function",inputs:[{name:"t",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"fee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"getBurn",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"burner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"timestamp",type:"uint256",internalType:"uint256"}],internalType:"struct RobinhoodBurner.Burn"}],stateMutability:"view"},{name:"nextBurnId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"setAdmin",type:"function",inputs:[{name:"a",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFee",type:"function",inputs:[{name:"_fee",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"totalBurnedOf",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"totalBurns",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"}]},vesting:{address:"0x910e19bcC4bce46999994Ed7297E0Fc4431ec72E",source:"https://sourcify.dev/server/v2/contract/4663/0x910e19bcC4bce46999994Ed7297E0Fc4431ec72E?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-07-27T00:28:59Z",fetchedAt:"2026-10-31",abi:[{name:"AdminTransferStarted",type:"event",inputs:[{name:"current",type:"address",indexed:!0,internalType:"address"},{name:"pending",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AdminTransferred",type:"event",inputs:[{name:"previous",type:"address",indexed:!0,internalType:"address"},{name:"current",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"BeneficiaryTransferred",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Claimed",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"beneficiary",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeCollectorChanged",type:"event",inputs:[{name:"collector",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"FeesWithdrawn",type:"event",inputs:[{name:"collector",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"VestingCreated",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"beneficiary",type:"address",indexed:!0,internalType:"address"},{name:"creator",type:"address",indexed:!1,internalType:"address"},{name:"total",type:"uint256",indexed:!1,internalType:"uint256"},{name:"start",type:"uint64",indexed:!1,internalType:"uint64"},{name:"cliff",type:"uint64",indexed:!1,internalType:"uint64"},{name:"end",type:"uint64",indexed:!1,internalType:"uint64"}],anonymous:!1},{name:"MAX_BATCH",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_FEE",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MIN_DURATION",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"acceptAdmin",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"accruedFees",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"claim",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"claimable",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"create",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"beneficiary",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"start",type:"uint64",internalType:"uint64"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"end",type:"uint64",internalType:"uint64"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"createMany",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"beneficiaries",type:"address[]",internalType:"address[]"},{name:"amounts",type:"uint256[]",internalType:"uint256[]"},{name:"start",type:"uint64",internalType:"uint64"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"end",type:"uint64",internalType:"uint64"}],outputs:[{name:"firstId",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"fee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"getSchedule",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"creator",type:"address",internalType:"address"},{name:"start",type:"uint64",internalType:"uint64"},{name:"beneficiary",type:"address",internalType:"address"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"token",type:"address",internalType:"address"},{name:"end",type:"uint64",internalType:"uint64"},{name:"total",type:"uint128",internalType:"uint128"},{name:"claimed",type:"uint128",internalType:"uint128"}],internalType:"struct RobinhoodVesting.Schedule"}],stateMutability:"view"},{name:"nextScheduleId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"pendingAdmin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"schedules",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"creator",type:"address",internalType:"address"},{name:"start",type:"uint64",internalType:"uint64"},{name:"beneficiary",type:"address",internalType:"address"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"token",type:"address",internalType:"address"},{name:"end",type:"uint64",internalType:"uint64"},{name:"total",type:"uint128",internalType:"uint128"},{name:"claimed",type:"uint128",internalType:"uint128"}],stateMutability:"view"},{name:"schedulesByBeneficiary",type:"function",inputs:[{name:"b",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"schedulesByCreator",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"schedulesByToken",type:"function",inputs:[{name:"token",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"setFee",type:"function",inputs:[{name:"_fee",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"totalSchedules",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"transferAdmin",type:"function",inputs:[{name:"newAdmin",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"transferBeneficiary",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newBeneficiary",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdrawFees",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"}]},airdrop:{address:"0x6B1fE7b821001144Ee74EEA258b0AafdE20102E8",source:"https://sourcify.dev/server/v2/contract/4663/0x6B1fE7b821001144Ee74EEA258b0AafdE20102E8?fields=abi,sources,compilation",match:"match",verifiedAt:"2026-07-30T16:48:51Z",fetchedAt:"2026-10-31",abi:[{name:"AdminTransferStarted",type:"event",inputs:[{name:"current",type:"address",indexed:!0,internalType:"address"},{name:"pending",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AdminTransferred",type:"event",inputs:[{name:"previous",type:"address",indexed:!0,internalType:"address"},{name:"current",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AirdropCreated",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"creator",type:"address",indexed:!0,internalType:"address"},{name:"merkleRoot",type:"bytes32",indexed:!1,internalType:"bytes32"},{name:"total",type:"uint256",indexed:!1,internalType:"uint256"},{name:"maxClaims",type:"uint32",indexed:!1,internalType:"uint32"},{name:"endTime",type:"uint64",indexed:!1,internalType:"uint64"},{name:"listURI",type:"string",indexed:!1,internalType:"string"}],anonymous:!1},{name:"Claimed",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"index",type:"uint256",indexed:!1,internalType:"uint256"},{name:"account",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"feeBase",type:"uint256",indexed:!1,internalType:"uint256"},{name:"feePerWallet",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeCollectorChanged",type:"event",inputs:[{name:"collector",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"FeesWithdrawn",type:"event",inputs:[{name:"collector",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Swept",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"creator",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"MAX_FEE",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_RECIPIENTS",type:"function",inputs:[],outputs:[{name:"",type:"uint32",internalType:"uint32"}],stateMutability:"view"},{name:"MAX_URI",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MIN_WINDOW",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"acceptAdmin",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"accruedFees",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"airdrops",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"creator",type:"address",internalType:"address"},{name:"endTime",type:"uint64",internalType:"uint64"},{name:"maxClaims",type:"uint32",internalType:"uint32"},{name:"token",type:"address",internalType:"address"},{name:"claims",type:"uint32",internalType:"uint32"},{name:"swept",type:"bool",internalType:"bool"},{name:"merkleRoot",type:"bytes32",internalType:"bytes32"},{name:"total",type:"uint128",internalType:"uint128"},{name:"remaining",type:"uint128",internalType:"uint128"}],stateMutability:"view"},{name:"claim",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"index",type:"uint256",internalType:"uint256"},{name:"account",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"proof",type:"bytes32[]",internalType:"bytes32[]"}],outputs:[],stateMutability:"nonpayable"},{name:"create",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"merkleRoot",type:"bytes32",internalType:"bytes32"},{name:"total",type:"uint256",internalType:"uint256"},{name:"maxClaims",type:"uint32",internalType:"uint32"},{name:"endTime",type:"uint64",internalType:"uint64"},{name:"uri",type:"string",internalType:"string"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"feeBase",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"feePerWallet",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"getAirdrop",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"creator",type:"address",internalType:"address"},{name:"endTime",type:"uint64",internalType:"uint64"},{name:"maxClaims",type:"uint32",internalType:"uint32"},{name:"token",type:"address",internalType:"address"},{name:"claims",type:"uint32",internalType:"uint32"},{name:"swept",type:"bool",internalType:"bool"},{name:"merkleRoot",type:"bytes32",internalType:"bytes32"},{name:"total",type:"uint128",internalType:"uint128"},{name:"remaining",type:"uint128",internalType:"uint128"}],internalType:"struct RobinhoodAirdrop.Airdrop"}],stateMutability:"view"},{name:"isClaimed",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"index",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"listURI",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"string",internalType:"string"}],stateMutability:"view"},{name:"nextAirdropId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"pendingAdmin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"quote",type:"function",inputs:[{name:"maxClaims",type:"uint32",internalType:"uint32"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"setFee",type:"function",inputs:[{name:"_feeBase",type:"uint256",internalType:"uint256"},{name:"_feePerWallet",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"sweep",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"totalAirdrops",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"transferAdmin",type:"function",inputs:[{name:"newAdmin",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdrawFees",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"}]},liquidityLocker:{address:"0x91Aa2dA1956C77F8448E18DCaf53383bCc658e67",source:"https://sourcify.dev/server/v2/contract/4663/0x91Aa2dA1956C77F8448E18DCaf53383bCc658e67?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-10-04T15:10:02Z",fetchedAt:"2026-10-31",abi:[{name:"AdminTransferStarted",type:"event",inputs:[{name:"next",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AdminTransferred",type:"event",inputs:[{name:"previous",type:"address",indexed:!0,internalType:"address"},{name:"next",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"CollectFailed",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"}],anonymous:!1},{name:"CollectFeeChanged",type:"event",inputs:[{name:"bps",type:"uint16",indexed:!1,internalType:"uint16"}],anonymous:!1},{name:"Collected",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount0",type:"uint256",indexed:!1,internalType:"uint256"},{name:"amount1",type:"uint256",indexed:!1,internalType:"uint256"},{name:"cut0",type:"uint256",indexed:!1,internalType:"uint256"},{name:"cut1",type:"uint256",indexed:!1,internalType:"uint256"},{name:"byAdmin",type:"bool",indexed:!1,internalType:"bool"}],anonymous:!1},{name:"CutDeferred",type:"event",inputs:[{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"CutSwept",type:"event",inputs:[{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"EthClaimed",type:"event",inputs:[{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"EthCredited",type:"event",inputs:[{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Extended",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"newUnlockTime",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeRecipientChanged",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"recipient",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"FeeVaultChanged",type:"event",inputs:[{name:"vault",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"FixedFeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"HookAllowedChanged",type:"event",inputs:[{name:"hook",type:"address",indexed:!0,internalType:"address"},{name:"allowed",type:"bool",indexed:!1,internalType:"bool"}],anonymous:!1},{name:"KeeperChanged",type:"event",inputs:[{name:"keeper",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"LockOwnershipTransferred",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Locked",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"manager",type:"address",indexed:!0,internalType:"address"},{name:"tokenId",type:"uint256",indexed:!1,internalType:"uint256"},{name:"token0",type:"address",indexed:!1,internalType:"address"},{name:"token1",type:"address",indexed:!1,internalType:"address"},{name:"pool",type:"bytes32",indexed:!1,internalType:"bytes32"},{name:"unlockTime",type:"uint256",indexed:!1,internalType:"uint256"},{name:"collectFeeBps",type:"uint16",indexed:!1,internalType:"uint16"},{name:"hookVerified",type:"bool",indexed:!1,internalType:"bool"},{name:"feeRecipient",type:"address",indexed:!1,internalType:"address"},{name:"fixedFeePaid",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"PausedChanged",type:"event",inputs:[{name:"paused",type:"bool",indexed:!1,internalType:"bool"}],anonymous:!1},{name:"PreLockFeesReturned",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"amount0",type:"uint256",indexed:!1,internalType:"uint256"},{name:"amount1",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Rescued",type:"event",inputs:[{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"RevenueSinkChanged",type:"event",inputs:[{name:"sink",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"ShareRedirected",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"StrayPositionReturned",type:"event",inputs:[{name:"manager",type:"address",indexed:!0,internalType:"address"},{name:"tokenId",type:"uint256",indexed:!0,internalType:"uint256"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Withdrawn",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"BATCH_GAS_PER_LOCK",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_BATCH",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_COLLECT_FEE_BPS",type:"function",inputs:[],outputs:[{name:"",type:"uint16",internalType:"uint16"}],stateMutability:"view"},{name:"MAX_FIXED_FEE",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_LOCK_DURATION",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MIN_COLLECT_FEE_BPS",type:"function",inputs:[],outputs:[{name:"",type:"uint16",internalType:"uint16"}],stateMutability:"view"},{name:"V3_FACTORY",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"V3_POSITIONS",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"contract IV3PositionManager"}],stateMutability:"view"},{name:"V4_POOL_MANAGER",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"V4_POSITIONS",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"contract IV4PositionManager"}],stateMutability:"view"},{name:"acceptAdmin",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"adminCollect",type:"function",inputs:[{name:"ids",type:"uint256[]",internalType:"uint256[]"}],outputs:[],stateMutability:"nonpayable"},{name:"claimOwedEth",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"claimOwedEthTo",type:"function",inputs:[{name:"to",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"collect",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"collectFeeBps",type:"function",inputs:[],outputs:[{name:"",type:"uint16",internalType:"uint16"}],stateMutability:"view"},{name:"collectMany",type:"function",inputs:[{name:"ids",type:"uint256[]",internalType:"uint256[]"}],outputs:[],stateMutability:"nonpayable"},{name:"collectOneIsolated",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"byAdmin",type:"bool",internalType:"bool"}],outputs:[],stateMutability:"nonpayable"},{name:"cutOf",type:"function",inputs:[{name:"amount",type:"uint256",internalType:"uint256"},{name:"bps",type:"uint16",internalType:"uint16"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"pure"},{name:"extend",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newUnlockTime",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"feeVault",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"fixedFee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"getLock",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"owner",type:"address",internalType:"address"},{name:"unlockTime",type:"uint40",internalType:"uint40"},{name:"collectFeeBps",type:"uint16",internalType:"uint16"},{name:"isV4",type:"bool",internalType:"bool"},{name:"hookVerified",type:"bool",internalType:"bool"},{name:"withdrawn",type:"bool",internalType:"bool"},{name:"feeRecipient",type:"address",internalType:"address"},{name:"token0",type:"address",internalType:"address"},{name:"token1",type:"address",internalType:"address"},{name:"tokenId",type:"uint256",internalType:"uint256"}],internalType:"struct HoodLockLPLocker.Lock"}],stateMutability:"view"},{name:"hookAllowed",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"isUnlocked",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"keeper",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"lock",type:"function",inputs:[{name:"manager",type:"address",internalType:"address"},{name:"tokenId",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"},{name:"feeRecipient",type:"address",internalType:"address"},{name:"acceptUnverifiedHook",type:"bool",internalType:"bool"},{name:"maxCollectFeeBps",type:"uint16",internalType:"uint16"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"lockIdOf",type:"function",inputs:[{name:"",type:"address",internalType:"address"},{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"locksOf",type:"function",inputs:[{name:"owner",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"name",type:"function",inputs:[],outputs:[{name:"",type:"string",internalType:"string"}],stateMutability:"view"},{name:"nextLockId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"onERC721Received",type:"function",inputs:[{name:"",type:"address",internalType:"address"},{name:"",type:"address",internalType:"address"},{name:"",type:"uint256",internalType:"uint256"},{name:"",type:"bytes",internalType:"bytes"}],outputs:[{name:"",type:"bytes4",internalType:"bytes4"}],stateMutability:"pure"},{name:"owedEth",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"paused",type:"function",inputs:[],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"pendingAdmin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"pendingCut",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"pushOwedEth",type:"function",inputs:[{name:"who",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"rescueERC20",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"to",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"returnStrayPosition",type:"function",inputs:[{name:"manager",type:"address",internalType:"address"},{name:"tokenId",type:"uint256",internalType:"uint256"},{name:"to",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"revenueSink",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"setCollectFeeBps",type:"function",inputs:[{name:"bps",type:"uint16",internalType:"uint16"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeRecipient",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"recipient",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeVault",type:"function",inputs:[{name:"vault",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFixedFee",type:"function",inputs:[{name:"fee_",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setHookAllowed",type:"function",inputs:[{name:"hook",type:"address",internalType:"address"},{name:"allowed",type:"bool",internalType:"bool"}],outputs:[],stateMutability:"nonpayable"},{name:"setKeeper",type:"function",inputs:[{name:"k",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setPaused",type:"function",inputs:[{name:"p",type:"bool",internalType:"bool"}],outputs:[],stateMutability:"nonpayable"},{name:"setRevenueSink",type:"function",inputs:[{name:"sink",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"sweepPendingCut",type:"function",inputs:[{name:"token",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"transferAdmin",type:"function",inputs:[{name:"next",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"transferLockOwnership",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newOwner",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdraw",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"to",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"}]}};var _e=v,Ie=S(v.vesting.address),Ee=["hoodlock_read","hoodlock_record","hoodlock_vesting_status","hoodlock_public"],Le=["hoodlock_vesting_create","hoodlock_vesting_claim","hoodlock_vesting_transfer","hoodlock_withdraw","hoodlock_extend","hoodlock_transfer_lock","hoodlock_set_fee_recipient","hoodlock_collect","hoodlock_airdrop_sweep","hoodlock_recover","hoodlock_admin"],C=k("Decimal record ID, including zero for token locks, burns, vesting and airdrops. LP IDs start at one."),le={id:C,kind:{type:"string",enum:["token","v2","v3","v4"],description:"Lock type: token = ERC-20 token lock; v2 = V2 LP-token lock; v3 or v4 = Uniswap v3 or v4 liquidity-position (NFT) lock."}},Y=(1n<<256n)-1n;function m(e,n,t=256){if(typeof e!="string"||!/^\d+$/.test(e))throw new o(`${n} must be a decimal base-unit string.`);let a=BigInt(e);if(a>(1n<<BigInt(t))-1n)throw new o(`${n} exceeds uint${t}.`);return a}function f(e,n,t=!1){let a=q(e,`Provide a valid ${n} address.`);return t?a:j(a,`${n} must not be the zero address.`)}function ce(e,n){let t=m(e,n);if(t===0n||t===Y)throw new o(`${n} must be a positive exact amount, never unlimited.`);return t}function Q(e){if(typeof e!="string"||!Object.hasOwn(v,e))throw new o("Choose locker, burner, vesting, airdrop or liquidityLocker.");return e}function B(e){return v[e].abi}function h(e){return S(v[e].address)}function D(e,n){let t=B(e).find(a=>a.type==="function"&&a.name===n);if(!t)throw new o(`No published HoodLock ${e}.${n} function exists.`);return t}async function p(e,n,t,a=[]){return e.clientFor(l).readContract({address:h(n),abi:B(n),functionName:t,args:a})}function F(e,n){if(Array.isArray(e))return Object.fromEntries(n.map((t,a)=>[t,e[a]]));if(e&&typeof e=="object")return e;throw new o("HoodLock returned an invalid record. Retry the chain read.")}var me=["owner","token","amount","unlockTime","withdrawn"],fe=["owner","unlockTime","collectFeeBps","isV4","hookVerified","withdrawn","feeRecipient","token0","token1","tokenId"],ee=["creator","start","beneficiary","cliff","token","end","total","claimed"],K=["creator","endTime","maxClaims","token","claims","swept","merkleRoot","total","remaining"];function x(e){return JSON.parse(JSON.stringify(e,(n,t)=>typeof t=="bigint"?t.toString():t))}async function g(e,n){let t=f(n,"token",!0);if(t===U)return N;let a=e.clientFor(l),[i,s]=await Promise.all([a.readContract({address:t,abi:X,functionName:"symbol"}),a.readContract({address:t,abi:X,functionName:"decimals"})]);if(!Number.isInteger(s)||s<0||s>255)throw new o("Token decimals are invalid.");return{address:t,chainId:l,symbol:R(String(i)),decimals:s}}function _(e,n,t="current owner"){if(f(e,t)!==S(n))throw new o(`This wallet is not the ${t}.`)}function z(e){if(e.withdrawn)throw new o("This HoodLock lock was already withdrawn.")}function Z(e){if(!["token","v2","v3","v4"].includes(String(e.kind)))throw new o("Provide kind: token, v2, v3 or v4.");return e.kind==="token"||e.kind==="v2"?"locker":"liquidityLocker"}async function H(e,n,t){return F(await p(e,n,"getLock",[t]),n==="locker"?me:fe)}function G(e,n){if((e.kind==="v3"||e.kind==="v4")&&!!n.isV4!=(e.kind==="v4"))throw new o("Lock kind disagrees with the on-chain NFT version.")}async function T(e,n,t,a,i,s,r=0n,u=[]){let d=e.unsignedTx({to:h(t),chainId:l,value:r.toString(),data:ye({abi:B(t),functionName:a,args:i}),description:s}),c=await e.preview([...u,d],S(n));return{txs:c.txs,preview:c,summary:s,contract:h(t),chainId:l,method:a,arguments:x(i)}}function w(e,n,t,a,i){return{name:n,inputSchema:{type:"object",properties:t,required:a,additionalProperties:!1},async execute(s,r){try{return await i(s,S(r))}catch(u){throw new o(e.plainError(u))}}}}async function Te(e,n,t){let a=f(n.token,"token"),i=m(n.start,"start",64),s=m(n.cliff,"cliff",64),r=m(n.end,"end",64),[u,d,c,y,M]=await Promise.all([e.clientFor(l).getBlock(),p(e,"vesting","fee"),p(e,"vesting","MIN_DURATION"),p(e,"vesting","MAX_BATCH"),g(e,a)]);if(i>s||s>r||r<=i)throw new o("Vesting dates require start <= cliff <= end and end > start.");if(r>=1000000000000n||r<=u.timestamp+BigInt(String(c))+30n)throw new o("Vesting end must be Unix seconds, more than 24 hours plus a 30-second inclusion margin after the current block.");let I=n.entries!==void 0;if(I&&(n.beneficiary!==void 0||n.amount!==void 0))throw new o("Use entries or beneficiary/amount, not both.");if(I&&(!Array.isArray(n.entries)||n.entries.length===0||n.entries.length>Number(y)))throw new o(`Provide between 1 and ${String(y)} vesting entries.`);let L=I?n.entries:[{beneficiary:n.beneficiary,amount:n.amount}],P=L.map(A=>f(A?.beneficiary,"beneficiary")),O=L.map(A=>ce(A?.amount,"amount"));if(O.some(A=>A>=1n<<128n))throw new o("Each vesting amount must fit uint128.");let $=O.reduce((A,de)=>A+de,0n);if($>=Y)throw new o("Vesting total exceeds the exact approval range.");let E=BigInt(String(d))*BigInt(L.length);if(n.maxFee!==void 0&&E>m(n.maxFee,"maxFee"))throw new o("Live vesting fee exceeds maxFee.");let re=I?"createMany":"create",oe=I?[a,P,O,i,s,r]:[a,P[0],O[0],i,s,r],ue=`Create ${L.length} irrevocable HoodLock vesting schedule(s): ${$} ${M.symbol} base units (${a}, decimals ${M.decimals}) for ${P.join(", ")}; start ${i}, cliff ${s}, end ${r}; exact fee ${E} wei. Creator cannot cancel or recover principal. Recorded totals use tokens actually received; preserve mined schedule IDs.`;return W(e,{...await T(e,t,"vesting",re,oe,ue,E,[e.approval(a,h("vesting"),$.toString(),l)]),token:M,amount:$.toString(),fee:{token:N,amount:E.toString()}},h("vesting"),E)}async function te(e,n){let t=F(await p(e,"vesting","getSchedule",[n]),ee);if(BigInt(String(t.total))===0n)throw new o("No HoodLock vesting schedule exists for this ID.");let[a,i]=await Promise.all([p(e,"vesting","claimable",[n]),g(e,t.token)]);return{id:n.toString(),contract:h("vesting"),chainId:l,schedule:x(t),token:i,claimable:String(a),remaining:(BigInt(String(t.total))-BigInt(String(t.claimed))).toString(),proofUrl:`https://hoodlock.tech/proof/vesting/${n}`}}async function ne(e,n,t){let a=n.account===void 0?t:f(n.account,"account"),i=n.role??"beneficiary";if(!["beneficiary","creator","token"].includes(String(i)))throw new o("Choose beneficiary, creator or token for vesting discovery.");let r=await p(e,"vesting",i==="creator"?"schedulesByCreator":i==="token"?"schedulesByToken":"schedulesByBeneficiary",[a]),u=[];for(let d of[...new Set(r.map(String))]){let c=await te(e,BigInt(d));(i!=="beneficiary"||f(c.schedule.beneficiary,"beneficiary")===a)&&u.push(c)}return{account:a,role:i,schedules:u,summary:`Found ${u.length} HoodLock vesting schedule(s); completed schedules remain visible.`}}async function J(e,n,t){return n.id===void 0?ne(e,n,t):te(e,m(n.id,"id"))}function Oe(e){return{tools:[w(e,"hoodlock_vesting_create",{token:{...b,description:"Address of the ERC-20 token to vest. The wallet approves and transfers it to the vesting contract."},beneficiary:{...b,description:"Address that receives the vested tokens (single schedule). Use this with amount, or use entries, not both."},amount:k('Amount of the token to vest, in base units of that token (read its decimals). Example: "1000000000000000000" = 1 token at 18 decimals. Single schedule only.'),entries:{type:"array",minItems:1,maxItems:200,description:"Batch of schedules sharing one token, start, cliff and end. Use this instead of beneficiary and amount.",items:{type:"object",properties:{beneficiary:{...b,description:"Address that receives this entry's vested tokens."},amount:k('Amount of the token vested to this beneficiary, in base units of that token (read its decimals). Example: "1000000000000000000" = 1 token at 18 decimals.')},required:["beneficiary","amount"],additionalProperties:!1}},start:k('Vesting start time in Unix seconds, as a decimal string. Example: "1800000000".'),cliff:k("Cliff time in Unix seconds, between start and end; nothing is claimable before it."),end:k("Vesting end time in Unix seconds, more than 24 hours after the current block."),maxFee:k("Optional cap on the total creation fee in wei of native ETH (1 ETH = 10^18 wei); the call fails if the live fee is higher.")},["token","start","cliff","end"],(t,a)=>Te(e,t,a)),w(e,"hoodlock_vesting_status",{id:C,account:{...b,description:"Address to list vesting schedules for when no id is given. Defaults to the connected wallet."},role:{type:"string",enum:["beneficiary","creator","token"],description:"How account relates to the schedules when listing: beneficiary (default), creator, or the vested token address."}},[],(t,a)=>J(e,t,a)),...["claim","transfer"].map(t=>w(e,`hoodlock_vesting_${t}`,{id:C,...t==="transfer"?{beneficiary:{...b,description:"Address of the new beneficiary who takes over the remaining vesting rights."}}:{}},t==="transfer"?["id","beneficiary"]:["id"],async(a,i)=>{let s=m(a.id,"id"),r=F(await p(e,"vesting","getSchedule",[s]),ee);if(_(r.beneficiary,i,"current beneficiary"),t==="transfer"){let c=f(a.beneficiary,"beneficiary");return T(e,i,"vesting","transferBeneficiary",[s,c],`Transfer beneficiary rights for vesting #${s} from ${i} to ${c}. Remaining tokens follow the schedule; creator cannot revoke it.`)}let u=BigInt(String(await p(e,"vesting","claimable",[s])));if(u===0n)throw new o("Nothing is claimable yet; check the cliff and previous claims.");let d=await g(e,r.token);return{...await T(e,i,"vesting","claim",[s],`Claim currently ${u} ${d.symbol} base units from vesting #${s} to current beneficiary ${i}; live inclusion time determines the final amount.`),token:d,amount:u.toString()}})),...["withdraw","extend","transfer_lock","set_fee_recipient"].map(t=>w(e,`hoodlock_${t}`,{...le,...t==="withdraw"?{to:{...b,description:"Address that receives the withdrawn position NFT or LP; defaults to the connected wallet. Token locks withdraw only to the owner."}}:t==="extend"?{unlockTime:k('New unlock time in Unix seconds, later than the current unlock time and in the future (at most 100 years). Example: "1800000000".')}:t==="transfer_lock"?{owner:{...b,description:"Address of the new lock owner, who can withdraw after maturity."}}:{recipient:{...b,description:"Address that receives future collected fees for this NFT lock."}}},["kind","id",...t==="extend"?["unlockTime"]:t==="transfer_lock"?["owner"]:t==="set_fee_recipient"?["recipient"]:[]],async(a,i)=>{let s=Z(a),r=m(a.id,"id"),u=await H(e,s,r);_(u.owner,i),z(u),G(a,u);let d=(await e.clientFor(l).getBlock()).timestamp;if(t==="withdraw"){if(d<BigInt(String(u.unlockTime)))throw new o(`Still locked until Unix ${String(u.unlockTime)}; expiry never withdraws automatically.`);let y=a.to===void 0?i:f(a.to,"withdrawal recipient");if(s==="locker"&&y!==i)throw new o("Token locks withdraw only to the current owner; omit to or use this wallet.");return{...await T(e,i,s,"withdraw",s==="locker"?[r]:[r,y],`Withdraw mature HoodLock ${a.kind} lock #${r} to ${y}; ${s==="locker"?`${String(u.amount)} token base units`:`position NFT #${String(u.tokenId)}`}.`),record:x(u),recipient:y}}if(t==="extend"){let y=m(a.unlockTime,"unlockTime");if(y<=BigInt(String(u.unlockTime))||y<=d||y>d+3153600000n)throw new o("New unlockTime must extend the lock, be future Unix seconds, and at most 100 years away.");return T(e,i,s,"extend",[r,y],`Extend HoodLock ${a.kind} lock #${r} from ${String(u.unlockTime)} to ${y}; it cannot be shortened.`)}if(t==="set_fee_recipient"){if(s!=="liquidityLocker")throw new o("Only NFT locks have a fee recipient.");let y=f(a.recipient,"fee recipient");return T(e,i,s,"setFeeRecipient",[r,y],`Redirect future collected fees for HoodLock NFT lock #${r} to ${y}; ownership and maturity stay the same.`)}let c=f(a.owner,"new owner");return T(e,i,s,"transferLockOwnership",[r,c],`Transfer HoodLock ${a.kind} lock #${r} to ${c}; that owner can withdraw after maturity.${s==="liquidityLocker"?" The contract also resets feeRecipient to the new owner.":""}`)})),w(e,"hoodlock_collect",{id:C,ids:{type:"array",minItems:1,maxItems:50,description:"Several NFT lock ids to collect in one batch, 1 to 50 distinct. Use this or id, not both.",items:C}},[],async(t,a)=>{if(t.id===void 0==(t.ids===void 0))throw new o("Provide exactly one of id or ids.");let i=t.ids===void 0?[m(t.id,"id")]:ie(t.ids),s=[];for(let u of i){let d=await H(e,"liquidityLocker",u);_(d.owner,a),z(d),s.push({id:u.toString(),...x(d)})}let r=t.ids!==void 0;return{...await T(e,a,"liquidityLocker",r?"collectMany":"collect",r?[i]:[i[0]],`Collect fees for HoodLock NFT lock(s) ${i.join(", ")}; each lock's frozen collectFeeBps goes to HoodLock, the net to its recorded feeRecipient. Liquidity stays locked.${r?" Individual locks may fail; inspect Collected/CollectFailed events and balances.":""} Native ETH may become owedEth if delivery fails; refused ERC-20 fee shares fall back to the lock owner.`),locks:s}}),w(e,"hoodlock_airdrop_sweep",{id:C},["id"],async(t,a)=>{let i=m(t.id,"id"),s=F(await p(e,"airdrop","getAirdrop",[i]),K);if(_(s.creator,a,"airdrop creator"),s.swept)throw new o("This airdrop was already swept.");if(BigInt(String(s.endTime))===0n)throw new o("A zero-deadline airdrop can never be swept.");if((await e.clientFor(l).getBlock()).timestamp<BigInt(String(s.endTime)))throw new o("This airdrop has not ended; wait until endTime.");let r=await g(e,s.token);return{...await T(e,a,"airdrop","sweep",[i],`Recover the ${String(s.remaining)} remaining ${r.symbol} base units from expired airdrop #${i} to creator ${a}. This closes claims permanently.`),token:r,amount:String(s.remaining)}}),w(e,"hoodlock_record",{id:C,kind:{type:"string",enum:["token","v2","v3","v4","burn","vesting","airdrop"],description:"Record type: token, v2, v3 or v4 lock; or a burn, vesting schedule or airdrop. The id is looked up in that registry."}},["kind","id"],async(t,a)=>{let i=m(t.id,"id");if(t.kind==="vesting")return J(e,t,a);if(t.kind==="burn"){let d=F(await p(e,"burner","getBurn",[i]),["burner","token","amount","timestamp"]);if(BigInt(String(d.amount))===0n)throw new o("No HoodLock burn exists for this ID.");return{id:i.toString(),chainId:l,contract:h("burner"),record:x(d),token:await g(e,d.token),totalSupplyReduced:!1,proofUrl:`https://hoodlock.tech/proof/burn/${i}`}}if(t.kind==="airdrop"){let d=F(await p(e,"airdrop","getAirdrop",[i]),K);if(String(d.creator).toLowerCase()===U)throw new o("No HoodLock airdrop exists for this ID.");return{id:i.toString(),chainId:l,contract:h("airdrop"),record:x(d),token:await g(e,d.token),listURI:R(String(await p(e,"airdrop","listURI",[i])))}}let s=Z(t),r=await H(e,s,i);if(String(r.owner).toLowerCase()===U)throw new o("No HoodLock lock exists for this ID.");G(t,r);let u=s==="locker"?{token:await g(e,r.token)}:{token0:await g(e,r.token0),token1:await g(e,r.token1)};return{id:i.toString(),chainId:l,contract:h(s),record:x(r),...u,proofUrl:`https://hoodlock.tech/proof/${s==="locker"?"lock":"position"}/${i}`}}),w(e,"hoodlock_read",{contract:{type:"string",enum:Object.keys(v),description:"Which HoodLock contract to read: locker, burner, vesting, airdrop or liquidityLocker."},method:{type:"string",enum:be(),description:"Name of a published view or pure function on that contract."},arguments:{type:"array",maxItems:6,description:"Function arguments in ABI order: addresses as 0x strings, uint values as decimal strings, booleans as true/false.",items:{}}},["contract","method"],async t=>{let a=Q(t.contract),i=D(a,String(t.method));if(i.stateMutability!=="view"&&i.stateMutability!=="pure")throw new o("hoodlock_read accepts only published view/pure functions.");let s=V(i,t.arguments??[]),r=await p(e,a,i.name,s);return{chainId:l,contract:h(a),method:i.name,value:i.outputs.length===1&&i.outputs[0].type==="string"?R(String(r)):x(r),outputs:i.outputs,summary:"Raw contract view; owner indexes may include previous owners. Check current records. No transaction was built."}}),w(e,"hoodlock_recover",{method:{type:"string",enum:["claimOwedEth","claimOwedEthTo","pushOwedEth","sweepPendingCut"],description:"Recovery call on the liquidity locker: claimOwedEth (to you), claimOwedEthTo (to a given address), pushOwedEth (send a holder's owed ETH to that holder), sweepPendingCut (protocol cut of a token)."},arguments:{type:"array",maxItems:1,description:"ABI-ordered arguments: one address for claimOwedEthTo (recipient), pushOwedEth (holder) or sweepPendingCut (token); empty for claimOwedEth.",items:b}},["method"],async(t,a)=>{let i=String(t.method);if(!["claimOwedEth","claimOwedEthTo","pushOwedEth","sweepPendingCut"].includes(i))throw new o("Choose a published deferred ETH or protocol-cut recovery method.");let s=V(D("liquidityLocker",i),t.arguments??[]),r=i==="claimOwedEthTo"||i==="pushOwedEth"?f(s[0],"recipient"):a,u=i==="sweepPendingCut"?await p(e,"liquidityLocker","pendingCut",s):await p(e,"liquidityLocker","owedEth",[i==="pushOwedEth"?r:a]);if(BigInt(String(u))===0n)throw new o("There is no deferred balance to recover.");let d=i==="sweepPendingCut"?String(await p(e,"liquidityLocker","feeVault")):r;return T(e,a,"liquidityLocker",i,s,`HoodLock ${i}: recover ${String(u)} base units to ${d}; only the contract-recorded credit or cut can move.`)}),w(e,"hoodlock_admin",{contract:{type:"string",enum:Object.keys(v),description:"Which HoodLock contract to administer: locker, burner, vesting, airdrop or liquidityLocker. Only its admin or role holder can succeed."},method:{type:"string",enum:[...new Set(Object.values(se).flat())],description:"Admin function to call; must be supported on the chosen contract."},arguments:{type:"array",maxItems:3,description:"Function arguments in ABI order: addresses as 0x strings, uint values as decimal strings, booleans as true/false.",items:{}}},["contract","method"],(t,a)=>we(e,t,a))],positions:async t=>((await ne(e,{},t)).schedules??[]).filter(s=>BigInt(s.remaining)>0n).map(s=>({module:"hoodlock",id:`vesting:${s.id}`,chainId:l,assets:[{token:s.token,amount:s.remaining}],description:`HoodLock vesting #${s.id}: ${s.claimable} base units claimable; ${s.remaining} remain for current beneficiary ${t}.`}))}}function ie(e){if(!Array.isArray(e)||e.length===0||e.length>50)throw new o("Provide between 1 and 50 distinct decimal IDs.");let n=e.map(t=>m(t,"id"));if(new Set(n.map(String)).size!==n.length)throw new o("Duplicate IDs are not allowed in a collection batch.");return n}function be(){return[...new Set(Object.keys(v).flatMap(e=>B(e).filter(n=>n.type==="function"&&["view","pure"].includes(n.stateMutability)&&n.name!=="onERC721Received").map(n=>n.name)))]}function ae(e,n){if(e.type.endsWith("[]")){if(!Array.isArray(n)||n.length>200)throw new o("Function arrays must contain at most 200 items.");return n.map(t=>ae({...e,type:e.type.slice(0,-2)},t))}if(e.type==="address")return f(n,e.name??"address",!0);if(e.type==="bool"){if(typeof n!="boolean")throw new o("Function boolean arguments must be booleans.");return n}if(/^uint\d*$/.test(e.type))return m(n,e.name??"integer",Number(e.type.slice(4)||256));throw new o(`Unsupported published argument type ${e.type}.`)}function V(e,n){if(!Array.isArray(n)||n.length!==e.inputs.length)throw new o(`${e.name} needs ${e.inputs.length} ABI-ordered arguments.`);return e.inputs.map((t,a)=>ae(t,n[a]))}var se={locker:["setAdmin","setFee","setFeeCollector"],burner:["setAdmin","setFee","setFeeCollector"],vesting:["setFee","setFeeCollector","transferAdmin","acceptAdmin","withdrawFees"],airdrop:["setFee","setFeeCollector","transferAdmin","acceptAdmin","withdrawFees"],liquidityLocker:["setCollectFeeBps","setFixedFee","setFeeVault","setRevenueSink","setPaused","setHookAllowed","setKeeper","transferAdmin","acceptAdmin","adminCollect","rescueERC20","returnStrayPosition"]};async function we(e,n,t){let a=Q(n.contract),i=String(n.method);if(!se[a].includes(i))throw new o(`No supported admin ${a}.${i} route exists.`);let s=V(D(a,i),n.arguments??[]),r=i==="acceptAdmin"?"pendingAdmin":i==="withdrawFees"?"feeCollector":"admin",u=await p(e,a,r);if(i==="adminCollect"&&S(String(u))!==t?_(await p(e,a,"keeper"),t,"admin or keeper"):_(u,t,r),i==="adminCollect"&&ie(s[0].map(String)),i==="returnStrayPosition"){let d=f(s[0],"manager"),c=["V3_POSITIONS","V4_POSITIONS"];if(!(await Promise.all(c.map(M=>p(e,"liquidityLocker",M)))).some(M=>S(String(M))===d))throw new o("Only a configured position manager can return a stray NFT.");if(BigInt(String(await p(e,"liquidityLocker","lockIdOf",s.slice(0,2))))!==0n)throw new o("An actively locked NFT cannot be rescued.")}return T(e,t,a,i,s,`HoodLock ${a}.${i}(${JSON.stringify(x(s))}) by authorized ${r} ${t}. This changes protocol configuration or recovers only assets allowed by the contract. Existing custody rights cannot be overridden.`)}export{_e as a,Ie as b,Ee as c,Le as d,m as e,Oe as f};
|
|
1
|
+
import{b as W}from"./USGMGKAG.js";import{b as N}from"./N624NR7Y.js";import{a as k}from"./66F5ZH34.js";import{c as b,i as q,l as j}from"./NWNYJ26T.js";import{b as l}from"./TI727O2H.js";import{a as o}from"./XSD5NL7J.js";import{a as R}from"./JXOEJPJ4.js";import{encodeFunctionData as ye,erc20Abi as X,getAddress as S,zeroAddress as U}from"viem";var v={locker:{address:"0xd0f7d8c6e9f6d80c297bebe4f7fd1b9c8125c32f",source:"https://sourcify.dev/server/v2/contract/4663/0xd0f7d8c6e9f6d80c297bebe4f7fd1b9c8125c32f?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-07-08T19:01:30Z",fetchedAt:"2026-10-31",abi:[{name:"Extended",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"newUnlockTime",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"LockOwnershipTransferred",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Locked",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"},{name:"unlockTime",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Withdrawn",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"extend",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newUnlockTime",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"fee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"getLock",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"owner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"},{name:"withdrawn",type:"bool",internalType:"bool"}],internalType:"struct RobinhoodLocker.Lock"}],stateMutability:"view"},{name:"isUnlocked",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"lock",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"lockedAmount",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"locks",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"owner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"},{name:"withdrawn",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"locksByOwner",type:"function",inputs:[{name:"o",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"locksByToken",type:"function",inputs:[{name:"t",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"nextLockId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"setAdmin",type:"function",inputs:[{name:"a",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFee",type:"function",inputs:[{name:"_fee",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"timeRemaining",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"totalLocks",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"transferLockOwnership",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newOwner",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdraw",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"}]},burner:{address:"0x6bf43ca706faa8ea46803299c191484e82280652",source:"https://sourcify.dev/server/v2/contract/4663/0x6bf43ca706faa8ea46803299c191484e82280652?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-07-22T23:28:15Z",fetchedAt:"2026-10-31",abi:[{name:"Burned",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"burner",type:"address",indexed:!0,internalType:"address"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"DEAD",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"burn",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"burns",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"burner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"timestamp",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"burnsByBurner",type:"function",inputs:[{name:"b",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"burnsByToken",type:"function",inputs:[{name:"t",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"fee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"getBurn",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"burner",type:"address",internalType:"address"},{name:"token",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"timestamp",type:"uint256",internalType:"uint256"}],internalType:"struct RobinhoodBurner.Burn"}],stateMutability:"view"},{name:"nextBurnId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"setAdmin",type:"function",inputs:[{name:"a",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFee",type:"function",inputs:[{name:"_fee",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"totalBurnedOf",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"totalBurns",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"}]},vesting:{address:"0x910e19bcC4bce46999994Ed7297E0Fc4431ec72E",source:"https://sourcify.dev/server/v2/contract/4663/0x910e19bcC4bce46999994Ed7297E0Fc4431ec72E?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-07-27T00:28:59Z",fetchedAt:"2026-10-31",abi:[{name:"AdminTransferStarted",type:"event",inputs:[{name:"current",type:"address",indexed:!0,internalType:"address"},{name:"pending",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AdminTransferred",type:"event",inputs:[{name:"previous",type:"address",indexed:!0,internalType:"address"},{name:"current",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"BeneficiaryTransferred",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Claimed",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"beneficiary",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeCollectorChanged",type:"event",inputs:[{name:"collector",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"FeesWithdrawn",type:"event",inputs:[{name:"collector",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"VestingCreated",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"beneficiary",type:"address",indexed:!0,internalType:"address"},{name:"creator",type:"address",indexed:!1,internalType:"address"},{name:"total",type:"uint256",indexed:!1,internalType:"uint256"},{name:"start",type:"uint64",indexed:!1,internalType:"uint64"},{name:"cliff",type:"uint64",indexed:!1,internalType:"uint64"},{name:"end",type:"uint64",indexed:!1,internalType:"uint64"}],anonymous:!1},{name:"MAX_BATCH",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_FEE",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MIN_DURATION",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"acceptAdmin",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"accruedFees",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"claim",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"claimable",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"create",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"beneficiary",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"start",type:"uint64",internalType:"uint64"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"end",type:"uint64",internalType:"uint64"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"createMany",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"beneficiaries",type:"address[]",internalType:"address[]"},{name:"amounts",type:"uint256[]",internalType:"uint256[]"},{name:"start",type:"uint64",internalType:"uint64"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"end",type:"uint64",internalType:"uint64"}],outputs:[{name:"firstId",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"fee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"getSchedule",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"creator",type:"address",internalType:"address"},{name:"start",type:"uint64",internalType:"uint64"},{name:"beneficiary",type:"address",internalType:"address"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"token",type:"address",internalType:"address"},{name:"end",type:"uint64",internalType:"uint64"},{name:"total",type:"uint128",internalType:"uint128"},{name:"claimed",type:"uint128",internalType:"uint128"}],internalType:"struct RobinhoodVesting.Schedule"}],stateMutability:"view"},{name:"nextScheduleId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"pendingAdmin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"schedules",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"creator",type:"address",internalType:"address"},{name:"start",type:"uint64",internalType:"uint64"},{name:"beneficiary",type:"address",internalType:"address"},{name:"cliff",type:"uint64",internalType:"uint64"},{name:"token",type:"address",internalType:"address"},{name:"end",type:"uint64",internalType:"uint64"},{name:"total",type:"uint128",internalType:"uint128"},{name:"claimed",type:"uint128",internalType:"uint128"}],stateMutability:"view"},{name:"schedulesByBeneficiary",type:"function",inputs:[{name:"b",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"schedulesByCreator",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"schedulesByToken",type:"function",inputs:[{name:"token",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"setFee",type:"function",inputs:[{name:"_fee",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"totalSchedules",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"transferAdmin",type:"function",inputs:[{name:"newAdmin",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"transferBeneficiary",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newBeneficiary",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdrawFees",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"}]},airdrop:{address:"0x6B1fE7b821001144Ee74EEA258b0AafdE20102E8",source:"https://sourcify.dev/server/v2/contract/4663/0x6B1fE7b821001144Ee74EEA258b0AafdE20102E8?fields=abi,sources,compilation",match:"match",verifiedAt:"2026-07-30T16:48:51Z",fetchedAt:"2026-10-31",abi:[{name:"AdminTransferStarted",type:"event",inputs:[{name:"current",type:"address",indexed:!0,internalType:"address"},{name:"pending",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AdminTransferred",type:"event",inputs:[{name:"previous",type:"address",indexed:!0,internalType:"address"},{name:"current",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AirdropCreated",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"creator",type:"address",indexed:!0,internalType:"address"},{name:"merkleRoot",type:"bytes32",indexed:!1,internalType:"bytes32"},{name:"total",type:"uint256",indexed:!1,internalType:"uint256"},{name:"maxClaims",type:"uint32",indexed:!1,internalType:"uint32"},{name:"endTime",type:"uint64",indexed:!1,internalType:"uint64"},{name:"listURI",type:"string",indexed:!1,internalType:"string"}],anonymous:!1},{name:"Claimed",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"index",type:"uint256",indexed:!1,internalType:"uint256"},{name:"account",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeChanged",type:"event",inputs:[{name:"feeBase",type:"uint256",indexed:!1,internalType:"uint256"},{name:"feePerWallet",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeCollectorChanged",type:"event",inputs:[{name:"collector",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"FeesWithdrawn",type:"event",inputs:[{name:"collector",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Swept",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"creator",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"MAX_FEE",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_RECIPIENTS",type:"function",inputs:[],outputs:[{name:"",type:"uint32",internalType:"uint32"}],stateMutability:"view"},{name:"MAX_URI",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MIN_WINDOW",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"acceptAdmin",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"accruedFees",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"airdrops",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"creator",type:"address",internalType:"address"},{name:"endTime",type:"uint64",internalType:"uint64"},{name:"maxClaims",type:"uint32",internalType:"uint32"},{name:"token",type:"address",internalType:"address"},{name:"claims",type:"uint32",internalType:"uint32"},{name:"swept",type:"bool",internalType:"bool"},{name:"merkleRoot",type:"bytes32",internalType:"bytes32"},{name:"total",type:"uint128",internalType:"uint128"},{name:"remaining",type:"uint128",internalType:"uint128"}],stateMutability:"view"},{name:"claim",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"index",type:"uint256",internalType:"uint256"},{name:"account",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"},{name:"proof",type:"bytes32[]",internalType:"bytes32[]"}],outputs:[],stateMutability:"nonpayable"},{name:"create",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"merkleRoot",type:"bytes32",internalType:"bytes32"},{name:"total",type:"uint256",internalType:"uint256"},{name:"maxClaims",type:"uint32",internalType:"uint32"},{name:"endTime",type:"uint64",internalType:"uint64"},{name:"uri",type:"string",internalType:"string"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"feeBase",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"feeCollector",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"feePerWallet",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"getAirdrop",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"creator",type:"address",internalType:"address"},{name:"endTime",type:"uint64",internalType:"uint64"},{name:"maxClaims",type:"uint32",internalType:"uint32"},{name:"token",type:"address",internalType:"address"},{name:"claims",type:"uint32",internalType:"uint32"},{name:"swept",type:"bool",internalType:"bool"},{name:"merkleRoot",type:"bytes32",internalType:"bytes32"},{name:"total",type:"uint128",internalType:"uint128"},{name:"remaining",type:"uint128",internalType:"uint128"}],internalType:"struct RobinhoodAirdrop.Airdrop"}],stateMutability:"view"},{name:"isClaimed",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"index",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"listURI",type:"function",inputs:[{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"string",internalType:"string"}],stateMutability:"view"},{name:"nextAirdropId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"pendingAdmin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"quote",type:"function",inputs:[{name:"maxClaims",type:"uint32",internalType:"uint32"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"setFee",type:"function",inputs:[{name:"_feeBase",type:"uint256",internalType:"uint256"},{name:"_feePerWallet",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeCollector",type:"function",inputs:[{name:"c",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"sweep",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"totalAirdrops",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"transferAdmin",type:"function",inputs:[{name:"newAdmin",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdrawFees",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"}]},liquidityLocker:{address:"0x91Aa2dA1956C77F8448E18DCaf53383bCc658e67",source:"https://sourcify.dev/server/v2/contract/4663/0x91Aa2dA1956C77F8448E18DCaf53383bCc658e67?fields=abi,sources,compilation",match:"exact_match",verifiedAt:"2026-10-04T15:10:02Z",fetchedAt:"2026-10-31",abi:[{name:"AdminTransferStarted",type:"event",inputs:[{name:"next",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"AdminTransferred",type:"event",inputs:[{name:"previous",type:"address",indexed:!0,internalType:"address"},{name:"next",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"CollectFailed",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"}],anonymous:!1},{name:"CollectFeeChanged",type:"event",inputs:[{name:"bps",type:"uint16",indexed:!1,internalType:"uint16"}],anonymous:!1},{name:"Collected",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount0",type:"uint256",indexed:!1,internalType:"uint256"},{name:"amount1",type:"uint256",indexed:!1,internalType:"uint256"},{name:"cut0",type:"uint256",indexed:!1,internalType:"uint256"},{name:"cut1",type:"uint256",indexed:!1,internalType:"uint256"},{name:"byAdmin",type:"bool",indexed:!1,internalType:"bool"}],anonymous:!1},{name:"CutDeferred",type:"event",inputs:[{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"CutSwept",type:"event",inputs:[{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"EthClaimed",type:"event",inputs:[{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"EthCredited",type:"event",inputs:[{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Extended",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"newUnlockTime",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"FeeRecipientChanged",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"recipient",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"FeeVaultChanged",type:"event",inputs:[{name:"vault",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"FixedFeeChanged",type:"event",inputs:[{name:"fee",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"HookAllowedChanged",type:"event",inputs:[{name:"hook",type:"address",indexed:!0,internalType:"address"},{name:"allowed",type:"bool",indexed:!1,internalType:"bool"}],anonymous:!1},{name:"KeeperChanged",type:"event",inputs:[{name:"keeper",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"LockOwnershipTransferred",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Locked",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"manager",type:"address",indexed:!0,internalType:"address"},{name:"tokenId",type:"uint256",indexed:!1,internalType:"uint256"},{name:"token0",type:"address",indexed:!1,internalType:"address"},{name:"token1",type:"address",indexed:!1,internalType:"address"},{name:"pool",type:"bytes32",indexed:!1,internalType:"bytes32"},{name:"unlockTime",type:"uint256",indexed:!1,internalType:"uint256"},{name:"collectFeeBps",type:"uint16",indexed:!1,internalType:"uint16"},{name:"hookVerified",type:"bool",indexed:!1,internalType:"bool"},{name:"feeRecipient",type:"address",indexed:!1,internalType:"address"},{name:"fixedFeePaid",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"PausedChanged",type:"event",inputs:[{name:"paused",type:"bool",indexed:!1,internalType:"bool"}],anonymous:!1},{name:"PreLockFeesReturned",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"amount0",type:"uint256",indexed:!1,internalType:"uint256"},{name:"amount1",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"Rescued",type:"event",inputs:[{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"RevenueSinkChanged",type:"event",inputs:[{name:"sink",type:"address",indexed:!1,internalType:"address"}],anonymous:!1},{name:"ShareRedirected",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"token",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{name:"StrayPositionReturned",type:"event",inputs:[{name:"manager",type:"address",indexed:!0,internalType:"address"},{name:"tokenId",type:"uint256",indexed:!0,internalType:"uint256"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"Withdrawn",type:"event",inputs:[{name:"id",type:"uint256",indexed:!0,internalType:"uint256"},{name:"to",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{name:"BATCH_GAS_PER_LOCK",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_BATCH",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_COLLECT_FEE_BPS",type:"function",inputs:[],outputs:[{name:"",type:"uint16",internalType:"uint16"}],stateMutability:"view"},{name:"MAX_FIXED_FEE",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MAX_LOCK_DURATION",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"MIN_COLLECT_FEE_BPS",type:"function",inputs:[],outputs:[{name:"",type:"uint16",internalType:"uint16"}],stateMutability:"view"},{name:"V3_FACTORY",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"V3_POSITIONS",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"contract IV3PositionManager"}],stateMutability:"view"},{name:"V4_POOL_MANAGER",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"V4_POSITIONS",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"contract IV4PositionManager"}],stateMutability:"view"},{name:"acceptAdmin",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"admin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"adminCollect",type:"function",inputs:[{name:"ids",type:"uint256[]",internalType:"uint256[]"}],outputs:[],stateMutability:"nonpayable"},{name:"claimOwedEth",type:"function",inputs:[],outputs:[],stateMutability:"nonpayable"},{name:"claimOwedEthTo",type:"function",inputs:[{name:"to",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"collect",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"collectFeeBps",type:"function",inputs:[],outputs:[{name:"",type:"uint16",internalType:"uint16"}],stateMutability:"view"},{name:"collectMany",type:"function",inputs:[{name:"ids",type:"uint256[]",internalType:"uint256[]"}],outputs:[],stateMutability:"nonpayable"},{name:"collectOneIsolated",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"byAdmin",type:"bool",internalType:"bool"}],outputs:[],stateMutability:"nonpayable"},{name:"cutOf",type:"function",inputs:[{name:"amount",type:"uint256",internalType:"uint256"},{name:"bps",type:"uint16",internalType:"uint16"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"pure"},{name:"extend",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newUnlockTime",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"feeVault",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"fixedFee",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"getLock",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"tuple",components:[{name:"owner",type:"address",internalType:"address"},{name:"unlockTime",type:"uint40",internalType:"uint40"},{name:"collectFeeBps",type:"uint16",internalType:"uint16"},{name:"isV4",type:"bool",internalType:"bool"},{name:"hookVerified",type:"bool",internalType:"bool"},{name:"withdrawn",type:"bool",internalType:"bool"},{name:"feeRecipient",type:"address",internalType:"address"},{name:"token0",type:"address",internalType:"address"},{name:"token1",type:"address",internalType:"address"},{name:"tokenId",type:"uint256",internalType:"uint256"}],internalType:"struct HoodLockLPLocker.Lock"}],stateMutability:"view"},{name:"hookAllowed",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"isUnlocked",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"keeper",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"lock",type:"function",inputs:[{name:"manager",type:"address",internalType:"address"},{name:"tokenId",type:"uint256",internalType:"uint256"},{name:"unlockTime",type:"uint256",internalType:"uint256"},{name:"feeRecipient",type:"address",internalType:"address"},{name:"acceptUnverifiedHook",type:"bool",internalType:"bool"},{name:"maxCollectFeeBps",type:"uint16",internalType:"uint16"}],outputs:[{name:"id",type:"uint256",internalType:"uint256"}],stateMutability:"payable"},{name:"lockIdOf",type:"function",inputs:[{name:"",type:"address",internalType:"address"},{name:"",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"locksOf",type:"function",inputs:[{name:"owner",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256[]",internalType:"uint256[]"}],stateMutability:"view"},{name:"name",type:"function",inputs:[],outputs:[{name:"",type:"string",internalType:"string"}],stateMutability:"view"},{name:"nextLockId",type:"function",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"onERC721Received",type:"function",inputs:[{name:"",type:"address",internalType:"address"},{name:"",type:"address",internalType:"address"},{name:"",type:"uint256",internalType:"uint256"},{name:"",type:"bytes",internalType:"bytes"}],outputs:[{name:"",type:"bytes4",internalType:"bytes4"}],stateMutability:"pure"},{name:"owedEth",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"paused",type:"function",inputs:[],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{name:"pendingAdmin",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"pendingCut",type:"function",inputs:[{name:"",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{name:"pushOwedEth",type:"function",inputs:[{name:"who",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"rescueERC20",type:"function",inputs:[{name:"token",type:"address",internalType:"address"},{name:"to",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"returnStrayPosition",type:"function",inputs:[{name:"manager",type:"address",internalType:"address"},{name:"tokenId",type:"uint256",internalType:"uint256"},{name:"to",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"revenueSink",type:"function",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{name:"setCollectFeeBps",type:"function",inputs:[{name:"bps",type:"uint16",internalType:"uint16"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeRecipient",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"recipient",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFeeVault",type:"function",inputs:[{name:"vault",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setFixedFee",type:"function",inputs:[{name:"fee_",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{name:"setHookAllowed",type:"function",inputs:[{name:"hook",type:"address",internalType:"address"},{name:"allowed",type:"bool",internalType:"bool"}],outputs:[],stateMutability:"nonpayable"},{name:"setKeeper",type:"function",inputs:[{name:"k",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"setPaused",type:"function",inputs:[{name:"p",type:"bool",internalType:"bool"}],outputs:[],stateMutability:"nonpayable"},{name:"setRevenueSink",type:"function",inputs:[{name:"sink",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"sweepPendingCut",type:"function",inputs:[{name:"token",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"transferAdmin",type:"function",inputs:[{name:"next",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"transferLockOwnership",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"newOwner",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{name:"withdraw",type:"function",inputs:[{name:"id",type:"uint256",internalType:"uint256"},{name:"to",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"}]}};var _e=v,Ie=S(v.vesting.address),Ee=["hoodlock_read","hoodlock_record","hoodlock_vesting_status","hoodlock_public"],Le=["hoodlock_vesting_create","hoodlock_vesting_claim","hoodlock_vesting_transfer","hoodlock_withdraw","hoodlock_extend","hoodlock_transfer_lock","hoodlock_set_fee_recipient","hoodlock_collect","hoodlock_airdrop_sweep","hoodlock_recover","hoodlock_admin"],C=k("Decimal record ID, including zero for token locks, burns, vesting and airdrops. LP IDs start at one."),le={id:C,kind:{type:"string",enum:["token","v2","v3","v4"],description:"Lock type: token = ERC-20 token lock; v2 = V2 LP-token lock; v3 or v4 = Uniswap v3 or v4 liquidity-position (NFT) lock."}},Y=(1n<<256n)-1n;function m(e,n,t=256){if(typeof e!="string"||!/^\d+$/.test(e))throw new o(`${n} must be a decimal base-unit string.`);let a=BigInt(e);if(a>(1n<<BigInt(t))-1n)throw new o(`${n} exceeds uint${t}.`);return a}function f(e,n,t=!1){let a=q(e,`Provide a valid ${n} address.`);return t?a:j(a,`${n} must not be the zero address.`)}function ce(e,n){let t=m(e,n);if(t===0n||t===Y)throw new o(`${n} must be a positive exact amount, never unlimited.`);return t}function Q(e){if(typeof e!="string"||!Object.hasOwn(v,e))throw new o("Choose locker, burner, vesting, airdrop or liquidityLocker.");return e}function B(e){return v[e].abi}function h(e){return S(v[e].address)}function D(e,n){let t=B(e).find(a=>a.type==="function"&&a.name===n);if(!t)throw new o(`No published HoodLock ${e}.${n} function exists.`);return t}async function p(e,n,t,a=[]){return e.clientFor(l).readContract({address:h(n),abi:B(n),functionName:t,args:a})}function F(e,n){if(Array.isArray(e))return Object.fromEntries(n.map((t,a)=>[t,e[a]]));if(e&&typeof e=="object")return e;throw new o("HoodLock returned an invalid record. Retry the chain read.")}var me=["owner","token","amount","unlockTime","withdrawn"],fe=["owner","unlockTime","collectFeeBps","isV4","hookVerified","withdrawn","feeRecipient","token0","token1","tokenId"],ee=["creator","start","beneficiary","cliff","token","end","total","claimed"],K=["creator","endTime","maxClaims","token","claims","swept","merkleRoot","total","remaining"];function x(e){return JSON.parse(JSON.stringify(e,(n,t)=>typeof t=="bigint"?t.toString():t))}async function g(e,n){let t=f(n,"token",!0);if(t===U)return N;let a=e.clientFor(l),[i,s]=await Promise.all([a.readContract({address:t,abi:X,functionName:"symbol"}),a.readContract({address:t,abi:X,functionName:"decimals"})]);if(!Number.isInteger(s)||s<0||s>255)throw new o("Token decimals are invalid.");return{address:t,chainId:l,symbol:R(String(i)),decimals:s}}function _(e,n,t="current owner"){if(f(e,t)!==S(n))throw new o(`This wallet is not the ${t}.`)}function z(e){if(e.withdrawn)throw new o("This HoodLock lock was already withdrawn.")}function Z(e){if(!["token","v2","v3","v4"].includes(String(e.kind)))throw new o("Provide kind: token, v2, v3 or v4.");return e.kind==="token"||e.kind==="v2"?"locker":"liquidityLocker"}async function H(e,n,t){return F(await p(e,n,"getLock",[t]),n==="locker"?me:fe)}function G(e,n){if((e.kind==="v3"||e.kind==="v4")&&!!n.isV4!=(e.kind==="v4"))throw new o("Lock kind disagrees with the on-chain NFT version.")}async function T(e,n,t,a,i,s,r=0n,u=[]){let d=e.unsignedTx({to:h(t),chainId:l,value:r.toString(),data:ye({abi:B(t),functionName:a,args:i}),description:s}),c=await e.preview([...u,d],S(n));return{txs:c.txs,preview:c,summary:s,contract:h(t),chainId:l,method:a,arguments:x(i)}}function w(e,n,t,a,i){return{name:n,inputSchema:{type:"object",properties:t,required:a,additionalProperties:!1},async execute(s,r){try{return await i(s,S(r))}catch(u){throw new o(e.plainError(u))}}}}async function Te(e,n,t){let a=f(n.token,"token"),i=m(n.start,"start",64),s=m(n.cliff,"cliff",64),r=m(n.end,"end",64),[u,d,c,y,M]=await Promise.all([e.clientFor(l).getBlock(),p(e,"vesting","fee"),p(e,"vesting","MIN_DURATION"),p(e,"vesting","MAX_BATCH"),g(e,a)]);if(i>s||s>r||r<=i)throw new o("Vesting dates require start <= cliff <= end and end > start.");if(r>=1000000000000n||r<=u.timestamp+BigInt(String(c))+30n)throw new o("Vesting end must be Unix seconds, more than 24 hours plus a 30-second inclusion margin after the current block.");let I=n.entries!==void 0;if(I&&(n.beneficiary!==void 0||n.amount!==void 0))throw new o("Use entries or beneficiary/amount, not both.");if(I&&(!Array.isArray(n.entries)||n.entries.length===0||n.entries.length>Number(y)))throw new o(`Provide between 1 and ${String(y)} vesting entries.`);let L=I?n.entries:[{beneficiary:n.beneficiary,amount:n.amount}],P=L.map(A=>f(A?.beneficiary,"beneficiary")),O=L.map(A=>ce(A?.amount,"amount"));if(O.some(A=>A>=1n<<128n))throw new o("Each vesting amount must fit uint128.");let $=O.reduce((A,de)=>A+de,0n);if($>=Y)throw new o("Vesting total exceeds the exact approval range.");let E=BigInt(String(d))*BigInt(L.length);if(n.maxFee!==void 0&&E>m(n.maxFee,"maxFee"))throw new o("Live vesting fee exceeds maxFee.");let re=I?"createMany":"create",oe=I?[a,P,O,i,s,r]:[a,P[0],O[0],i,s,r],ue=`Create ${L.length} irrevocable HoodLock vesting schedule(s): ${$} ${M.symbol} base units (${a}, decimals ${M.decimals}) for ${P.join(", ")}; start ${i}, cliff ${s}, end ${r}; exact fee ${E} wei. Creator cannot cancel or recover principal. Recorded totals use tokens actually received; preserve mined schedule IDs.`;return W(e,{...await T(e,t,"vesting",re,oe,ue,E,[e.approval(a,h("vesting"),$.toString(),l)]),token:M,amount:$.toString(),fee:{token:N,amount:E.toString()}},h("vesting"),E)}async function te(e,n){let t=F(await p(e,"vesting","getSchedule",[n]),ee);if(BigInt(String(t.total))===0n)throw new o("No HoodLock vesting schedule exists for this ID.");let[a,i]=await Promise.all([p(e,"vesting","claimable",[n]),g(e,t.token)]);return{id:n.toString(),contract:h("vesting"),chainId:l,schedule:x(t),token:i,claimable:String(a),remaining:(BigInt(String(t.total))-BigInt(String(t.claimed))).toString(),proofUrl:`https://hoodlock.tech/proof/vesting/${n}`}}async function ne(e,n,t){let a=n.account===void 0?t:f(n.account,"account"),i=n.role??"beneficiary";if(!["beneficiary","creator","token"].includes(String(i)))throw new o("Choose beneficiary, creator or token for vesting discovery.");let r=await p(e,"vesting",i==="creator"?"schedulesByCreator":i==="token"?"schedulesByToken":"schedulesByBeneficiary",[a]),u=[];for(let d of[...new Set(r.map(String))]){let c=await te(e,BigInt(d));(i!=="beneficiary"||f(c.schedule.beneficiary,"beneficiary")===a)&&u.push(c)}return{account:a,role:i,schedules:u,summary:`Found ${u.length} HoodLock vesting schedule(s); completed schedules remain visible.`}}async function J(e,n,t){return n.id===void 0?ne(e,n,t):te(e,m(n.id,"id"))}function Oe(e){return{tools:[w(e,"hoodlock_vesting_create",{token:{...b,description:"Address of the ERC-20 token to vest. The wallet approves and transfers it to the vesting contract."},beneficiary:{...b,description:"Address that receives the vested tokens (single schedule). Use this with amount, or use entries, not both."},amount:k('Amount of the token to vest, in base units of that token (read its decimals). Example: "1000000000000000000" = 1 token at 18 decimals. Single schedule only.'),entries:{type:"array",minItems:1,maxItems:200,description:"Batch of schedules sharing one token, start, cliff and end. Use this instead of beneficiary and amount.",items:{type:"object",properties:{beneficiary:{...b,description:"Address that receives this entry's vested tokens."},amount:k('Amount of the token vested to this beneficiary, in base units of that token (read its decimals). Example: "1000000000000000000" = 1 token at 18 decimals.')},required:["beneficiary","amount"],additionalProperties:!1}},start:k('Vesting start time in Unix seconds, as a decimal string. Example: "1800000000".'),cliff:k("Cliff time in Unix seconds, between start and end; nothing is claimable before it."),end:k("Vesting end time in Unix seconds, more than 24 hours after the current block."),maxFee:k("Optional cap on the total creation fee in wei of native ETH (1 ETH = 10^18 wei); the call fails if the live fee is higher.")},["token","start","cliff","end"],(t,a)=>Te(e,t,a)),w(e,"hoodlock_vesting_status",{id:C,account:{...b,description:"Address to list vesting schedules for when no id is given. Defaults to the connected wallet."},role:{type:"string",enum:["beneficiary","creator","token"],description:"How account relates to the schedules when listing: beneficiary (default), creator, or the vested token address."}},[],(t,a)=>J(e,t,a)),...["claim","transfer"].map(t=>w(e,`hoodlock_vesting_${t}`,{id:C,...t==="transfer"?{beneficiary:{...b,description:"Address of the new beneficiary who takes over the remaining vesting rights."}}:{}},t==="transfer"?["id","beneficiary"]:["id"],async(a,i)=>{let s=m(a.id,"id"),r=F(await p(e,"vesting","getSchedule",[s]),ee);if(_(r.beneficiary,i,"current beneficiary"),t==="transfer"){let c=f(a.beneficiary,"beneficiary");return T(e,i,"vesting","transferBeneficiary",[s,c],`Transfer beneficiary rights for vesting #${s} from ${i} to ${c}. Remaining tokens follow the schedule; creator cannot revoke it.`)}let u=BigInt(String(await p(e,"vesting","claimable",[s])));if(u===0n)throw new o("Nothing is claimable yet; check the cliff and previous claims.");let d=await g(e,r.token);return{...await T(e,i,"vesting","claim",[s],`Claim currently ${u} ${d.symbol} base units from vesting #${s} to current beneficiary ${i}; live inclusion time determines the final amount.`),token:d,amount:u.toString()}})),...["withdraw","extend","transfer_lock","set_fee_recipient"].map(t=>w(e,`hoodlock_${t}`,{...le,...t==="withdraw"?{to:{...b,description:"Address that receives the withdrawn position NFT or LP; defaults to the connected wallet. Token locks withdraw only to the owner."}}:t==="extend"?{unlockTime:k('New unlock time in Unix seconds, later than the current unlock time and in the future (at most 100 years). Example: "1800000000".')}:t==="transfer_lock"?{owner:{...b,description:"Address of the new lock owner, who can withdraw after maturity."}}:{recipient:{...b,description:"Address that receives future collected fees for this NFT lock."}}},["kind","id",...t==="extend"?["unlockTime"]:t==="transfer_lock"?["owner"]:t==="set_fee_recipient"?["recipient"]:[]],async(a,i)=>{let s=Z(a),r=m(a.id,"id"),u=await H(e,s,r);_(u.owner,i),z(u),G(a,u);let d=(await e.clientFor(l).getBlock()).timestamp;if(t==="withdraw"){if(d<BigInt(String(u.unlockTime)))throw new o(`Still locked until Unix ${String(u.unlockTime)}; expiry never withdraws automatically.`);let y=a.to===void 0?i:f(a.to,"withdrawal recipient");if(s==="locker"&&y!==i)throw new o("Token locks withdraw only to the current owner; omit to or use this wallet.");return{...await T(e,i,s,"withdraw",s==="locker"?[r]:[r,y],`Withdraw mature HoodLock ${a.kind} lock #${r} to ${y}; ${s==="locker"?`${String(u.amount)} token base units`:`position NFT #${String(u.tokenId)}`}.`),record:x(u),recipient:y}}if(t==="extend"){let y=m(a.unlockTime,"unlockTime");if(y<=BigInt(String(u.unlockTime))||y<=d||y>d+3153600000n)throw new o("New unlockTime must extend the lock, be future Unix seconds, and at most 100 years away.");return T(e,i,s,"extend",[r,y],`Extend HoodLock ${a.kind} lock #${r} from ${String(u.unlockTime)} to ${y}; it cannot be shortened.`)}if(t==="set_fee_recipient"){if(s!=="liquidityLocker")throw new o("Only NFT locks have a fee recipient.");let y=f(a.recipient,"fee recipient");return T(e,i,s,"setFeeRecipient",[r,y],`Redirect future collected fees for HoodLock NFT lock #${r} to ${y}; ownership and maturity stay the same.`)}let c=f(a.owner,"new owner");return T(e,i,s,"transferLockOwnership",[r,c],`Transfer HoodLock ${a.kind} lock #${r} to ${c}; that owner can withdraw after maturity.${s==="liquidityLocker"?" The contract also resets feeRecipient to the new owner.":""}`)})),w(e,"hoodlock_collect",{id:C,ids:{type:"array",minItems:1,maxItems:50,description:"Several NFT lock ids to collect in one batch, 1 to 50 distinct. Use this or id, not both.",items:C}},[],async(t,a)=>{if(t.id===void 0==(t.ids===void 0))throw new o("Provide exactly one of id or ids.");let i=t.ids===void 0?[m(t.id,"id")]:ie(t.ids),s=[];for(let u of i){let d=await H(e,"liquidityLocker",u);_(d.owner,a),z(d),s.push({id:u.toString(),...x(d)})}let r=t.ids!==void 0;return{...await T(e,a,"liquidityLocker",r?"collectMany":"collect",r?[i]:[i[0]],`Collect fees for HoodLock NFT lock(s) ${i.join(", ")}; each lock's frozen collectFeeBps goes to HoodLock, the net to its recorded feeRecipient. Liquidity stays locked.${r?" Individual locks may fail; inspect Collected/CollectFailed events and balances.":""} Native ETH may become owedEth if delivery fails; refused ERC-20 fee shares fall back to the lock owner.`),locks:s}}),w(e,"hoodlock_airdrop_sweep",{id:C},["id"],async(t,a)=>{let i=m(t.id,"id"),s=F(await p(e,"airdrop","getAirdrop",[i]),K);if(_(s.creator,a,"airdrop creator"),s.swept)throw new o("This airdrop was already swept.");if(BigInt(String(s.endTime))===0n)throw new o("A zero-deadline airdrop can never be swept.");if((await e.clientFor(l).getBlock()).timestamp<BigInt(String(s.endTime)))throw new o("This airdrop has not ended; wait until endTime.");let r=await g(e,s.token);return{...await T(e,a,"airdrop","sweep",[i],`Recover the ${String(s.remaining)} remaining ${r.symbol} base units from expired airdrop #${i} to creator ${a}. This closes claims permanently.`),token:r,amount:String(s.remaining)}}),w(e,"hoodlock_record",{id:C,kind:{type:"string",enum:["token","v2","v3","v4","burn","vesting","airdrop"],description:"Record type: token, v2, v3 or v4 lock; or a burn, vesting schedule or airdrop. The id is looked up in that registry."}},["kind","id"],async(t,a)=>{let i=m(t.id,"id");if(t.kind==="vesting")return J(e,t,a);if(t.kind==="burn"){let d=F(await p(e,"burner","getBurn",[i]),["burner","token","amount","timestamp"]);if(BigInt(String(d.amount))===0n)throw new o("No HoodLock burn exists for this ID.");return{id:i.toString(),chainId:l,contract:h("burner"),record:x(d),token:await g(e,d.token),totalSupplyReduced:!1,proofUrl:`https://hoodlock.tech/proof/burn/${i}`}}if(t.kind==="airdrop"){let d=F(await p(e,"airdrop","getAirdrop",[i]),K);if(String(d.creator).toLowerCase()===U)throw new o("No HoodLock airdrop exists for this ID.");return{id:i.toString(),chainId:l,contract:h("airdrop"),record:x(d),token:await g(e,d.token),listURI:R(String(await p(e,"airdrop","listURI",[i])))}}let s=Z(t),r=await H(e,s,i);if(String(r.owner).toLowerCase()===U)throw new o("No HoodLock lock exists for this ID.");G(t,r);let u=s==="locker"?{token:await g(e,r.token)}:{token0:await g(e,r.token0),token1:await g(e,r.token1)};return{id:i.toString(),chainId:l,contract:h(s),record:x(r),...u,proofUrl:`https://hoodlock.tech/proof/${s==="locker"?"lock":"position"}/${i}`}}),w(e,"hoodlock_read",{contract:{type:"string",enum:Object.keys(v),description:"Which HoodLock contract to read: locker, burner, vesting, airdrop or liquidityLocker."},method:{type:"string",enum:be(),description:"Name of a published view or pure function on that contract."},arguments:{type:"array",maxItems:6,description:"Function arguments in ABI order: addresses as 0x strings, uint values as decimal strings, booleans as true/false.",items:{}}},["contract","method"],async t=>{let a=Q(t.contract),i=D(a,String(t.method));if(i.stateMutability!=="view"&&i.stateMutability!=="pure")throw new o("hoodlock_read accepts only published view/pure functions.");let s=V(i,t.arguments??[]),r=await p(e,a,i.name,s);return{chainId:l,contract:h(a),method:i.name,value:i.outputs.length===1&&i.outputs[0].type==="string"?R(String(r)):x(r),outputs:i.outputs,summary:"Raw contract view; owner indexes may include previous owners. Check current records. No transaction was built."}}),w(e,"hoodlock_recover",{method:{type:"string",enum:["claimOwedEth","claimOwedEthTo","pushOwedEth","sweepPendingCut"],description:"Recovery call on the liquidity locker: claimOwedEth (to you), claimOwedEthTo (to a given address), pushOwedEth (send a holder's owed ETH to that holder), sweepPendingCut (protocol cut of a token)."},arguments:{type:"array",maxItems:1,description:"ABI-ordered arguments: one address for claimOwedEthTo (recipient), pushOwedEth (holder) or sweepPendingCut (token); empty for claimOwedEth.",items:b}},["method"],async(t,a)=>{let i=String(t.method);if(!["claimOwedEth","claimOwedEthTo","pushOwedEth","sweepPendingCut"].includes(i))throw new o("Choose a published deferred ETH or protocol-cut recovery method.");let s=V(D("liquidityLocker",i),t.arguments??[]),r=i==="claimOwedEthTo"||i==="pushOwedEth"?f(s[0],"recipient"):a,u=i==="sweepPendingCut"?await p(e,"liquidityLocker","pendingCut",s):await p(e,"liquidityLocker","owedEth",[i==="pushOwedEth"?r:a]);if(BigInt(String(u))===0n)throw new o("There is no deferred balance to recover.");let d=i==="sweepPendingCut"?String(await p(e,"liquidityLocker","feeVault")):r;return T(e,a,"liquidityLocker",i,s,`HoodLock ${i}: recover ${String(u)} base units to ${d}; only the contract-recorded credit or cut can move.`)}),w(e,"hoodlock_admin",{contract:{type:"string",enum:Object.keys(v),description:"Which HoodLock contract to administer: locker, burner, vesting, airdrop or liquidityLocker. Only its admin or role holder can succeed."},method:{type:"string",enum:[...new Set(Object.values(se).flat())],description:"Admin function to call; must be supported on the chosen contract."},arguments:{type:"array",maxItems:3,description:"Function arguments in ABI order: addresses as 0x strings, uint values as decimal strings, booleans as true/false.",items:{}}},["contract","method"],(t,a)=>we(e,t,a))],positions:async t=>((await ne(e,{},t)).schedules??[]).filter(s=>BigInt(s.remaining)>0n).map(s=>({module:"hoodlock",id:`vesting:${s.id}`,chainId:l,assets:[{token:s.token,amount:s.remaining}],description:`HoodLock vesting #${s.id}: ${s.claimable} base units claimable; ${s.remaining} remain for current beneficiary ${t}.`}))}}function ie(e){if(!Array.isArray(e)||e.length===0||e.length>50)throw new o("Provide between 1 and 50 distinct decimal IDs.");let n=e.map(t=>m(t,"id"));if(new Set(n.map(String)).size!==n.length)throw new o("Duplicate IDs are not allowed in a collection batch.");return n}function be(){return[...new Set(Object.keys(v).flatMap(e=>B(e).filter(n=>n.type==="function"&&["view","pure"].includes(n.stateMutability)&&n.name!=="onERC721Received").map(n=>n.name)))]}function ae(e,n){if(e.type.endsWith("[]")){if(!Array.isArray(n)||n.length>200)throw new o("Function arrays must contain at most 200 items.");return n.map(t=>ae({...e,type:e.type.slice(0,-2)},t))}if(e.type==="address")return f(n,e.name??"address",!0);if(e.type==="bool"){if(typeof n!="boolean")throw new o("Function boolean arguments must be booleans.");return n}if(/^uint\d*$/.test(e.type))return m(n,e.name??"integer",Number(e.type.slice(4)||256));throw new o(`Unsupported published argument type ${e.type}.`)}function V(e,n){if(!Array.isArray(n)||n.length!==e.inputs.length)throw new o(`${e.name} needs ${e.inputs.length} ABI-ordered arguments.`);return e.inputs.map((t,a)=>ae(t,n[a]))}var se={locker:["setAdmin","setFee","setFeeCollector"],burner:["setAdmin","setFee","setFeeCollector"],vesting:["setFee","setFeeCollector","transferAdmin","acceptAdmin","withdrawFees"],airdrop:["setFee","setFeeCollector","transferAdmin","acceptAdmin","withdrawFees"],liquidityLocker:["setCollectFeeBps","setFixedFee","setFeeVault","setRevenueSink","setPaused","setHookAllowed","setKeeper","transferAdmin","acceptAdmin","adminCollect","rescueERC20","returnStrayPosition"]};async function we(e,n,t){let a=Q(n.contract),i=String(n.method);if(!se[a].includes(i))throw new o(`No supported admin ${a}.${i} route exists.`);let s=V(D(a,i),n.arguments??[]),r=i==="acceptAdmin"?"pendingAdmin":i==="withdrawFees"?"feeCollector":"admin",u=await p(e,a,r);if(i==="adminCollect"&&S(String(u))!==t?_(await p(e,a,"keeper"),t,"admin or keeper"):_(u,t,r),i==="adminCollect"&&ie(s[0].map(String)),i==="returnStrayPosition"){let d=f(s[0],"manager"),c=["V3_POSITIONS","V4_POSITIONS"];if(!(await Promise.all(c.map(M=>p(e,"liquidityLocker",M)))).some(M=>S(String(M))===d))throw new o("Only a configured position manager can return a stray NFT.");if(BigInt(String(await p(e,"liquidityLocker","lockIdOf",s.slice(0,2))))!==0n)throw new o("An actively locked NFT cannot be rescued.")}return T(e,t,a,i,s,`HoodLock ${a}.${i}(${JSON.stringify(x(s))}) by authorized ${r} ${t}. This changes protocol configuration or recovers only assets allowed by the contract. Existing custody rights cannot be overridden.`)}export{_e as a,Ie as b,Ee as c,Le as d,m as e,Oe as f};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as G}from"./DRLBTB4E.js";import{b as I}from"./7VH6JQ2H.js";import{b as M}from"./7U62MMUQ.js";import{h as C}from"./2GXHYI23.js";import{b as W}from"./SPJCSEKP.js";import{a as U}from"./43LI5NKJ.js";import{a as P}from"./66F5ZH34.js";import{g as $}from"./NWNYJ26T.js";import{b as R}from"./IX3GZMTM.js";import{b as h,e as y,j as T,k as b}from"./TI727O2H.js";import{a as p}from"./XSD5NL7J.js";import{encodeFunctionData as A,erc20Abi as E,parseAbi as N}from"viem";var f=T[h].vaults.spark.address,i={address:b,chainId:h,symbol:"USDG",decimals:y},m={address:f,chainId:h,symbol:"spUSDG",decimals:6},_=(1n<<256n)-1n,k=N(["function asset() view returns (address)","function decimals() view returns (uint8)","function totalAssets() view returns (uint256)","function balanceOf(address owner) view returns (uint256)","function maxDeposit(address receiver) view returns (uint256)","function maxWithdraw(address owner) view returns (uint256)","function maxRedeem(address owner) view returns (uint256)","function previewDeposit(uint256 assets) view returns (uint256)","function previewWithdraw(uint256 assets) view returns (uint256)","function previewRedeem(uint256 shares) view returns (uint256)","function deposit(uint256 assets,address receiver) returns (uint256 shares)","function withdraw(uint256 assets,address receiver,address owner) returns (uint256 shares)","function redeem(uint256 shares,address receiver,address owner) returns (uint256 assets)"]),t=(s,l)=>({token:{...s},amount:l.toString()});function D(s,l,v=!1){if(!s||typeof s!="object"||Array.isArray(s)||Object.keys(s).some(g=>!l||g!=="amount"))throw new p(l?"Provide only the amount for this Spark action.":"Spark listing takes no arguments.");if(!l)return 0n;if(v&&s.amount==="max")return"max";if(typeof s.amount!="string")throw new p("Amount must be a positive integer string in base units.");let n=R(s.amount);if(n===0n||n>_)throw new p("Amount must be positive and within the uint256 range.");return n}var F=s=>{async function l(a){try{return await a()}catch(e){throw new p(s.plainError(e))}}async function v(a){U(a);let e=s.clientFor(h);if(await e.getChainId()!==h)throw new p("Spark requires an endpoint on chain 4663.");let[r,d,o]=await Promise.all([e.readContract({address:f,abi:k,functionName:"asset"}),e.readContract({address:f,abi:k,functionName:"decimals"}),e.readContract({address:b,abi:E,functionName:"decimals"})]);if(typeof r!="string"||!$(r,b))throw new p("Spark does not report the expected USDG asset on chain 4663.");if(d!==m.decimals||o!==i.decimals)throw new p("Spark shares and USDG must both have 6 decimals.");return async(u,x=[])=>{let c=await e.readContract({address:f,abi:k,functionName:u,args:x});if(typeof c!="bigint"||c<0n||c>_)throw new p(`Spark returned an invalid ${u} value.`);return c}}function n(a){let e=a.amount.startsWith("-"),r=e?a.amount.slice(1):a.amount;return`${e?"-":""}${s.formatAmount(r,a.token.decimals)} ${a.token.symbol}`}async function g(a,e,r,d){let o=await s.preview(a,e),u=o.changes.map(n).join(", ");return{txs:a,amounts:r,preview:o,summary:`${d} Preview values can change before execution. ${o.summary}${u?` Changes: ${u}.`:""}`}}return{positions:a=>l(async()=>{let e=await v(a),r=await e("balanceOf",[a]);if(r===0n)return[];let[d,o,u]=await Promise.all([e("previewRedeem",[r]),e("maxRedeem",[a]),e("maxWithdraw",[a])]);return[{module:"spark",id:`${h}:${f}`,chainId:h,assets:[t(m,r)],economics:{principal:d===0n?[]:[C("redeemable",{token:{...i},amount:d.toString(),source:"spark.previewRedeem",heldAs:m.address})],debt:[],rewards:[],backing:[],coverage:{complete:!0}},description:`${n(t(m,r))}; redeem preview ${n(t(i,d))} (rounded down). Current maximum redeem ${n(t(m,o))}; maximum withdrawal ${n(t(i,u))}.`}]}),tools:[I(s),...M(s),...G(s),{name:"spark_list",inputSchema:{type:"object",properties:{},additionalProperties:!1},execute:(a,e)=>l(async()=>{D(a,!1);let r=await v(e),d=await r("totalAssets"),[o,u,x,c,w]=await Promise.all([r("balanceOf",[e]),r("maxDeposit",[e]),r("maxWithdraw",[e]),r("maxRedeem",[e]),r("previewDeposit",[1000000n])]),S=await r("previewRedeem",[o]);return[{chainId:h,address:f,name:"Spark Savings USDG",asset:{...i},shareToken:{...m},totalAssets:t(i,d),balance:t(m,o),maxDeposit:t(i,u),maxWithdraw:t(i,x),maxRedeem:t(m,c),previewDepositAssets:t(i,1000000n),previewDeposit:t(m,w),previewRedeemShares:t(m,o),previewRedeem:t(i,S),rounding:"Deposit shares and redeemed assets round down; exact-asset withdrawals round shares up. Previews can change before execution."}]})},{name:"spark_deposit",inputSchema:{type:"object",properties:{amount:P('Amount of USDG in base units (USDG has 6 decimals). Example: "1000000" = 1 USDG.')},required:["amount"],additionalProperties:!1},execute:(a,e)=>l(async()=>{let r=D(a,!0),d=await v(e),[o,u]=await Promise.all([d("maxDeposit",[e]),d("previewDeposit",[r])]);if(r>o)throw new p("The deposit exceeds Spark\u2019s current maximum deposit.");if(u===0n)throw new p("This deposit would return zero Spark shares.");let x=[s.approval(b,f,r.toString(),h),s.unsignedTx({to:f,data:A({abi:k,functionName:"deposit",args:[r,e]}),value:"0",chainId:h,description:`Deposit ${n(t(i,r))} into Spark for this wallet.`})];return g(x,e,{assets:t(i,r),shares:t(m,u),maxDeposit:t(i,o)},`Approve exactly ${n(t(i,r))} for Spark ${f}, then deposit. Expected ${n(t(m,u))}, rounded down; current maximum deposit ${n(t(i,o))}.`)})},{name:"spark_withdraw",inputSchema:{type:"object",properties:{amount:{type:"string",anyOf:[{pattern:"^[0-9]+$"},{const:"max"}],description:'Amount of USDG in base units (USDG has 6 decimals; "1000000" = 1 USDG), or "max" to redeem all held shares.'}},required:["amount"],additionalProperties:!1},execute:(a,e)=>l(async()=>{let r=D(a,!0,!0),d=await v(e),[o,u,x]=await Promise.all([d("balanceOf",[e]),d("maxWithdraw",[e]),d("maxRedeem",[e])]);if(o===0n)throw new p("This wallet has no Spark shares to withdraw.");let c,w,S;if(r==="max"){if(w=o,w>x)throw new p("The full share balance exceeds Spark\u2019s current maximum redeem. Request an asset amount within the current maximum withdrawal.");c=await d("previewRedeem",[w]),S=A({abi:k,functionName:"redeem",args:[w,e,e]})}else{if(c=r,c>u)throw new p("The withdrawal exceeds Spark\u2019s current maximum withdrawal.");if(w=await d("previewWithdraw",[c]),w>o)throw new p("This wallet has insufficient Spark shares for the withdrawal.");S=A({abi:k,functionName:"withdraw",args:[c,e,e]})}if(c===0n||w===0n)throw new p("Spark returned a zero asset or share preview for this withdrawal.");let j=r==="max"?`Redeem all ${n(t(m,w))} from Spark to this wallet.`:`Withdraw ${n(t(i,c))} from Spark to this wallet.`,O=[s.unsignedTx({to:f,data:S,value:"0",chainId:h,description:j})];return g(O,e,{assets:t(i,c),shares:t(m,w),maxWithdraw:t(i,u),maxRedeem:t(m,x)},r==="max"?`Redeem all ${n(t(m,w))} for an expected ${n(t(i,c))}, rounded down. Current maximum redeem ${n(t(m,x))}.`:`Withdraw ${n(t(i,c))} using an expected ${n(t(m,w))}, rounded up. Current maximum withdrawal ${n(t(i,u))}.`)})}]}};function te(s){return W("spark",[F(s)])}export{F as a,te as b};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as W}from"./4J245N3F.js";import{c as K}from"./SCG5HWMN.js";import{a as N}from"./WWYAAIE2.js";import{g as S}from"./NWNYJ26T.js";import{a as j,b as M,c as O}from"./IX3GZMTM.js";import{b as q,j as z}from"./TI727O2H.js";import{a}from"./XSD5NL7J.js";import{a as $}from"./JXOEJPJ4.js";import{encodeAbiParameters as ce,encodeFunctionData as J,erc20Abi as V,getAddress as Z,isAddress as me,keccak256 as X,parseAbi as ue,parseAbiParameters as ye,zeroAddress as ee}from"viem";var x=q,C=Z(z[x].hoodlock.airdrop.address),oe="https://hoodlock.tech",P=25e4,ge=256,fe=604800n,pe=30n,Q=250000000000000000n,Y=0xffffffffn,be=(1n<<64n)-1n,ne=(1n<<128n)-1n,re="0x0000000000000000000000000000000000000000000000000000000000000000",xe="0x1111111111111111111111111111111111111111",Ae=ye("uint256, address, uint256"),T=ue(["function quote(uint32 maxClaims) view returns (uint256)","function create(address token, bytes32 merkleRoot, uint256 total, uint32 maxClaims, uint64 endTime, string uri) payable returns (uint256 id)","function claim(uint256 id, uint256 index, address account, uint256 amount, bytes32[] proof)","function getAirdrop(uint256 id) view returns (address creator, uint64 endTime, uint32 maxClaims, address token, uint32 claims, bool swept, bytes32 merkleRoot, uint128 total, uint128 remaining)","function isClaimed(uint256 id, uint256 index) view returns (bool)"]);function he(o,e,r){let n=e.trim();if(n.startsWith("-")){let t=n.slice(1);return`-${o.formatAmount(t,r)}`}let d=n.startsWith("+")?n.slice(1):n;return o.formatAmount(d,r)}function te(o,e){if(!e.changes.length)return e.summary;let r=e.changes.map(n=>`${he(o,n.amount,n.token.decimals)} ${$(n.token.symbol)}`).join(", ");return`${e.summary} (${r})`}async function we(o,e){try{let[r,n]=await Promise.all([o.readContract({address:e,abi:V,functionName:"symbol"}),o.readContract({address:e,abi:V,functionName:"decimals"})]),d=typeof r=="string"&&r.trim()?r.trim():"TOKEN",t=Number(n);return{symbol:d,decimals:Number.isInteger(t)&&t>=0&&t<=255?t:18}}catch{return{symbol:"TOKEN",decimals:18}}}function w(o,e,r){if(typeof e=="string"&&e.includes(".")){if(r?.decimals===void 0)throw new a(`Decimal string amount "${e}" requires explicit token decimals; amount inputs are base-unit integer strings by default.`);let d=r.rounding!==void 0?O(e,r.decimals,r.rounding):o?o.parseAmount(e,r.decimals):O(e,r.decimals),t=M(d);if(t<=0n)throw new a("Airdrop entry amount must be positive.");return t}let n;try{if(typeof e=="bigint")n=e;else if(typeof e=="string")n=M(e.trim());else throw j()}catch(d){throw d instanceof a?d:new a(`Invalid airdrop amount "${String(e)}".`,{cause:d})}if(n<=0n)throw new a("Airdrop entry amount must be strictly positive (> 0).");return n}function H(o,e){try{let r=typeof o=="bigint"?o:BigInt(String(o).trim());if(r<0n)throw new a(`${e} must be non-negative.`);return r}catch(r){throw r instanceof a?r:new a(`Invalid ${e}: ${String(o)}`,{cause:r})}}function A(o,e){if(typeof o!="string"||!me(o,{strict:!1}))throw new a(`Invalid ${e} address "${String(o)}": token/account must be a valid EVM address, never a symbol.`);return Z(o)}function L(o,e,r){let n=typeof o=="bigint"?o:BigInt(o);if(n<0n||n>Y)throw new a(`Airdrop leaf index must be in 0..${Y.toString()}.`);let d=A(e,"account"),t=w(void 0,r),s=ce(Ae,[n,d,t]);return X(X(s))}function ie(o,e){let r=o;for(let n of e)r=N(r,n);return r}function Ne(o){try{let e=L(o.index,o.account,o.amount),r=ie(e,o.proof);return S(r,o.root)}catch{return!1}}function U(o,e){if(!Array.isArray(o)||o.length===0)throw new a("Airdrop entries list cannot be empty; maxClaims must be in 1..250000.");if(o.length>P)throw new a(`Airdrop entries length (${o.length}) exceeds maxClaims limit of ${P}.`);let r=[],n=0n;for(let i=0;i<o.length;i+=1){let l=o[i];if(!l)throw new a(`Missing airdrop entry at position ${i}.`);let c=l.index??i;if(!Number.isInteger(c)||c!==i)throw new a(`Airdrop entry index at position ${i} must be contiguous ${i} (got ${String(c)}).`);let u=A(l.account,`entries[${i}].account`),g=w(e?.context,l.amount,e);n+=g,r.push({index:c,account:u,amount:g.toString()})}if(n<=0n||n>ne)throw new a("Airdrop total amount must be > 0 and fit in uint128.");let d=r.map(i=>L(i.index,i.account,i.amount)),t=[d];for(;t[t.length-1].length>1;){let i=t[t.length-1],l=[];for(let c=0;c<i.length;c+=2){let u=i[c],g=i[c+1];g===void 0?l.push(u):l.push(N(u,g))}t.push(l)}let s=t[t.length-1][0];if(s.toLowerCase()===re)throw new a("Computed Merkle root cannot be zero.");let f=t.length>1?t[1]:t[0],m=r.map((i,l)=>{let c=[],u=l;for(let g=0;g<t.length-1;g+=1){let y=t[g],b=u^1;b<y.length&&c.push(y[b]),u=Math.floor(u/2)}return{index:i.index,account:i.account,amount:i.amount,leaf:d[l],proof:c}}),p={format:"openzeppelin-standard-merkle-tree-v1",leafEncoding:["uint256","address","uint256"],root:s,totalAmount:n.toString(),maxClaims:r.length,values:r.map(i=>[i.index,i.account,i.amount]),entries:r};return{root:s,leaves:d,level1:f,totalAmount:n.toString(),maxClaims:r.length,entries:r,proofs:m,list:p}}function ke(o){if(!o||!Array.isArray(o.entries)&&!Array.isArray(o.values))throw new a("Saved airdrop list is missing entries/values.");let e=Array.isArray(o.entries)&&o.entries.length>0?o.entries:o.values.map(([n,d,t])=>({index:n,account:d,amount:t})),r=U(e);if(o.root&&!S(r.root,o.root))throw new a(`Rebuilt tree root ${r.root} does not match saved list root ${o.root}.`);if(o.maxClaims!==void 0&&r.maxClaims!==o.maxClaims)throw new a(`Rebuilt maxClaims (${r.maxClaims}) does not match saved list maxClaims (${o.maxClaims}).`);if(o.totalAmount!==void 0&&r.totalAmount!==o.totalAmount)throw new a(`Rebuilt totalAmount (${r.totalAmount}) does not match saved list totalAmount (${o.totalAmount}).`);return r}async function ae(o,e){return K(o.http,e,{method:"GET"},r=>r!==null&&typeof r=="object")}async function $e(o,e,r){let n=A(e.token,"token");if(n===ee)throw new a("Airdrop token cannot be the zero address.");let d=U(e.entries,{decimals:e.decimals,rounding:e.rounding,context:o}),t=e.maxClaims??d.maxClaims;if(!Number.isInteger(t)||t<1||t>P||t!==d.maxClaims)throw new a(`maxClaims (${String(t)}) must equal entries.length (${d.maxClaims}) and be in 1..${P}.`);let s=BigInt(d.totalAmount),f=e.total!==void 0?w(o,e.total,{decimals:e.decimals,rounding:e.rounding}):s;if(f<s)throw new a(`Airdrop total (${f.toString()}) is less than the sum of entry amounts (${s.toString()}).`);if(f<=0n||f>ne)throw new a("Airdrop total must be positive and fit in uint128.");let m=e.uri??"",p=new TextEncoder().encode(m).byteLength;if(p>ge)throw new a(`Airdrop URI length (${p} bytes) exceeds 256-byte limit.`);let i=e.endTime!==void 0?H(e.endTime,"endTime"):0n;if(i>be)throw new a("endTime exceeds uint64 maximum.");let l=o.clientFor(x),c=await l.getCode({address:n});if(!c||c==="0x")throw new a(`Token ${n} has no contract code on chain ${x}.`);let u;if(i!==0n){let _=(await l.getBlock()).timestamp,B=e.inclusionMargin!==void 0?H(e.inclusionMargin,"inclusionMargin"):pe;if(B<=0n)throw new a("inclusionMargin must be at least 1 second to leave room for signing and inclusion after the already-mined block.");let D=_+B,I=e.inclusionTime!==void 0?H(e.inclusionTime,"inclusionTime"):D;if(I<D)throw new a(`inclusionTime (${I.toString()}) must be after the already-mined block (${_.toString()}) with room for signing and inclusion (>= ${D.toString()}).`);u=I;let F=I+fe;if(i<F)throw new a(`endTime (${i.toString()}) is too short (window too short): must be 0 or at least inclusion time (${I.toString()}) + 604800 (7 days >= ${F.toString()}, after already-mined block.timestamp ${_.toString()}).`)}let g=await l.readContract({address:C,abi:T,functionName:"quote",args:[t]}),y=typeof g=="bigint"?g:BigInt(String(g));if(y<0n||y>Q)throw new a(`HoodLock quote(uint32) fee (${y.toString()}) exceeds max fee cap (${Q.toString()}).`);let b=o.formatAmount(y.toString(),W.decimals),h=o.approval(n,C,f.toString(),x),k=o.unsignedTx({chainId:x,to:C,data:J({abi:T,functionName:"create",args:[n,d.root,f,t,i,m]}),value:y.toString(),description:`Create HoodLock airdrop (${t} claims, total ${f.toString()}, quote fee ${b} ETH (${y.toString()} wei))`}),v=[h,k],E=A(e.account??r??xe,"wallet"),R=await o.preview(v,E),le=y>0n?` Quote fee: -${b} ETH (${b} ETH / ${y.toString()} wei).`:" Quote fee: 0 ETH (0 wei).",se=`${te(o,R)}${le}`;return{kind:"hoodlock_airdrop_create",chainId:x,token:n,merkleRoot:d.root,totalAmount:d.totalAmount,total:f.toString(),maxClaims:t,endTime:i,...u!==void 0?{inclusionTime:u}:{},uri:m,quoteFee:y,list:d.list,proofs:d.proofs,txs:v,preview:R,summary:se}}async function G(o,e,r,n){if(n.savedProof){let m=A(n.savedProof.account,"savedProof.account");if(m!==r)throw new a(`savedProof account (${m}) does not match claim account (${r}).`);return{index:n.savedProof.index,amount:w(o,n.savedProof.amount),proof:n.savedProof.proof}}if(n.proof!==void 0&&n.index!==void 0&&n.amount!==void 0){let m=Number(n.index);if(!Number.isInteger(m)||m<0)throw new a(`Invalid claim index: ${String(n.index)}`);return{index:m,amount:w(o,n.amount),proof:n.proof}}if(n.list||n.entries){let p=(n.list?ke(n.list):U(n.entries,{context:o})).proofs.find(i=>!(!S(i.account,r)||n.index!==void 0&&i.index!==Number(n.index)));if(!p)throw new a(`Account ${r} was not found in the saved airdrop list.`);return{index:p.index,amount:w(o,p.amount),proof:p.proof}}let d=`${oe}/api/airdrop/${e.toString()}/proof?address=${r}`,t=await ae(o,d),s=t?.data??t;if(!s||s.index===void 0||s.amount===void 0||!Array.isArray(s.proof))throw new a(`No valid proof returned from HoodLock API for airdrop ${e.toString()} and account ${r}.`);let f=Number(s.index);if(!Number.isInteger(f)||f<0)throw new a(`Invalid index in API proof: ${String(s.index)}`);return{index:f,amount:w(o,s.amount),proof:s.proof}}async function de(o,e){let r=o.clientFor(x),n=await r.readContract({address:C,abi:T,functionName:"getAirdrop",args:[e.id]}),[d,t,s,f,m,p,i,,l]=n,c=BigInt(t),u=Number(s),g=Number(m),y=BigInt(l),b=A(f,"airdrop.token");if(d===ee||i.toLowerCase()===re)throw new a(`Airdrop ${e.id.toString()} does not exist.`);if(p)throw new a(`Airdrop ${e.id.toString()} has already been swept.`);if(c>0n&&(await r.getBlock()).timestamp>=c)throw new a(`Airdrop ${e.id.toString()} expired at timestamp ${c.toString()}.`);if(g>=u)throw new a(`Airdrop ${e.id.toString()} has reached maxClaims (${u}).`);let[h,k]=await Promise.all([r.readContract({address:C,abi:T,functionName:"isClaimed",args:[e.id,BigInt(e.index)]}),we(r,b)]);if(h)throw new a(`Airdrop ${e.id.toString()} index ${e.index} has already been claimed.`);if(y<e.amount)throw new a(`Airdrop ${e.id.toString()} remaining balance (${y.toString()}) is less than claim amount (${e.amount.toString()}).`);let v=L(e.index,e.account,e.amount),E=ie(v,e.proof);if(!S(E,i))throw new a(`Computed Merkle root ${E} does not match on-chain airdrop root ${i} (bad proof).`);return{tokenAddress:b,tokenMeta:k,merkleRoot:i,leaf:v}}async function Se(o,e){let{tokenAddress:r,tokenMeta:n,merkleRoot:d,leaf:t}=await de(o,e),s=e.caller??e.account,f=!S(s,e.account),m=o.formatAmount(e.amount.toString(),n.decimals),p=o.unsignedTx({chainId:x,to:C,data:J({abi:T,functionName:"claim",args:[e.id,BigInt(e.index),e.account,e.amount,[...e.proof]]}),value:"0",description:f?`Claim ${m} ${$(n.symbol)} (${e.amount.toString()} base units) from HoodLock airdrop #${e.id.toString()} for recipient ${e.account} (caller ${s} pays gas only, token delta 0)`:`Claim ${m} ${$(n.symbol)} (${e.amount.toString()} base units) from HoodLock airdrop #${e.id.toString()} for ${e.account}`}),i=[p],l=await o.preview(i,s),c,u,g=e.amount.toString(),y;if(f){let b=l.changes.filter(h=>h.amount.trim().startsWith("-"));c={...l,changes:b,summary:`${l.summary} Recipient ${e.account} receives ${m} ${$(n.symbol)} (${e.amount.toString()} base units); caller ${s} change is 0 (gas only).`},u=`Third-party claim from HoodLock airdrop #${e.id.toString()} (index ${e.index}): recipient ${e.account} receives ${m} ${$(n.symbol)} (${e.amount.toString()} base units of ${r}); caller ${s} own token change is 0 (gas only). ${l.summary}`,y="0"}else c=l,u=`Claim ${m} ${$(n.symbol)} (${e.amount.toString()} base units of ${r}) from HoodLock airdrop #${e.id.toString()} (index ${e.index}) for recipient ${e.account}. ${te(o,c)}`,y=e.amount.toString();return{kind:"hoodlock_airdrop_claim",chainId:x,id:e.id,index:e.index,account:e.account,recipient:e.account,caller:e.caller,token:r,amount:e.amount.toString(),recipientDelta:g,senderDelta:y,leaf:t,merkleRoot:d,proof:[...e.proof],tx:p,txs:i,preview:c,summary:u}}async function Ce(o,e,r){let n=A(e.account??r??"","account"),d=e.caller!==void 0?A(e.caller,"caller"):r!==void 0?A(r,"wallet"):void 0;if(e.id!==void 0){let l=H(e.id,"id"),c=await G(o,l,n,e);return Se(o,{id:l,index:c.index,account:n,caller:d,amount:c.amount,proof:c.proof})}let t=`${oe}/api/airdrop/eligible?address=${n}`,s=await ae(o,t),f=Array.isArray(s)?s:s?.claimable??s?.eligible??s?.airdrops??s?.claims??[],m=[];for(let l of f){let c=l.id??l.airdropId;if(c!==void 0)try{let u=H(c,"eligible.id"),g,y,b;if(l.index!==void 0&&l.amount!==void 0&&Array.isArray(l.proof))g=Number(l.index),y=w(o,l.amount),b=l.proof;else{let k=await G(o,u,n,{id:u,account:n});g=k.index,y=k.amount,b=k.proof}let h=await de(o,{id:u,index:g,account:n,amount:y,proof:b});m.push({id:u.toString(),index:g,account:n,token:h.tokenAddress,amount:y.toString(),proof:[...b],merkleRoot:h.merkleRoot})}catch{continue}}let p=m.length===0?`No verified eligible HoodLock airdrops were returned by the index for ${n}. Discovery can lag after creation; this does not prove there are no claims. If you know the airdrop id, call hoodlock_airdrop_claim with id and account to resolve its list/proof and verify it on-chain.`:`Found ${m.length} eligible HoodLock airdrop(s) for ${n}: ${m.map(l=>`#${l.id}`).join(", ")}. Discovery can lag after creation. Choose an id, or pass a known new id, to hoodlock_airdrop_claim to verify and build a claim transaction.`;return{kind:"hoodlock_airdrop_eligible",chainId:x,account:n,recipient:n,caller:d,recipientDelta:"0",senderDelta:"0",eligible:m,claims:[],tx:void 0,txs:[],preview:{txs:[],changes:[],summary:p},summary:p}}var ve=o=>({tools:[{name:"hoodlock_airdrop_create",inputSchema:{type:"object",required:["token","entries"],additionalProperties:!1,properties:{token:{type:"string",description:"ERC-20 token contract address on chain 4663"},entries:{type:"array",description:"Ordered airdrop entries [{ index?, account, amount }] with base-unit integer string amounts"},total:{type:"string",description:"Optional total funded token amount as a base-unit integer string (>= sum of entries)"},maxClaims:{type:"number",description:"Optional claim count (must equal entries.length in 1..250000)"},endTime:{type:"number",description:"Unix timestamp in seconds (0 for non-sweepable or >= inclusion time + 604800)"},inclusionTime:{type:"number",description:"Optional expected transaction inclusion Unix timestamp in seconds (> already-mined block.timestamp)"},inclusionMargin:{type:"number",description:"Optional signing and inclusion margin in seconds above the already-mined block.timestamp (>= 1, default 30)"},uri:{type:"string",description:"Metadata URI (<= 256 UTF-8 bytes)"},decimals:{type:"number",description:"Optional token decimals when converting human decimal entry amounts via parseAmount"},rounding:{type:"string",enum:["floor","ceil"],description:"Optional rounding mode (floor or ceil) when converting decimal amounts"},account:{type:"string",description:"Optional creator wallet address for preview simulation"}}},execute:async(e,r)=>$e(o,e,r)},{name:"hoodlock_airdrop_claim",inputSchema:{type:"object",required:["account"],additionalProperties:!1,properties:{id:{type:"string",description:"Optional airdrop ID (omit to query eligible airdrops)"},account:{type:"string",description:"Leaf recipient address that receives the tokens"},caller:{type:"string",description:"Optional caller/relayer address submitting the tx (pays gas only, receives 0 tokens)"},index:{type:"number",description:"Optional leaf index when supplying proof directly or selecting from list/entries"},amount:{type:"string",description:"Optional leaf amount as a base-unit integer string"},proof:{type:"array",items:{type:"string"},description:"Optional Merkle sibling proof array of 32-byte hex strings"},savedProof:{type:"object",description:"Optional saved proof item ({ index, account, amount, leaf?, proof }) from hoodlock_airdrop_create"},list:{type:"object",description:"Optional saved airdrop list ({ format, leafEncoding, root, totalAmount, maxClaims, values, entries }) to rebuild proof locally"},entries:{type:"array",description:"Optional airdrop entries array ([{ index?, account, amount }]) to rebuild proof locally"}}},execute:async(e,r)=>Ce(o,e,r)}]}),Le=ve;export{V as a,x as b,C as c,oe as d,P as e,ge as f,fe as g,pe as h,Q as i,T as j,he as k,L as l,ie as m,Ne as n,U as o,ke as p,ve as q,Le as r};
|
|
1
|
+
import{b as W}from"./N624NR7Y.js";import{c as K}from"./SCG5HWMN.js";import{a as N}from"./WWYAAIE2.js";import{g as S}from"./NWNYJ26T.js";import{a as j,b as M,c as O}from"./IX3GZMTM.js";import{b as q,j as z}from"./TI727O2H.js";import{a}from"./XSD5NL7J.js";import{a as $}from"./JXOEJPJ4.js";import{encodeAbiParameters as ce,encodeFunctionData as J,erc20Abi as V,getAddress as Z,isAddress as me,keccak256 as X,parseAbi as ue,parseAbiParameters as ye,zeroAddress as ee}from"viem";var x=q,C=Z(z[x].hoodlock.airdrop.address),oe="https://hoodlock.tech",P=25e4,ge=256,fe=604800n,pe=30n,Q=250000000000000000n,Y=0xffffffffn,be=(1n<<64n)-1n,ne=(1n<<128n)-1n,re="0x0000000000000000000000000000000000000000000000000000000000000000",xe="0x1111111111111111111111111111111111111111",Ae=ye("uint256, address, uint256"),T=ue(["function quote(uint32 maxClaims) view returns (uint256)","function create(address token, bytes32 merkleRoot, uint256 total, uint32 maxClaims, uint64 endTime, string uri) payable returns (uint256 id)","function claim(uint256 id, uint256 index, address account, uint256 amount, bytes32[] proof)","function getAirdrop(uint256 id) view returns (address creator, uint64 endTime, uint32 maxClaims, address token, uint32 claims, bool swept, bytes32 merkleRoot, uint128 total, uint128 remaining)","function isClaimed(uint256 id, uint256 index) view returns (bool)"]);function he(o,e,r){let n=e.trim();if(n.startsWith("-")){let t=n.slice(1);return`-${o.formatAmount(t,r)}`}let d=n.startsWith("+")?n.slice(1):n;return o.formatAmount(d,r)}function te(o,e){if(!e.changes.length)return e.summary;let r=e.changes.map(n=>`${he(o,n.amount,n.token.decimals)} ${$(n.token.symbol)}`).join(", ");return`${e.summary} (${r})`}async function we(o,e){try{let[r,n]=await Promise.all([o.readContract({address:e,abi:V,functionName:"symbol"}),o.readContract({address:e,abi:V,functionName:"decimals"})]),d=typeof r=="string"&&r.trim()?r.trim():"TOKEN",t=Number(n);return{symbol:d,decimals:Number.isInteger(t)&&t>=0&&t<=255?t:18}}catch{return{symbol:"TOKEN",decimals:18}}}function w(o,e,r){if(typeof e=="string"&&e.includes(".")){if(r?.decimals===void 0)throw new a(`Decimal string amount "${e}" requires explicit token decimals; amount inputs are base-unit integer strings by default.`);let d=r.rounding!==void 0?O(e,r.decimals,r.rounding):o?o.parseAmount(e,r.decimals):O(e,r.decimals),t=M(d);if(t<=0n)throw new a("Airdrop entry amount must be positive.");return t}let n;try{if(typeof e=="bigint")n=e;else if(typeof e=="string")n=M(e.trim());else throw j()}catch(d){throw d instanceof a?d:new a(`Invalid airdrop amount "${String(e)}".`,{cause:d})}if(n<=0n)throw new a("Airdrop entry amount must be strictly positive (> 0).");return n}function H(o,e){try{let r=typeof o=="bigint"?o:BigInt(String(o).trim());if(r<0n)throw new a(`${e} must be non-negative.`);return r}catch(r){throw r instanceof a?r:new a(`Invalid ${e}: ${String(o)}`,{cause:r})}}function A(o,e){if(typeof o!="string"||!me(o,{strict:!1}))throw new a(`Invalid ${e} address "${String(o)}": token/account must be a valid EVM address, never a symbol.`);return Z(o)}function L(o,e,r){let n=typeof o=="bigint"?o:BigInt(o);if(n<0n||n>Y)throw new a(`Airdrop leaf index must be in 0..${Y.toString()}.`);let d=A(e,"account"),t=w(void 0,r),s=ce(Ae,[n,d,t]);return X(X(s))}function ie(o,e){let r=o;for(let n of e)r=N(r,n);return r}function Ne(o){try{let e=L(o.index,o.account,o.amount),r=ie(e,o.proof);return S(r,o.root)}catch{return!1}}function U(o,e){if(!Array.isArray(o)||o.length===0)throw new a("Airdrop entries list cannot be empty; maxClaims must be in 1..250000.");if(o.length>P)throw new a(`Airdrop entries length (${o.length}) exceeds maxClaims limit of ${P}.`);let r=[],n=0n;for(let i=0;i<o.length;i+=1){let l=o[i];if(!l)throw new a(`Missing airdrop entry at position ${i}.`);let c=l.index??i;if(!Number.isInteger(c)||c!==i)throw new a(`Airdrop entry index at position ${i} must be contiguous ${i} (got ${String(c)}).`);let u=A(l.account,`entries[${i}].account`),g=w(e?.context,l.amount,e);n+=g,r.push({index:c,account:u,amount:g.toString()})}if(n<=0n||n>ne)throw new a("Airdrop total amount must be > 0 and fit in uint128.");let d=r.map(i=>L(i.index,i.account,i.amount)),t=[d];for(;t[t.length-1].length>1;){let i=t[t.length-1],l=[];for(let c=0;c<i.length;c+=2){let u=i[c],g=i[c+1];g===void 0?l.push(u):l.push(N(u,g))}t.push(l)}let s=t[t.length-1][0];if(s.toLowerCase()===re)throw new a("Computed Merkle root cannot be zero.");let f=t.length>1?t[1]:t[0],m=r.map((i,l)=>{let c=[],u=l;for(let g=0;g<t.length-1;g+=1){let y=t[g],b=u^1;b<y.length&&c.push(y[b]),u=Math.floor(u/2)}return{index:i.index,account:i.account,amount:i.amount,leaf:d[l],proof:c}}),p={format:"openzeppelin-standard-merkle-tree-v1",leafEncoding:["uint256","address","uint256"],root:s,totalAmount:n.toString(),maxClaims:r.length,values:r.map(i=>[i.index,i.account,i.amount]),entries:r};return{root:s,leaves:d,level1:f,totalAmount:n.toString(),maxClaims:r.length,entries:r,proofs:m,list:p}}function ke(o){if(!o||!Array.isArray(o.entries)&&!Array.isArray(o.values))throw new a("Saved airdrop list is missing entries/values.");let e=Array.isArray(o.entries)&&o.entries.length>0?o.entries:o.values.map(([n,d,t])=>({index:n,account:d,amount:t})),r=U(e);if(o.root&&!S(r.root,o.root))throw new a(`Rebuilt tree root ${r.root} does not match saved list root ${o.root}.`);if(o.maxClaims!==void 0&&r.maxClaims!==o.maxClaims)throw new a(`Rebuilt maxClaims (${r.maxClaims}) does not match saved list maxClaims (${o.maxClaims}).`);if(o.totalAmount!==void 0&&r.totalAmount!==o.totalAmount)throw new a(`Rebuilt totalAmount (${r.totalAmount}) does not match saved list totalAmount (${o.totalAmount}).`);return r}async function ae(o,e){return K(o.http,e,{method:"GET"},r=>r!==null&&typeof r=="object")}async function $e(o,e,r){let n=A(e.token,"token");if(n===ee)throw new a("Airdrop token cannot be the zero address.");let d=U(e.entries,{decimals:e.decimals,rounding:e.rounding,context:o}),t=e.maxClaims??d.maxClaims;if(!Number.isInteger(t)||t<1||t>P||t!==d.maxClaims)throw new a(`maxClaims (${String(t)}) must equal entries.length (${d.maxClaims}) and be in 1..${P}.`);let s=BigInt(d.totalAmount),f=e.total!==void 0?w(o,e.total,{decimals:e.decimals,rounding:e.rounding}):s;if(f<s)throw new a(`Airdrop total (${f.toString()}) is less than the sum of entry amounts (${s.toString()}).`);if(f<=0n||f>ne)throw new a("Airdrop total must be positive and fit in uint128.");let m=e.uri??"",p=new TextEncoder().encode(m).byteLength;if(p>ge)throw new a(`Airdrop URI length (${p} bytes) exceeds 256-byte limit.`);let i=e.endTime!==void 0?H(e.endTime,"endTime"):0n;if(i>be)throw new a("endTime exceeds uint64 maximum.");let l=o.clientFor(x),c=await l.getCode({address:n});if(!c||c==="0x")throw new a(`Token ${n} has no contract code on chain ${x}.`);let u;if(i!==0n){let _=(await l.getBlock()).timestamp,B=e.inclusionMargin!==void 0?H(e.inclusionMargin,"inclusionMargin"):pe;if(B<=0n)throw new a("inclusionMargin must be at least 1 second to leave room for signing and inclusion after the already-mined block.");let D=_+B,I=e.inclusionTime!==void 0?H(e.inclusionTime,"inclusionTime"):D;if(I<D)throw new a(`inclusionTime (${I.toString()}) must be after the already-mined block (${_.toString()}) with room for signing and inclusion (>= ${D.toString()}).`);u=I;let F=I+fe;if(i<F)throw new a(`endTime (${i.toString()}) is too short (window too short): must be 0 or at least inclusion time (${I.toString()}) + 604800 (7 days >= ${F.toString()}, after already-mined block.timestamp ${_.toString()}).`)}let g=await l.readContract({address:C,abi:T,functionName:"quote",args:[t]}),y=typeof g=="bigint"?g:BigInt(String(g));if(y<0n||y>Q)throw new a(`HoodLock quote(uint32) fee (${y.toString()}) exceeds max fee cap (${Q.toString()}).`);let b=o.formatAmount(y.toString(),W.decimals),h=o.approval(n,C,f.toString(),x),k=o.unsignedTx({chainId:x,to:C,data:J({abi:T,functionName:"create",args:[n,d.root,f,t,i,m]}),value:y.toString(),description:`Create HoodLock airdrop (${t} claims, total ${f.toString()}, quote fee ${b} ETH (${y.toString()} wei))`}),v=[h,k],E=A(e.account??r??xe,"wallet"),R=await o.preview(v,E),le=y>0n?` Quote fee: -${b} ETH (${b} ETH / ${y.toString()} wei).`:" Quote fee: 0 ETH (0 wei).",se=`${te(o,R)}${le}`;return{kind:"hoodlock_airdrop_create",chainId:x,token:n,merkleRoot:d.root,totalAmount:d.totalAmount,total:f.toString(),maxClaims:t,endTime:i,...u!==void 0?{inclusionTime:u}:{},uri:m,quoteFee:y,list:d.list,proofs:d.proofs,txs:v,preview:R,summary:se}}async function G(o,e,r,n){if(n.savedProof){let m=A(n.savedProof.account,"savedProof.account");if(m!==r)throw new a(`savedProof account (${m}) does not match claim account (${r}).`);return{index:n.savedProof.index,amount:w(o,n.savedProof.amount),proof:n.savedProof.proof}}if(n.proof!==void 0&&n.index!==void 0&&n.amount!==void 0){let m=Number(n.index);if(!Number.isInteger(m)||m<0)throw new a(`Invalid claim index: ${String(n.index)}`);return{index:m,amount:w(o,n.amount),proof:n.proof}}if(n.list||n.entries){let p=(n.list?ke(n.list):U(n.entries,{context:o})).proofs.find(i=>!(!S(i.account,r)||n.index!==void 0&&i.index!==Number(n.index)));if(!p)throw new a(`Account ${r} was not found in the saved airdrop list.`);return{index:p.index,amount:w(o,p.amount),proof:p.proof}}let d=`${oe}/api/airdrop/${e.toString()}/proof?address=${r}`,t=await ae(o,d),s=t?.data??t;if(!s||s.index===void 0||s.amount===void 0||!Array.isArray(s.proof))throw new a(`No valid proof returned from HoodLock API for airdrop ${e.toString()} and account ${r}.`);let f=Number(s.index);if(!Number.isInteger(f)||f<0)throw new a(`Invalid index in API proof: ${String(s.index)}`);return{index:f,amount:w(o,s.amount),proof:s.proof}}async function de(o,e){let r=o.clientFor(x),n=await r.readContract({address:C,abi:T,functionName:"getAirdrop",args:[e.id]}),[d,t,s,f,m,p,i,,l]=n,c=BigInt(t),u=Number(s),g=Number(m),y=BigInt(l),b=A(f,"airdrop.token");if(d===ee||i.toLowerCase()===re)throw new a(`Airdrop ${e.id.toString()} does not exist.`);if(p)throw new a(`Airdrop ${e.id.toString()} has already been swept.`);if(c>0n&&(await r.getBlock()).timestamp>=c)throw new a(`Airdrop ${e.id.toString()} expired at timestamp ${c.toString()}.`);if(g>=u)throw new a(`Airdrop ${e.id.toString()} has reached maxClaims (${u}).`);let[h,k]=await Promise.all([r.readContract({address:C,abi:T,functionName:"isClaimed",args:[e.id,BigInt(e.index)]}),we(r,b)]);if(h)throw new a(`Airdrop ${e.id.toString()} index ${e.index} has already been claimed.`);if(y<e.amount)throw new a(`Airdrop ${e.id.toString()} remaining balance (${y.toString()}) is less than claim amount (${e.amount.toString()}).`);let v=L(e.index,e.account,e.amount),E=ie(v,e.proof);if(!S(E,i))throw new a(`Computed Merkle root ${E} does not match on-chain airdrop root ${i} (bad proof).`);return{tokenAddress:b,tokenMeta:k,merkleRoot:i,leaf:v}}async function Se(o,e){let{tokenAddress:r,tokenMeta:n,merkleRoot:d,leaf:t}=await de(o,e),s=e.caller??e.account,f=!S(s,e.account),m=o.formatAmount(e.amount.toString(),n.decimals),p=o.unsignedTx({chainId:x,to:C,data:J({abi:T,functionName:"claim",args:[e.id,BigInt(e.index),e.account,e.amount,[...e.proof]]}),value:"0",description:f?`Claim ${m} ${$(n.symbol)} (${e.amount.toString()} base units) from HoodLock airdrop #${e.id.toString()} for recipient ${e.account} (caller ${s} pays gas only, token delta 0)`:`Claim ${m} ${$(n.symbol)} (${e.amount.toString()} base units) from HoodLock airdrop #${e.id.toString()} for ${e.account}`}),i=[p],l=await o.preview(i,s),c,u,g=e.amount.toString(),y;if(f){let b=l.changes.filter(h=>h.amount.trim().startsWith("-"));c={...l,changes:b,summary:`${l.summary} Recipient ${e.account} receives ${m} ${$(n.symbol)} (${e.amount.toString()} base units); caller ${s} change is 0 (gas only).`},u=`Third-party claim from HoodLock airdrop #${e.id.toString()} (index ${e.index}): recipient ${e.account} receives ${m} ${$(n.symbol)} (${e.amount.toString()} base units of ${r}); caller ${s} own token change is 0 (gas only). ${l.summary}`,y="0"}else c=l,u=`Claim ${m} ${$(n.symbol)} (${e.amount.toString()} base units of ${r}) from HoodLock airdrop #${e.id.toString()} (index ${e.index}) for recipient ${e.account}. ${te(o,c)}`,y=e.amount.toString();return{kind:"hoodlock_airdrop_claim",chainId:x,id:e.id,index:e.index,account:e.account,recipient:e.account,caller:e.caller,token:r,amount:e.amount.toString(),recipientDelta:g,senderDelta:y,leaf:t,merkleRoot:d,proof:[...e.proof],tx:p,txs:i,preview:c,summary:u}}async function Ce(o,e,r){let n=A(e.account??r??"","account"),d=e.caller!==void 0?A(e.caller,"caller"):r!==void 0?A(r,"wallet"):void 0;if(e.id!==void 0){let l=H(e.id,"id"),c=await G(o,l,n,e);return Se(o,{id:l,index:c.index,account:n,caller:d,amount:c.amount,proof:c.proof})}let t=`${oe}/api/airdrop/eligible?address=${n}`,s=await ae(o,t),f=Array.isArray(s)?s:s?.claimable??s?.eligible??s?.airdrops??s?.claims??[],m=[];for(let l of f){let c=l.id??l.airdropId;if(c!==void 0)try{let u=H(c,"eligible.id"),g,y,b;if(l.index!==void 0&&l.amount!==void 0&&Array.isArray(l.proof))g=Number(l.index),y=w(o,l.amount),b=l.proof;else{let k=await G(o,u,n,{id:u,account:n});g=k.index,y=k.amount,b=k.proof}let h=await de(o,{id:u,index:g,account:n,amount:y,proof:b});m.push({id:u.toString(),index:g,account:n,token:h.tokenAddress,amount:y.toString(),proof:[...b],merkleRoot:h.merkleRoot})}catch{continue}}let p=m.length===0?`No verified eligible HoodLock airdrops were returned by the index for ${n}. Discovery can lag after creation; this does not prove there are no claims. If you know the airdrop id, call hoodlock_airdrop_claim with id and account to resolve its list/proof and verify it on-chain.`:`Found ${m.length} eligible HoodLock airdrop(s) for ${n}: ${m.map(l=>`#${l.id}`).join(", ")}. Discovery can lag after creation. Choose an id, or pass a known new id, to hoodlock_airdrop_claim to verify and build a claim transaction.`;return{kind:"hoodlock_airdrop_eligible",chainId:x,account:n,recipient:n,caller:d,recipientDelta:"0",senderDelta:"0",eligible:m,claims:[],tx:void 0,txs:[],preview:{txs:[],changes:[],summary:p},summary:p}}var ve=o=>({tools:[{name:"hoodlock_airdrop_create",inputSchema:{type:"object",required:["token","entries"],additionalProperties:!1,properties:{token:{type:"string",description:"ERC-20 token contract address on chain 4663"},entries:{type:"array",description:"Ordered airdrop entries [{ index?, account, amount }] with base-unit integer string amounts"},total:{type:"string",description:"Optional total funded token amount as a base-unit integer string (>= sum of entries)"},maxClaims:{type:"number",description:"Optional claim count (must equal entries.length in 1..250000)"},endTime:{type:"number",description:"Unix timestamp in seconds (0 for non-sweepable or >= inclusion time + 604800)"},inclusionTime:{type:"number",description:"Optional expected transaction inclusion Unix timestamp in seconds (> already-mined block.timestamp)"},inclusionMargin:{type:"number",description:"Optional signing and inclusion margin in seconds above the already-mined block.timestamp (>= 1, default 30)"},uri:{type:"string",description:"Metadata URI (<= 256 UTF-8 bytes)"},decimals:{type:"number",description:"Optional token decimals when converting human decimal entry amounts via parseAmount"},rounding:{type:"string",enum:["floor","ceil"],description:"Optional rounding mode (floor or ceil) when converting decimal amounts"},account:{type:"string",description:"Optional creator wallet address for preview simulation"}}},execute:async(e,r)=>$e(o,e,r)},{name:"hoodlock_airdrop_claim",inputSchema:{type:"object",required:["account"],additionalProperties:!1,properties:{id:{type:"string",description:"Optional airdrop ID (omit to query eligible airdrops)"},account:{type:"string",description:"Leaf recipient address that receives the tokens"},caller:{type:"string",description:"Optional caller/relayer address submitting the tx (pays gas only, receives 0 tokens)"},index:{type:"number",description:"Optional leaf index when supplying proof directly or selecting from list/entries"},amount:{type:"string",description:"Optional leaf amount as a base-unit integer string"},proof:{type:"array",items:{type:"string"},description:"Optional Merkle sibling proof array of 32-byte hex strings"},savedProof:{type:"object",description:"Optional saved proof item ({ index, account, amount, leaf?, proof }) from hoodlock_airdrop_create"},list:{type:"object",description:"Optional saved airdrop list ({ format, leafEncoding, root, totalAmount, maxClaims, values, entries }) to rebuild proof locally"},entries:{type:"array",description:"Optional airdrop entries array ([{ index?, account, amount }]) to rebuild proof locally"}}},execute:async(e,r)=>Ce(o,e,r)}]}),Le=ve;export{V as a,x as b,C as c,oe as d,P as e,ge as f,fe as g,pe as h,Q as i,T as j,he as k,L as l,ie as m,Ne as n,U as o,ke as p,ve as q,Le as r};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as R}from"./G2LAO23N.js";import{C as W,H as X,I as q,L as Y,a as w,z as C}from"./ZFRTBBIW.js";import{a as V}from"./66F5ZH34.js";import{f as Q,g as D}from"./NWNYJ26T.js";import{b as K,d as J}from"./IX3GZMTM.js";import{b as k}from"./TI727O2H.js";import{a as i}from"./XSD5NL7J.js";import{encodeFunctionData as oe,erc20Abi as ne,getAddress as I,parseAbi as ie}from"viem";var P="https://hookr.fun/api/mcp",Z=ie(["function fill(uint256 orderId) returns (uint256)","function fillGasFloor(uint256 orderId) view returns (uint256)"]),N={type:"string",pattern:"^[1-9][0-9]*$"},ee={type:"string",pattern:"^0x[0-9a-fA-F]{64}$",description:"Hookr v4 pool ID: 32 bytes, 0x followed by 64 hex digits."},te={type:"string",enum:["buy","sell"],description:R.enumValues({buy:"spend the pool quote token to receive the listed token",sell:"spend the listed token to receive the quote token"})},re={cursor:{...N,description:"Order ID to start from, scanning downward (newest first). Use nextCursor from the previous page; omit for the latest order."},limit:{type:"integer",minimum:1,maximum:32,description:"Maximum number of order IDs to scan in this page, 1 to 32. Default 16."}};function B(o,m){if(typeof o!="string"||!/^[1-9][0-9]*$/.test(o)||o.length>78||BigInt(o)>=1n<<256n)throw new i(`Provide ${m} as a positive decimal integer string.`);return BigInt(o)}function g(o){return Q(o,"Hookr returned an invalid read response. Retry later.")}function H(o,m,e,t){return{name:o,inputSchema:{type:"object",description:`Read ${o.replace("hookr_","Hookr ")}. No signature or transaction.`,properties:m,required:e,additionalProperties:!1},execute:async(n,s)=>{if(Object.keys(n).some(a=>!Object.hasOwn(m,a))||e.some(a=>n[a]===void 0))throw new i(`Provide the documented arguments for ${o}.`);return t(n,s)}}}function F(o){if(typeof o!="string"||!/^0x[0-9a-fA-F]{64}$/.test(o))throw new i("Provide a 32-byte Hookr poolId.");return o}function $(o,m){let e=g(o),t=g(e.key);if(typeof t.fee!="number"||!Number.isInteger(t.fee)||t.fee<0||t.fee>16777215||typeof t.tickSpacing!="number"||!Number.isInteger(t.tickSpacing)||t.tickSpacing<=0||t.tickSpacing>8388607)throw new i("Hookr pool key is invalid.");let n={currency0:I(String(t.currency0)),currency1:I(String(t.currency1)),fee:t.fee,tickSpacing:t.tickSpacing,hooks:I(String(t.hooks))},s=m??F(e.poolId);if(BigInt(n.currency0)>=BigInt(n.currency1)||!D(W(n),s))throw new i("Hookr pool key does not match its PoolId.");let a=g(e.token),u=g(e.quote),d=r=>{let b=I(String(r.address));if(typeof r.symbol!="string"||!r.symbol.trim()||typeof r.decimals!="number"||!Number.isInteger(r.decimals)||r.decimals<0||r.decimals>255||![n.currency0,n.currency1].includes(b))throw new i("Hookr listed token metadata is invalid.");return{...r,address:b,chainId:k}},c=d(a),l=d(u);if(c.address===l.address)throw new i("Hookr listed token pair is invalid.");return{...e,poolId:s,key:n,token:c,quote:l}}async function se(o,m,e){try{let t=await o.http(P,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"tools/call",params:{name:m,arguments:e}}),signal:AbortSignal.timeout(15e3),redirect:"error"});if(!t.ok)throw new Error(`HTTP ${t.status}`);let n=g(await t.json());if(n.error||n.id!==1)throw new Error("RPC failure");let s=g(n.result);if(s.isError)throw new Error("Tool failure");let a=g(s.structuredContent);if(a.status==="unavailable"||a.error)throw new Error("Unavailable");return a}catch{throw new i(`Hookr ${m} read is unavailable. Retry later; unavailable data is not an empty result.`)}}var O=se;function ke(o){let m=e=>H(e?"hookr_orders":"hookr_open_orders",re,[],async(t,n)=>{let s=t.limit??16;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>32)throw new i("Hookr page limit must be an integer from 1 to 32.");let a=o.clientFor(k),u=await a.getBlock();if(typeof u.number!="bigint"||typeof u.timestamp!="bigint"||u.timestamp<=0n)throw new i("Hookr order reads need a valid chain block and timestamp.");let d=new Proxy(Y(a),{get(h,f,p){return f==="readContract"?y=>h.readContract({...y,blockNumber:u.number}):Reflect.get(h,f,p)}}),c={...o,clientFor:()=>d},l=await d.readContract({address:w,abi:C,functionName:"lastOrderId"});if(typeof l!="bigint"||l<0n)throw new i("Could not read the last Hookr order ID. Coverage is unknown.");let r=t.cursor===void 0?l:B(t.cursor,"cursor");if(r>l)throw new i("Hookr cursor exceeds the latest order ID. Restart pagination.");let b=[],A=new Map,x=r,S=r>BigInt(s)?r-BigInt(s):0n;for(;r>S;){let h=r--,f=X(await d.readContract({address:w,abi:C,functionName:"getOrder",args:[h]}));if(Number(f.status)===0||BigInt(f.owner)===0n)throw new i(`Hookr order #${h} is missing. Coverage is unknown.`);if(e?!D(f.owner,n):Number(f.status)!==1)continue;let p=await q(c,h,{order:f,tokens:A});if(e){b.push(p);continue}let y=null,M=null,G=null,j=null,z=BigInt(p.expiry)<u.timestamp,L=p.fillable&&!z;if(L)try{let _=await d.readContract({address:w,abi:Z,functionName:"fillGasFloor",args:[BigInt(p.orderId)]}),T=await a.estimateGas({account:n,to:w,data:oe({abi:Z,functionName:"fill",args:[BigInt(p.orderId)]}),blockNumber:u.number}),v=await a.getGasPrice();if(typeof _!="bigint"||_<0n||typeof T!="bigint"||T<=0n||typeof v!="bigint"||v<0n)throw new Error("Invalid gas data");let U=(_*6n+4n)/5n,E=T>U?T:U;y=E.toString(),M=v.toString(),G=(E*v).toString(),j=(BigInt(p.bounty)-E*v).toString()}catch{}b.push({...p,fillable:L,expired:z,economics:{gasLimit:y,gasPrice:M,estimatedGasCost:G,bountyLessEstimatedGas:j,note:"Estimate only; excludes bounty claim gas and competition. Recheck the fill preview."}})}return{chainId:k,book:w,blockNumber:u.number.toString(),chainTime:u.timestamp.toString(),orders:b,scanned:{from:x.toString(),through:(r+1n).toString()},nextCursor:r>0n?r.toString():null,complete:r===0n}});return[m(!1),m(!0),H("hookr_order",{orderId:{...N,description:R.id("Hookr limit order")}},["orderId"],async e=>q(o,B(e.orderId,"orderId"))),H("hookr_pools",{token:{type:"string",description:R.address("listed token whose pools to return")},limit:{type:"integer",minimum:1,maximum:50,description:"Maximum number of pools to return, 1 to 50."},cursor:{type:"string",pattern:"^[0-9]{1,6}$",description:"Paging cursor: the nextCursor from the previous pools page; omit for the first page."}},[],async e=>{if(e.token!==void 0)try{I(String(e.token))}catch{throw new i("Provide a valid token address.")}if(e.limit!==void 0&&(typeof e.limit!="number"||!Number.isInteger(e.limit)||e.limit<1||e.limit>50))throw new i("Pool page limit must be from 1 to 50.");if(e.cursor!==void 0&&(typeof e.cursor!="string"||!/^[0-9]{1,6}$/.test(e.cursor)))throw new i("Provide the pool nextCursor from the previous page.");let t=await O(o,"hookr_pools",e);if(!Array.isArray(t.pools))throw new i("Hookr pool coverage is unknown. Retry later.");return{...t,pools:t.pools.map(n=>$(n)),chainId:k,source:P}}),H("hookr_pool",{poolId:ee,side:te,amountIn:{...N,description:'Order input amount in base units of the input token (quote token for buy, listed token for sell); read its decimals. Example: "1000000". Give with side and minAmountOut.'},minAmountOut:{...N,description:'Minimum output in base units of the output token (listed token for buy, quote token for sell); read its decimals. Example: "1000000". Give with side and amountIn.'}},["poolId"],async e=>{let t=F(e.poolId),n=[e.side,e.amountIn,e.minAmountOut].some(y=>y!==void 0);if(n&&(e.side!=="buy"&&e.side!=="sell"||e.amountIn===void 0||e.minAmountOut===void 0))throw new i("Provide side, amountIn and minAmountOut together for order-specific bounty bounds.");let s=n?B(e.amountIn,"amountIn"):void 0,a=n?B(e.minAmountOut,"minAmountOut"):void 0;if(s!==void 0&&(s>=1n<<128n||a>=1n<<128n))throw new i("Hookr order amounts must fit uint128 base units.");let u=await O(o,"hookr_pool",{poolId:t}),d=u.listing?$(u.listing,t):void 0,c={...u,...d?{listing:d}:{},chainId:k,source:P};if(!n)return{...c,bountyBounds:{status:"requires-order-terms",note:"The keeper bounty floor depends on the order. Supply side, amountIn and minAmountOut in base units. The batch-1 0.0005 ETH observation is not a permanent floor."}};if(!d)throw new i("Hookr pool key is unavailable; bounty floor is unknown.");let l=d.key,r=g(e.side==="buy"?d.quote:d.token),b=I(String(r.address))===l.currency0,A=o.clientFor(k),x=await A.getBlock(),S=await A.readContract({address:w,abi:C,functionName:"bountyBounds",args:[l,b,s,a],blockNumber:x.number});if(!Array.isArray(S)||S.length!==3||S.some(y=>typeof y!="bigint"||y<0n||y>=1n<<128n))throw new i("Hookr bounty bounds are unavailable; the floor is unknown.");let[h,f,p]=S;return{...c,bountyBounds:{status:"available",blockNumber:x.number.toString(),token:{address:"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",symbol:"ETH",decimals:18,chainId:k},minBounty:h.toString(),defaultBounty:f.toString(),maxBounty:p.toString(),effectiveFloor:(h>0n?h:f).toString(),note:"ETH wei for this order at this block. Oak create uses the positive minimum, or the default when minimum is zero; recheck at creation."}}}),H("hookr_quote",{poolId:ee,side:te,amountIn:{...V(),description:'Amount of the input token in base units (quote token for buy, listed token for sell); read its decimals. Example: "1000000" = 1 token with 6 decimals.'}},["poolId","side","amountIn"],async(e,t)=>{let n=F(e.poolId);if(e.side!=="buy"&&e.side!=="sell")throw new i("Hookr side must be buy or sell.");if(typeof e.amountIn!="string"||K(e.amountIn)<=0n)throw new i("Provide a positive amountIn in base units.");let s=await O(o,"hookr_pool",{poolId:n}),a=$(s.listing,n),u=g(e.side==="buy"?a.quote:a.token),d=I(String(u.address)),c=d==="0x0000000000000000000000000000000000000000"?18:await o.clientFor(k).readContract({address:d,abi:ne,functionName:"decimals"});if(typeof c!="number"||!Number.isInteger(c)||c<0||c>255||typeof u.symbol!="string")throw new i("Hookr input token metadata is unavailable.");let l=J(e.amountIn,c),r=await O(o,"hookr_quote",{poolId:n,side:e.side,amount:l,payer:t}),b=await O(o,"hookr_check_trade",{poolId:n,side:e.side,amount:l,wallet:t});return{chainId:k,source:P,input:{token:{address:d,symbol:u.symbol,decimals:c,chainId:k},amount:e.amountIn},quote:r,check:b,note:"Informational quote. Review pool rules; unknown trade checks do not authorize a trade."}})]}export{se as a,ke as b};
|
|
1
|
+
import{a as R}from"./G2LAO23N.js";import{C as W,H as X,I as q,L as Y,a as w,z as C}from"./4IOHSX3Z.js";import{a as V}from"./66F5ZH34.js";import{f as Q,g as D}from"./NWNYJ26T.js";import{b as K,d as J}from"./IX3GZMTM.js";import{b as k}from"./TI727O2H.js";import{a as i}from"./XSD5NL7J.js";import{encodeFunctionData as oe,erc20Abi as ne,getAddress as I,parseAbi as ie}from"viem";var P="https://hookr.fun/api/mcp",Z=ie(["function fill(uint256 orderId) returns (uint256)","function fillGasFloor(uint256 orderId) view returns (uint256)"]),N={type:"string",pattern:"^[1-9][0-9]*$"},ee={type:"string",pattern:"^0x[0-9a-fA-F]{64}$",description:"Hookr v4 pool ID: 32 bytes, 0x followed by 64 hex digits."},te={type:"string",enum:["buy","sell"],description:R.enumValues({buy:"spend the pool quote token to receive the listed token",sell:"spend the listed token to receive the quote token"})},re={cursor:{...N,description:"Order ID to start from, scanning downward (newest first). Use nextCursor from the previous page; omit for the latest order."},limit:{type:"integer",minimum:1,maximum:32,description:"Maximum number of order IDs to scan in this page, 1 to 32. Default 16."}};function B(o,m){if(typeof o!="string"||!/^[1-9][0-9]*$/.test(o)||o.length>78||BigInt(o)>=1n<<256n)throw new i(`Provide ${m} as a positive decimal integer string.`);return BigInt(o)}function g(o){return Q(o,"Hookr returned an invalid read response. Retry later.")}function H(o,m,e,t){return{name:o,inputSchema:{type:"object",description:`Read ${o.replace("hookr_","Hookr ")}. No signature or transaction.`,properties:m,required:e,additionalProperties:!1},execute:async(n,s)=>{if(Object.keys(n).some(a=>!Object.hasOwn(m,a))||e.some(a=>n[a]===void 0))throw new i(`Provide the documented arguments for ${o}.`);return t(n,s)}}}function F(o){if(typeof o!="string"||!/^0x[0-9a-fA-F]{64}$/.test(o))throw new i("Provide a 32-byte Hookr poolId.");return o}function $(o,m){let e=g(o),t=g(e.key);if(typeof t.fee!="number"||!Number.isInteger(t.fee)||t.fee<0||t.fee>16777215||typeof t.tickSpacing!="number"||!Number.isInteger(t.tickSpacing)||t.tickSpacing<=0||t.tickSpacing>8388607)throw new i("Hookr pool key is invalid.");let n={currency0:I(String(t.currency0)),currency1:I(String(t.currency1)),fee:t.fee,tickSpacing:t.tickSpacing,hooks:I(String(t.hooks))},s=m??F(e.poolId);if(BigInt(n.currency0)>=BigInt(n.currency1)||!D(W(n),s))throw new i("Hookr pool key does not match its PoolId.");let a=g(e.token),u=g(e.quote),d=r=>{let b=I(String(r.address));if(typeof r.symbol!="string"||!r.symbol.trim()||typeof r.decimals!="number"||!Number.isInteger(r.decimals)||r.decimals<0||r.decimals>255||![n.currency0,n.currency1].includes(b))throw new i("Hookr listed token metadata is invalid.");return{...r,address:b,chainId:k}},c=d(a),l=d(u);if(c.address===l.address)throw new i("Hookr listed token pair is invalid.");return{...e,poolId:s,key:n,token:c,quote:l}}async function se(o,m,e){try{let t=await o.http(P,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"tools/call",params:{name:m,arguments:e}}),signal:AbortSignal.timeout(15e3),redirect:"error"});if(!t.ok)throw new Error(`HTTP ${t.status}`);let n=g(await t.json());if(n.error||n.id!==1)throw new Error("RPC failure");let s=g(n.result);if(s.isError)throw new Error("Tool failure");let a=g(s.structuredContent);if(a.status==="unavailable"||a.error)throw new Error("Unavailable");return a}catch{throw new i(`Hookr ${m} read is unavailable. Retry later; unavailable data is not an empty result.`)}}var O=se;function ke(o){let m=e=>H(e?"hookr_orders":"hookr_open_orders",re,[],async(t,n)=>{let s=t.limit??16;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>32)throw new i("Hookr page limit must be an integer from 1 to 32.");let a=o.clientFor(k),u=await a.getBlock();if(typeof u.number!="bigint"||typeof u.timestamp!="bigint"||u.timestamp<=0n)throw new i("Hookr order reads need a valid chain block and timestamp.");let d=new Proxy(Y(a),{get(h,f,p){return f==="readContract"?y=>h.readContract({...y,blockNumber:u.number}):Reflect.get(h,f,p)}}),c={...o,clientFor:()=>d},l=await d.readContract({address:w,abi:C,functionName:"lastOrderId"});if(typeof l!="bigint"||l<0n)throw new i("Could not read the last Hookr order ID. Coverage is unknown.");let r=t.cursor===void 0?l:B(t.cursor,"cursor");if(r>l)throw new i("Hookr cursor exceeds the latest order ID. Restart pagination.");let b=[],A=new Map,x=r,S=r>BigInt(s)?r-BigInt(s):0n;for(;r>S;){let h=r--,f=X(await d.readContract({address:w,abi:C,functionName:"getOrder",args:[h]}));if(Number(f.status)===0||BigInt(f.owner)===0n)throw new i(`Hookr order #${h} is missing. Coverage is unknown.`);if(e?!D(f.owner,n):Number(f.status)!==1)continue;let p=await q(c,h,{order:f,tokens:A});if(e){b.push(p);continue}let y=null,M=null,G=null,j=null,z=BigInt(p.expiry)<u.timestamp,L=p.fillable&&!z;if(L)try{let _=await d.readContract({address:w,abi:Z,functionName:"fillGasFloor",args:[BigInt(p.orderId)]}),T=await a.estimateGas({account:n,to:w,data:oe({abi:Z,functionName:"fill",args:[BigInt(p.orderId)]}),blockNumber:u.number}),v=await a.getGasPrice();if(typeof _!="bigint"||_<0n||typeof T!="bigint"||T<=0n||typeof v!="bigint"||v<0n)throw new Error("Invalid gas data");let U=(_*6n+4n)/5n,E=T>U?T:U;y=E.toString(),M=v.toString(),G=(E*v).toString(),j=(BigInt(p.bounty)-E*v).toString()}catch{}b.push({...p,fillable:L,expired:z,economics:{gasLimit:y,gasPrice:M,estimatedGasCost:G,bountyLessEstimatedGas:j,note:"Estimate only; excludes bounty claim gas and competition. Recheck the fill preview."}})}return{chainId:k,book:w,blockNumber:u.number.toString(),chainTime:u.timestamp.toString(),orders:b,scanned:{from:x.toString(),through:(r+1n).toString()},nextCursor:r>0n?r.toString():null,complete:r===0n}});return[m(!1),m(!0),H("hookr_order",{orderId:{...N,description:R.id("Hookr limit order")}},["orderId"],async e=>q(o,B(e.orderId,"orderId"))),H("hookr_pools",{token:{type:"string",description:R.address("listed token whose pools to return")},limit:{type:"integer",minimum:1,maximum:50,description:"Maximum number of pools to return, 1 to 50."},cursor:{type:"string",pattern:"^[0-9]{1,6}$",description:"Paging cursor: the nextCursor from the previous pools page; omit for the first page."}},[],async e=>{if(e.token!==void 0)try{I(String(e.token))}catch{throw new i("Provide a valid token address.")}if(e.limit!==void 0&&(typeof e.limit!="number"||!Number.isInteger(e.limit)||e.limit<1||e.limit>50))throw new i("Pool page limit must be from 1 to 50.");if(e.cursor!==void 0&&(typeof e.cursor!="string"||!/^[0-9]{1,6}$/.test(e.cursor)))throw new i("Provide the pool nextCursor from the previous page.");let t=await O(o,"hookr_pools",e);if(!Array.isArray(t.pools))throw new i("Hookr pool coverage is unknown. Retry later.");return{...t,pools:t.pools.map(n=>$(n)),chainId:k,source:P}}),H("hookr_pool",{poolId:ee,side:te,amountIn:{...N,description:'Order input amount in base units of the input token (quote token for buy, listed token for sell); read its decimals. Example: "1000000". Give with side and minAmountOut.'},minAmountOut:{...N,description:'Minimum output in base units of the output token (listed token for buy, quote token for sell); read its decimals. Example: "1000000". Give with side and amountIn.'}},["poolId"],async e=>{let t=F(e.poolId),n=[e.side,e.amountIn,e.minAmountOut].some(y=>y!==void 0);if(n&&(e.side!=="buy"&&e.side!=="sell"||e.amountIn===void 0||e.minAmountOut===void 0))throw new i("Provide side, amountIn and minAmountOut together for order-specific bounty bounds.");let s=n?B(e.amountIn,"amountIn"):void 0,a=n?B(e.minAmountOut,"minAmountOut"):void 0;if(s!==void 0&&(s>=1n<<128n||a>=1n<<128n))throw new i("Hookr order amounts must fit uint128 base units.");let u=await O(o,"hookr_pool",{poolId:t}),d=u.listing?$(u.listing,t):void 0,c={...u,...d?{listing:d}:{},chainId:k,source:P};if(!n)return{...c,bountyBounds:{status:"requires-order-terms",note:"The keeper bounty floor depends on the order. Supply side, amountIn and minAmountOut in base units. The batch-1 0.0005 ETH observation is not a permanent floor."}};if(!d)throw new i("Hookr pool key is unavailable; bounty floor is unknown.");let l=d.key,r=g(e.side==="buy"?d.quote:d.token),b=I(String(r.address))===l.currency0,A=o.clientFor(k),x=await A.getBlock(),S=await A.readContract({address:w,abi:C,functionName:"bountyBounds",args:[l,b,s,a],blockNumber:x.number});if(!Array.isArray(S)||S.length!==3||S.some(y=>typeof y!="bigint"||y<0n||y>=1n<<128n))throw new i("Hookr bounty bounds are unavailable; the floor is unknown.");let[h,f,p]=S;return{...c,bountyBounds:{status:"available",blockNumber:x.number.toString(),token:{address:"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",symbol:"ETH",decimals:18,chainId:k},minBounty:h.toString(),defaultBounty:f.toString(),maxBounty:p.toString(),effectiveFloor:(h>0n?h:f).toString(),note:"ETH wei for this order at this block. Oak create uses the positive minimum, or the default when minimum is zero; recheck at creation."}}}),H("hookr_quote",{poolId:ee,side:te,amountIn:{...V(),description:'Amount of the input token in base units (quote token for buy, listed token for sell); read its decimals. Example: "1000000" = 1 token with 6 decimals.'}},["poolId","side","amountIn"],async(e,t)=>{let n=F(e.poolId);if(e.side!=="buy"&&e.side!=="sell")throw new i("Hookr side must be buy or sell.");if(typeof e.amountIn!="string"||K(e.amountIn)<=0n)throw new i("Provide a positive amountIn in base units.");let s=await O(o,"hookr_pool",{poolId:n}),a=$(s.listing,n),u=g(e.side==="buy"?a.quote:a.token),d=I(String(u.address)),c=d==="0x0000000000000000000000000000000000000000"?18:await o.clientFor(k).readContract({address:d,abi:ne,functionName:"decimals"});if(typeof c!="number"||!Number.isInteger(c)||c<0||c>255||typeof u.symbol!="string")throw new i("Hookr input token metadata is unavailable.");let l=J(e.amountIn,c),r=await O(o,"hookr_quote",{poolId:n,side:e.side,amount:l,payer:t}),b=await O(o,"hookr_check_trade",{poolId:n,side:e.side,amount:l,wallet:t});return{chainId:k,source:P,input:{token:{address:d,symbol:u.symbol,decimals:c,chainId:k},amount:e.amountIn},quote:r,check:b,note:"Informational quote. Review pool rules; unknown trade checks do not authorize a trade."}})]}export{se as a,ke as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as s,c as r}from"./CFPJDLTZ.js";import{formatUnits as g}from"viem";var i="Oak x Chop. Chop's own team runs its product and contracts; Oak didn't build them and doesn't run them.",p="Chop's upgrade key can replace log code without a timelock.",u="Chop's unwrap has no on-chain minimum output. Oak checks the simulated net output, but the contract itself will not stop a worse result if state moves before inclusion.",l="Farming pairs tokens 50/50 with impermanent loss and pays in $CHOP, which can fall in price or be paused by Chop. Stake and newly earned rewards can be locked for 10 minutes.",y=[i,p,u,l],m="Wrapping $OAK moves it out of your wallet. Chop's log contract holds the underlying token; unwrap the log to receive its share, subject to Chop's fees and contract risks.",$="Oak checks that CHOP actually reached your wallet; a successful transaction alone does not prove a payout.",C=`CHOP's main WETH pool uses dynamic-fee hook ${r.key.hooks}. Oak has not verified that hook's fees, calls and settlement for swaps. This pool pin supports read-only valuation; Oak cannot currently prepare a swap through it.`,d=e=>(e.bond+e.debond)/100;function f(e){return`Wrap fee ${e.fees.bond/100}%; unwrap fee ${e.fees.debond/100}%. A short round trip loses about ${d(e.fees)}%. Caller exemptions and rounding can change the actual fee.`}function O(e){return[i,p,f(e),u,l,...e.underlying.address.toLowerCase()===s.oak.toLowerCase()?[m]:[],...e.drift.length?[`Warning: Chop code changed since Oak checked it (${e.drift.join(", ")}). New wraps and farms are refused; this exit uses the changed code.`]:[]].join(`
|
|
2
|
+
`)}function w(e){let o=e.underlying.symbol;return[`A log is a wrapped version of one token. You hand in ${o} and receive a log token that stays worth a share of the ${o} the log holds.`,"You can earn two ways: the log's backing can grow from other people's trading fees, and you can farm the log for CHOP rewards. Neither is a promised rate.",`Getting in and out costs about ${d(e.fees)}% together: the wrap fee plus the unwrap fee. Other fees set by the log can also apply.`,"The biggest risk: Chop's team holds a key that can replace the log's code at any time, with no waiting period."].join(" ")}function v(e,o,n,t){let a=o.usdEstimate===null?`price unavailable: ${o.estimateReason}`:`$${o.usdEstimate}, estimate, not a quote`,h=n.usdEstimate===null?"The pool's full USD depth has price unavailable; each reserve shows its amount and available estimate.":`The pool holds about $${n.usdEstimate} (estimate, not a quote).`,c=t.pct===null?`A rough $100 price move is unavailable: ${t.reason}.`:`A rough $100 trade using ${t.inputToken.symbol} to buy the log would move its price about ${t.pct}%.`;return[w(e),`This farm's whole CHOP reward pot is about ${o.humanAmount} CHOP (${a}). Oak can't read a reward rate, so it shows no yield.`,h,c,t.assumptions].join(" ")}var x=e=>`You hold 0 ${e}, so there is nothing to unwrap. Unwrapping needs a balance of that log. Nothing was signed.`;function P(e,o,n){let t=a=>g(a,e.decimals);return`You asked to unwrap ${t(o)} ${e.symbol} but hold ${t(n)} ${e.symbol}. Ask for ${t(n)} or less ("${n}" in base units).`}export{i as a,p as b,u as c,l as d,y as e,m as f,$ as g,C as h,d as i,f as j,O as k,w as l,v as m,x as n,P as o};
|