@oakagentkit/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dist/api/addresses.d.ts +1 -1
- package/build/dist/api/addresses.js +1 -1
- package/build/dist/api/amounts.js +1 -1
- package/build/dist/api/canonical.js +1 -1
- package/build/dist/api/chain.js +1 -1
- package/build/dist/api/errors.d.ts +1 -0
- package/build/dist/api/errors.js +1 -1
- package/build/dist/api/gas.d.ts +5 -0
- package/build/dist/api/gas.js +1 -0
- package/build/dist/api/grandfather.js +1 -1
- package/build/dist/api/history.js +1 -1
- package/build/dist/api/http.js +1 -1
- package/build/dist/api/identity-link.js +1 -1
- package/build/dist/api/merkle.js +1 -1
- package/build/dist/api/metadata.js +1 -1
- package/build/dist/api/module.js +1 -1
- package/build/dist/api/modules/beefy/index.js +1 -1
- package/build/dist/api/modules/clanker/index.js +1 -1
- package/build/dist/api/modules/erc8004/index.d.ts +11 -0
- package/build/dist/api/modules/erc8004/index.js +1 -1
- package/build/dist/api/modules/grove/index.js +1 -1
- package/build/dist/api/modules/heyresearch/index.js +1 -1
- package/build/dist/api/modules/hoodag/index.js +1 -1
- package/build/dist/api/modules/hoodlock/airdrop.js +1 -1
- package/build/dist/api/modules/hoodlock/index.js +1 -1
- package/build/dist/api/modules/hoodlock/locks-burn.js +1 -1
- package/build/dist/api/modules/hookr/create-cancel.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/kyberswap/index.js +1 -1
- package/build/dist/api/modules/lighter/index.js +1 -1
- package/build/dist/api/modules/longbow/index.js +1 -1
- package/build/dist/api/modules/meridian/index.js +1 -1
- package/build/dist/api/modules/meridian/markets.js +1 -1
- package/build/dist/api/modules/meridian/rfq.js +1 -1
- package/build/dist/api/modules/merkl/index.js +1 -1
- package/build/dist/api/modules/morpho/index.js +1 -1
- package/build/dist/api/modules/netnet/index.js +1 -1
- package/build/dist/api/modules/orbio/index.js +1 -1
- package/build/dist/api/modules/pons/claim.js +1 -1
- package/build/dist/api/modules/pons/index.js +1 -1
- package/build/dist/api/modules/pons/launch-status.js +1 -1
- package/build/dist/api/modules/pons/prices.js +1 -1
- package/build/dist/api/modules/pons/trade.js +1 -1
- package/build/dist/api/modules/poolstrade/index.js +1 -1
- package/build/dist/api/modules/priors/index.js +1 -1
- package/build/dist/api/modules/relay/inbound.d.ts +2 -0
- package/build/dist/api/modules/relay/inbound.js +1 -1
- package/build/dist/api/modules/relay/index.js +1 -1
- package/build/dist/api/modules/relay/outbound-status.js +1 -1
- package/build/dist/api/modules/spark/index.js +1 -1
- package/build/dist/api/modules/steakhouse/index.js +1 -1
- package/build/dist/api/modules/tickerspring/index.js +1 -1
- package/build/dist/api/modules/uniswap/index.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/velora/index.js +1 -1
- package/build/dist/api/positions.js +1 -1
- package/build/dist/api/pricenote.js +1 -1
- package/build/dist/api/prices.js +1 -1
- package/build/dist/api/pricing.js +1 -1
- package/build/dist/api/routes.js +1 -1
- package/build/dist/api/secret-fields.js +1 -1
- package/build/dist/api/simulate.js +1 -1
- package/build/dist/api/swap.d.ts +5 -1
- package/build/dist/api/swap.js +1 -1
- package/build/dist/api/tokens.js +1 -1
- package/build/dist/api/tx.js +1 -1
- package/build/dist/api/types.d.ts +3 -0
- package/build/dist/api/vendor-limits.js +1 -1
- package/build/dist/chunks/{OOSNTGDJ.js → 5B3UVWMV.js} +1 -1
- package/build/dist/chunks/5BP72XOA.js +1 -0
- package/build/dist/chunks/5SH3C7XP.js +1 -0
- package/build/dist/chunks/{YEE3KKTA.js → 6YQ2RX5I.js} +1 -1
- package/build/dist/chunks/{64EN6Y7E.js → 74X7PXPR.js} +1 -1
- package/build/dist/chunks/{B5RZYFQC.js → 7I6TXFXR.js} +1 -1
- package/build/dist/chunks/A5O3SRHY.js +1 -0
- package/build/dist/chunks/{D45AODDL.js → B2LA6VVF.js} +1 -1
- package/build/dist/chunks/{ZERWRK6X.js → CWQ5WXZQ.js} +1 -1
- package/build/dist/chunks/{YTHDLCHL.js → F3TOOLFQ.js} +1 -1
- package/build/dist/chunks/GOIVHR4B.js +1 -0
- package/build/dist/chunks/{47PKSOXA.js → M643PYHO.js} +1 -1
- package/build/dist/chunks/{P7Q6MJZH.js → MEZH7RPA.js} +1 -1
- package/build/dist/chunks/{AE6YEEZP.js → NDHEJGWR.js} +1 -1
- package/build/dist/chunks/NNJLMS7F.js +1 -0
- package/build/dist/chunks/{ZKOMJGNH.js → PQHU5A3U.js} +1 -1
- package/build/dist/chunks/{UL2L7NHO.js → R5CBH2CR.js} +1 -1
- package/build/dist/chunks/{VZPFBWVH.js → RYOVSHKO.js} +1 -1
- package/build/dist/chunks/{75D6Q7L3.js → SUQ6PIAV.js} +1 -1
- package/build/dist/chunks/{KFMNCJXJ.js → SXBGOGYQ.js} +1 -1
- package/build/dist/chunks/{LZK6C5LT.js → T4IYMYZD.js} +1 -1
- package/build/dist/chunks/{IABIXUNX.js → TFYLOWFO.js} +1 -1
- package/build/dist/chunks/{ZUAXW2ZD.js → TU3KHOZK.js} +1 -1
- package/build/dist/chunks/{SGDWO7XI.js → UB5U6SI2.js} +1 -1
- package/build/dist/chunks/UIJWIFGV.js +1 -0
- package/build/dist/chunks/{VZWOWR6G.js → VBWJOG3N.js} +1 -1
- package/build/dist/chunks/{KP7VSXIQ.js → WFE3NXBF.js} +1 -1
- package/build/dist/chunks/XAB4OIE3.js +1 -0
- package/build/dist/chunks/XEN45QST.js +1 -0
- package/build/dist/chunks/{MGEJPRXP.js → XKZOMGC3.js} +1 -1
- package/build/dist/chunks/{JMPOXXNJ.js → XTUXR43N.js} +1 -1
- package/build/dist/chunks/{UZH4FQEL.js → Y2SGXWFM.js} +1 -1
- package/build/dist/chunks/Z3FZWNAJ.js +1 -0
- package/build/dist/chunks/Z53DADZ4.js +1 -0
- package/build/dist/chunks/ZJUNO5N7.js +1 -0
- package/build/dist/chunks/ZZLHDHOT.js +1 -0
- package/package.json +9 -13
- package/build/dist/chunks/24JYIH53.js +0 -1
- package/build/dist/chunks/25EOXUBI.js +0 -1
- package/build/dist/chunks/4P6XI564.js +0 -1
- package/build/dist/chunks/6YU3JLQQ.js +0 -1
- package/build/dist/chunks/BH3CI6WO.js +0 -1
- package/build/dist/chunks/CUBRTOMA.js +0 -1
- package/build/dist/chunks/FSSCJNAQ.js +0 -1
- package/build/dist/chunks/S3YSJ7XH.js +0 -1
- package/build/dist/chunks/T5E4OJEU.js +0 -1
- package/build/dist/chunks/VBV366XQ.js +0 -1
- package/build/dist/chunks/XUL6NKAK.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as le,b as fe,g as W,h as Y,i as be,m as _,n as Z,y as ee,z as he}from"./XEN45QST.js";import{a as me,b as q}from"./Z53DADZ4.js";import{a as D}from"./VBWJOG3N.js";import{a as w,i as J}from"./5BP72XOA.js";import{a as pe}from"./XAB4OIE3.js";import{a as de}from"./7I6TXFXR.js";import{a as i}from"./Z3FZWNAJ.js";import{a as ce}from"./XN4WDN3O.js";import{randomUUID as xe}from"node:crypto";import{encodeAbiParameters as L,encodeFunctionData as te,erc20Abi as we,getAddress as Ae,parseAbi as C,parseAbiParameters as Q,zeroAddress as F}from"viem";var ke=J[w].pons,B=J[w].ponsTrade,Se=C(["function getLaunchedToken(address) view returns ((address token,address curve,address deployer,address creatorFeeRecipient,address pairToken,uint256 graduationThreshold,uint24 poolFee,int24 tickSpacing,uint16 creatorTaxBps,bool buybackEnabled,uint8 phase,uint256 sweptQuote,uint256 sweptTokens,uint256 sweptAt,bool exists))"]),H=C(["function getReserves() view returns (uint256 quoteReserve,uint256 tokenReserve)","function feeBps() view returns (uint256)","function creatorTaxBps() view returns (uint256)","function currentSnipeTaxBps(address) view returns (uint256)","function sellableTokens() view returns (uint256)","function buy(uint256 quoteIn,uint256 minTokensOut,address recipient) payable returns (uint256)","function sell(uint256 tokensIn,uint256 minQuoteOut,address recipient) returns (uint256)"]),Pe=C(["function quoteExactInputSingle(((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 exactAmount,bytes hookData) params) returns (uint256 amountOut,uint256 gasEstimate)"]),Ie=C(["function execute(bytes commands,bytes[] inputs,uint256 deadline) payable"]),Ne=C(["function approve(address token,address spender,uint160 amount,uint48 expiration)"]),Ee=Q("((address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey,bool zeroForOne,uint128 amountIn,uint128 amountOutMinimum,uint256 minHopPriceX36,bytes hookData)"),O={address:me,chainId:w,decimals:18,symbol:"ETH"},Te="There is no on-chain expiry. The signed transaction is protected by its minimum output.",qe=`Quote expiry is enforced by Oak before signing only. ${Te}`,v=10000n,ne=(1n<<256n)-1n,ge=(1n<<128n)-1n,T=(a,o)=>({token:a,amount:o.toString()}),ve=(a,o)=>(a+o-1n)/o,Be={type:"object",additionalProperties:!1,required:["token","amountIn"],properties:{token:{type:"string",pattern:"^0x[0-9a-fA-F]{40}$",description:"Pons launch token address on chain 4663."},amountIn:{type:"string",pattern:"^[0-9]+$",description:"Positive base units: native ETH for buy, launch token for sell."},slippageBps:{type:"integer",minimum:0,maximum:9999,default:100}}};async function ye(a,o,l,e,f=!1){if(D(l),Object.keys(o).some(m=>!["token","amountIn","slippageBps"].includes(m)))throw new i("Provide only token, amountIn and optional slippageBps.");if(typeof o.token!="string")throw new i("Provide a launch token address.");D(o.token);let t=Ae(o.token),n=de(o.amountIn);if(n===0n||n>ne)throw new i("Trade amount must be positive and within the uint256 range.");let u=o.slippageBps??100;if(typeof u!="number"||!Number.isInteger(u)||u<0||u>=1e4)throw new i("Slippage must be an integer from 0 to 9999 basis points.");let k=m=>m*(v-BigInt(u))/v,r=a.clientFor(w),c=await r.getBlock(),s=await r.readContract({address:ke.factory.address,abi:Se,functionName:"getLaunchedToken",args:[t],blockNumber:c.number});if(!s.exists||s.token.toLowerCase()!==t.toLowerCase())throw new i("This address is not a Pons launch token.");if(f&&s.phase!==0)throw new W("Pons curve quotes are only available before graduation.");if(s.phase===1)throw new i("Pons graduation is pending; the curve is closed and the pool is not ready.");if(s.phase===3)throw new i("This Pons launch was rescued and has no active trade route.");if(s.phase!==0&&s.phase!==2)throw new i("This Pons launch has an unknown trade phase.");if(s.pairToken.toLowerCase()!==F)throw new i("This trade route supports native ETH pairs only.");let[U,x]=await Promise.all([r.readContract({address:t,abi:we,functionName:"symbol",blockNumber:c.number}),r.readContract({address:t,abi:we,functionName:"decimals",blockNumber:c.number})]),y={address:t,chainId:w,symbol:ce(U),decimals:x},N=e?O:y,z=e?y:O,A=[],K=(m,P,b,g)=>a.unsignedTx({to:m,data:P,value:b.toString(),chainId:w,description:g}),p,d,$,S=n,oe=null,X;if(s.phase===0){let m=h=>r.readContract({address:s.curve,abi:H,functionName:h,blockNumber:c.number}),[[P,b],g,I,se,M]=await Promise.all([r.readContract({address:s.curve,abi:H,functionName:"getReserves",blockNumber:c.number}),m("feeBps"),m("creatorTaxBps"),e?r.readContract({address:s.curve,abi:H,functionName:"currentSnipeTaxBps",args:[l],blockNumber:c.number}):Promise.resolve(0n),e?m("sellableTokens"):Promise.resolve(0n)]);if(P<=0n||b<=0n||g+I>v-100n)throw new i("Pons curve reserves or fee settings are unavailable.");let ie=v-g-I-100n,G=se<ie?se:ie,ae=h=>({base:h*g/v,creator:h*I/v,snipe:h*G/v}),ue=h=>{let E=ae(h);return h-E.base-E.creator-E.snipe},R;if(e){if(M<=0n||M>=b)throw new i("The curve has no available sellable tokens.");let h=ue(n);if(p=h*b/(P+h),p>=M){p=M;let E=p*P/(b-p)+1n;S=ve(E*v,v-g-I-G),S>n&&(S=n)}R=S,d=k(p),$=ve(d*n,S)}else R=n*P/(b+n),p=ue(R),d=k(p),A.push(a.approval(t,s.curve,n.toString(),w));let V=ae(R);oe={base:T(O,V.base),creator:T(O,V.creator),snipe:T(O,V.snipe)},X=`Curve fees included: ${g} base, ${I} creator and ${G} opening-tax basis points, each rounded separately.`,A.push(K(s.curve,te({abi:H,functionName:e?"buy":"sell",args:[n,$??d,l]}),e?n:0n,e?"Buy Pons curve tokens with native ETH.":"Sell Pons curve tokens for native ETH."))}else{if(n>ge)throw new i("Trade amount exceeds the router uint128 range.");let m={currency0:F,currency1:t,fee:s.poolFee,tickSpacing:s.tickSpacing,hooks:ke.memeHook.address};if(p=(await r.simulateContract({address:B.quoter.address,abi:Pe,functionName:"quoteExactInputSingle",args:[{poolKey:m,zeroForOne:e,exactAmount:n,hookData:"0x"}],account:l,gas:pe,blockNumber:c.number})).result[0],d=k(p),d>ge)throw new i("Minimum output exceeds the router uint128 range.");let b=c.timestamp+300n;if(b>=1n<<48n)throw new i("Permit2 expiry exceeds its timestamp range.");e||(A.push(a.approval(t,B.permit2.address,n.toString(),w)),A.push(K(B.permit2.address,te({abi:Ne,functionName:"approve",args:[t,B.universal_router.address,n,Number(b)]}),0n,"Approve the exact token amount to the Pons router through Permit2 for five minutes.")));let g=[L(Ee,[{poolKey:m,zeroForOne:e,amountIn:n,amountOutMinimum:d,minHopPriceX36:0n,hookData:"0x"}]),L(Q("address,uint256"),[e?F:t,n]),L(Q("address,uint256"),[e?t:F,d])],I=L(Q("bytes,bytes[]"),["0x060c0f",g]);A.push(K(B.universal_router.address,te({abi:Ie,functionName:"execute",args:["0x10",[I],b]}),e?n:0n,"Trade through Pons Universal Router v2.1.2.")),X="Quoter output is net of Pons hook fees; no additional fee is subtracted."}if(p<=0n||d<=0n||d>ne||($??d)>ne)throw new i("Trade output or minimum is outside the supported positive range.");let re=f?{changes:[],summary:"Quote only; preview is required before sending."}:await a.preview(A,l),j=n-S;return{txs:A,changes:re.changes,summary:`${e?"Buy":"Sell"} ${y.symbol} (${y.address}) on chain ${w}. ${X} ${s.phase===0?`${Te} `:""}${j>0n?`Expected native refund: ${a.formatAmount(j.toString(),18)} ETH; minimum output uses the expected spend after refund. `:""}${re.summary}`,quote:{phase:s.phase,amountIn:T(N,n),amountOut:T(z,p),minAmountOut:T(z,d),minimumKind:"absolute",calldataMinAmountOut:T(z,$??d),expectedSpend:T(N,S),expectedRefund:T(N,j),fees:oe,blockNumber:c.number.toString()}}}function Ue(a){let o=new Map,l=e=>{if(BigInt(_())>=BigInt(e.expiresAt))throw new Y};return{name:"pons",async quote(e,f){e={...e,from:q(e.from),to:q(e.to)};let t=Z(e.from);if(t===Z(e.to))throw new W("Pons curve quotes require native ETH and a launch token.");let n=String(_()+le),u=await ye(a,{token:t?e.to:e.from,amountIn:e.amountIn,slippageBps:e.slippageBps??fe},f,t,!0),k=u.txs.at(-1),r=u.quote,c=r.minAmountOut.amount,s=r.fees,U=`Pons curve fees included in net output: ${s.base.amount} base, ${s.creator.amount} creator and ${s.snipe.amount} opening tax, in native ETH base units (18 decimals). Oak swap fee: 0 (venue fee is never Oak income). ${qe}`,x=he({...e,quoteId:`pons:${xe()}`,provider:"pons",wallet:f,chainId:w,router:k.to,spender:k.to,expiresAt:n,data:k.data,value:k.value,amountOut:r.amountOut.amount,minAmountOut:c,blockNumber:r.blockNumber,ponsCurveToken:t?e.to:e.from,calldataMinAmountOut:r.calldataMinAmountOut.amount,expectedSpend:r.expectedSpend.amount,expectedRefund:r.expectedRefund.amount,feeDisclosure:U,oakFee:"0"});ee(k,x),l(x);for(let[y,N]of o)BigInt(_())>=BigInt(N.quote.expiresAt)&&o.delete(y);for(;o.size>=be;)o.delete(o.keys().next().value);return o.set(x.quoteId,{quote:{...x},txs:u.txs.map(y=>({...y})),summary:u.summary}),x},async build(e,f){let t=o.get(e);if(!t)throw new Y;if(l(t.quote),D(f),f.toLowerCase()!==t.quote.wallet.toLowerCase())throw new i("Quote was issued for a different wallet.");let n=t.txs.map(r=>({...r}));ee(n.at(-1),t.quote);let u=await a.preview(n,f);if(l(t.quote),u.changes.filter(r=>q(r.token.address).toLowerCase()===q(t.quote.to).toLowerCase()).reduce((r,c)=>r+BigInt(c.amount),0n)<BigInt(t.quote.minAmountOut))throw new i("Preview retained output is below the accepted minimum.");return{txs:n,summary:`${t.summary} ${u.summary} ${t.quote.feeDisclosure}`}}}}var Oe=a=>({tools:[!0,!1].map(o=>({name:o?"pons_buy":"pons_sell",inputSchema:Be,async execute(l,e){try{return await ye(a,l,e,o)}catch(f){throw new i(a.plainError(f))}}}))}),ze=Oe;export{Ue as a,Oe as b,ze as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as Y}from"./VZPFBWVH.js";import{b as V,c as W,d as G}from"./KFMNCJXJ.js";import{e as de,f as L}from"./VBV366XQ.js";import{a as B}from"./S3YSJ7XH.js";import{a as N}from"./VZWOWR6G.js";import{a as S,i as D}from"./25EOXUBI.js";import{a as H,b as se,c as ae,d as j}from"./B5RZYFQC.js";import{a as r}from"./T5E4OJEU.js";import{decodeEventLog as pe,decodeFunctionData as ve,encodeAbiParameters as ye,encodeFunctionData as ge,erc20Abi as Z,getAddress as l,isAddress as $,keccak256 as Ne,parseAbi as Be,parseAbiParameters as we,toEventSelector as be}from"viem";var k=l(D[4663].hookr.HookrLimitOrders.address),Fe=l(D[4663].hookr.HookrRoot.address),ke=l(D[4663].hookr.HookrRouter.address),At=l(D[4663].hookr.HookrQuoter.address),Me=l(D[4663].hookr.HookrRegistry.address),ze=l(D[4663].hookr.HookrForwarder.address),Oe=l(D[4663].hookr.PoolManager.address),ht=l(D[4663].hookr.HOOKR_Token.address),qe=l("0x000000000000000000000000000000000000dEaD"),Xe=8388608,Ke=200,ce=60n,Ue=604800n,ue=31536000n,St=10,Ct=100,xt="500000000000000",Dt="10000000000000000",le=4096n,Q=32n,je=1e4,Ve=(1n<<127n)-1n,me=(1n<<128n)-1n,We=(1n<<160n)-1n,Ge=(1n<<40n)-1n,Ye=16777215,Qe=8388607,fe=1n<<192n,ee=0,M=1,Ze=2,Je=3,et=be("OrderCreated(uint256,address,bytes32,bool,uint128,uint128,uint128,uint40,address)"),tt=be("OrderCancelled(uint256,address,address,uint256,uint256)"),A=Be(["function bountyBounds((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, bool zeroForOne, uint128 amountIn, uint128 minAmountOut) view returns (uint128 minBounty, uint128 defaultBounty, uint128 maxBounty)","function createOrder(((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, bool zeroForOne, uint128 amountIn, uint128 minAmountOut, uint160 sqrtPriceLimitX96, address recipient, uint40 expiry, uint128 bounty) params) payable returns (uint256 orderId)","function cancel(uint256 orderId, address to)","function getOrder(uint256 orderId) view returns (((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, address owner, uint40 createdAt, uint40 expiry, bool zeroForOne, uint8 status, address recipient, uint128 amountIn, uint128 minAmountOut, uint128 bounty, uint160 sqrtPriceLimitX96))","function quoteFill(uint256 orderId) view returns (bool fillable, uint256 amountOut)","function lastOrderId() view returns (uint256)","function liabilities(address currency) view returns (uint256)","function router() view returns (address)","function registry() view returns (address)","function poolManager() view returns (address)","function forwarder() view returns (address)","event OrderCreated(uint256 indexed orderId, address indexed owner, bytes32 indexed poolId, bool zeroForOne, uint128 amountIn, uint128 minAmountOut, uint128 bounty, uint40 expiry, address recipient)","event OrderCancelled(uint256 indexed orderId, address indexed owner, address indexed to, uint256 amountIn, uint256 bounty)"]);function F(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ie(e){let t=e.toLowerCase();return t===L.toLowerCase()||t===B.toLowerCase()||t===de.toLowerCase()}function T(e,t){if(typeof e!="string"||!e.trim())throw new r(`Provide a valid contract address for ${t}. Identify tokens by chain and address, never by symbol.`);let n=e.trim();if(!$(n,{strict:!1}))throw new r(`Invalid token address "${n}" for ${t}. Identify tokens by chain and address, never by symbol.`);return Ie(n)?L:l(n)}function Ae(e){let t=e===void 0?S:Number(e);if(!Number.isSafeInteger(t)||t!==S)throw new r(`Hookr limit orders are only supported on Robinhood Chain (${S}).`);return S}function nt(e){switch(e){case ee:return"None";case M:return"Open";case Ze:return"Filled";case Je:return"Cancelled";default:return"Unknown"}}function rt(e,t,n=ae){if(typeof e!="string"||!/^-?\d+$/.test(e.trim()))throw new r("Signed amount must be an integer string in base units.");let o=e.trim();if(o.startsWith("-")){let i=o.slice(1),u=n(i,t);return u==="0"?"0":`-${u}`}return n(o,t)}function Lt(e,t,n="floor"){return se(e,t,n)}function he(e){return Ne(ye(we("address, address, uint24, int24, address"),[l(e.currency0),l(e.currency1),e.fee,e.tickSpacing,l(e.hooks)]))}function Se(e,t){let n=e.toLowerCase();if(new Set([L.toLowerCase(),qe.toLowerCase(),k.toLowerCase(),ke.toLowerCase(),ze.toLowerCase(),Oe.toLowerCase(),t.toLowerCase()]).has(n))throw new r(`Recipient ${e} is a reserved address and cannot receive Hookr limit order funds.`)}async function J(e,t,n,o){if(Ie(e))return{address:B,symbol:V.symbol,decimals:V.decimals,chainId:t};let i=l(e),u=i.toLowerCase();if(F(o)){let s=typeof o.decimals=="number"&&Number.isInteger(o.decimals)&&o.decimals>=0&&o.decimals<=255?o.decimals:void 0,a=typeof o.symbol=="string"&&o.symbol.trim()?o.symbol.trim():void 0;if(s!==void 0&&a!==void 0)return{address:i,symbol:a,decimals:s,chainId:t}}if(u===W.address.toLowerCase())return{...W,chainId:t};if(u===G.address.toLowerCase())return{...G,chainId:t};try{let[s,a]=await Promise.all([n.readContract({address:i,abi:Z,functionName:"symbol"}),n.readContract({address:i,abi:Z,functionName:"decimals"})]);if(typeof s!="string"||!s.trim()||typeof a!="number"||!Number.isInteger(a)||a<0||a>255)throw new r(`Invalid token metadata for ${i}.`);return{address:i,symbol:s.trim(),decimals:a,chainId:t}}catch{throw new r(`Could not read valid token metadata for ${i}. Refusing to guess token decimals.`)}}function ot(e){let t=F(e.key)?e.key:F(e.poolKey)?e.poolKey:void 0,n=t?.fee??e.fee??Xe,o=(typeof n=="string"&&/^\d+$/.test(n),Number(n));if(!Number.isInteger(o)||o<0||o>Ye)throw new r("Pool fee must be a valid uint24 integer (default 8388608 for Hookr dynamic fee pools).");let i=t?.tickSpacing??e.tickSpacing??Ke,u=(typeof i=="string"&&/^-?\d+$/.test(i),Number(i));if(!Number.isInteger(u)||u<=0||u>Qe)throw new r("Pool tickSpacing must be a positive int24 integer.");let s=t?.hooks??e.hooks??Fe;if(typeof s!="string"||!$(s,{strict:!1}))throw new r("Provide a valid Hookr root contract address for hooks.");let a=l(s);if(t?.currency0!==void 0&&t?.currency1!==void 0||e.currency0!==void 0&&e.currency1!==void 0){let m=T(t?.currency0??e.currency0,"currency0"),h=T(t?.currency1??e.currency1,"currency1");if(m.toLowerCase()===h.toLowerCase())throw new r("Pool currency0 and currency1 must be distinct token addresses.");if(BigInt(m)>=BigInt(h))throw new r("Pool currency0 must sort strictly before currency1 by address.");let O;if(typeof e.zeroForOne=="boolean")O=e.zeroForOne;else if(e.tokenIn!==void 0||e.from!==void 0){let x=T(e.tokenIn??e.from,"tokenIn");if(x.toLowerCase()===m.toLowerCase())O=!0;else if(x.toLowerCase()===h.toLowerCase())O=!1;else throw new r("tokenIn does not match currency0 or currency1 of the pool key.")}else throw new r("Provide zeroForOne (boolean) or tokenIn when specifying a pool key.");return{key:{currency0:m,currency1:h,fee:o,tickSpacing:u,hooks:a},zeroForOne:O}}let g=e.tokenIn??e.from,f=e.tokenOut??e.to;if(g===void 0||f===void 0)throw new r("Provide either key ({ currency0, currency1, fee, tickSpacing, hooks }) with zeroForOne or tokenIn and tokenOut addresses.");let w=T(g,"tokenIn"),b=T(f,"tokenOut");if(w.toLowerCase()===b.toLowerCase())throw new r("Input and output tokens must have distinct addresses.");let p=BigInt(w)<BigInt(b),y=p?w:b,d=p?b:w;if(typeof e.zeroForOne=="boolean"&&e.zeroForOne!==p)throw new r("zeroForOne conflicts with the canonical sorting of tokenIn and tokenOut.");return{key:{currency0:y,currency1:d,fee:o,tickSpacing:u,hooks:a},zeroForOne:p}}function it(e,t,n){let o=Y(t),i=o*o;if(n){let s=j(e.toString(),i.toString(),fe.toString(),"ceil");return BigInt(s)}let u=j(e.toString(),fe.toString(),i.toString(),"ceil");return BigInt(u)}function R(e,t){if(typeof e=="bigint"){if(e<0n)throw new r(`${t} must be a non-negative integer.`);return e}if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new r(`${t} must be a non-negative safe integer.`);return BigInt(e)}if(typeof e=="string")return H(e.trim());throw new r(`Provide ${t} as a decimal base-unit string.`)}async function st(e,t){if(t!==void 0)return R(t,"now");if(typeof e.getBlock=="function"){let n=await e.getBlock().catch(()=>{throw new r("Could not read the chain timestamp for Hookr order expiry.")});return BigInt(n.timestamp)}throw new r("Could not read the chain timestamp for Hookr order expiry.")}function Ce(e,t){return!e.changes||e.changes.length===0?"no net ERC-20 transfer deltas":e.changes.map(n=>`${rt(n.amount,n.token.decimals,t.formatAmount)} ${n.token.symbol}`).join(", ")}function xe(e,t,n,o){if(!e||!Array.isArray(e.logs))throw new r("Provide a transaction receipt with a logs array.");for(let i of e.logs){if(!i||typeof i.address!="string"||!$(i.address,{strict:!1})||!Array.isArray(i.topics)||typeof i.data!="string"||i.topics.some(u=>typeof u!="string"||!/^0x[0-9a-fA-F]{64}$/.test(u)))throw new r(`Malformed Hookr ${t} receipt log.`);if(i.address.toLowerCase()===k.toLowerCase()&&i.topics[0]?.toLowerCase()===n.toLowerCase()){if(i.topics.length!==4||!/^0x0{24}/i.test(i.topics[2])||t==="OrderCancelled"&&!/^0x0{24}/i.test(i.topics[3])||!/^0x[0-9a-fA-F]*$/.test(i.data)||i.data.length!==2+o*64)throw new r(`Malformed Hookr ${t} receipt log.`);return{topics:i.topics,data:i.data}}}throw new r(`Could not find Hookr ${t} event in transaction receipt logs.`)}function De(e){if(e.receipt!==void 0){if(!F(e.receipt)||!Array.isArray(e.receipt.logs))throw new r("Provide a transaction receipt with a logs array.");return dt({logs:e.receipt.logs})}if(e.logs!==void 0){if(!Array.isArray(e.logs))throw new r("Provide receipt logs as an array.");return at(e.logs)}}function Le(e){let t=xe(e,"OrderCreated",et,6);try{let n=pe({abi:A,eventName:"OrderCreated",...t,strict:!0});if(ye(we("bool, uint128, uint128, uint128, uint40, address"),[n.args.zeroForOne,n.args.amountIn,n.args.minAmountOut,n.args.bounty,n.args.expiry,n.args.recipient]).toLowerCase()!==t.data.toLowerCase())throw new r("Noncanonical Hookr OrderCreated event data.");return{orderId:n.args.orderId.toString(),owner:l(n.args.owner),poolId:n.args.poolId,zeroForOne:n.args.zeroForOne,amountIn:n.args.amountIn.toString(),minAmountOut:n.args.minAmountOut.toString(),bounty:n.args.bounty.toString(),expiry:n.args.expiry.toString(),recipient:l(n.args.recipient)}}catch{throw new r("Malformed Hookr OrderCreated receipt log.")}}function at(e){return Le({logs:e}).orderId}function dt(e){return Le(e).orderId}function Pt(e){let t=xe(e,"OrderCancelled",tt,2);try{let n=pe({abi:A,eventName:"OrderCancelled",...t,strict:!0});return{orderId:n.args.orderId.toString(),owner:l(n.args.owner),to:l(n.args.to),amountIn:n.args.amountIn.toString(),bounty:n.args.bounty.toString()}}catch{throw new r("Malformed Hookr OrderCancelled receipt log.")}}async function Rt(e){let t=e.clientFor(S),[n,o,i,u]=await Promise.all([t.readContract({address:k,abi:A,functionName:"router"}),t.readContract({address:k,abi:A,functionName:"registry"}),t.readContract({address:k,abi:A,functionName:"poolManager"}),t.readContract({address:k,abi:A,functionName:"lastOrderId"})]).catch(()=>{throw new r("Could not read Hookr deployment details.")}),s=l(n),a=l(o),c=l(i);return{address:k,chainId:S,router:s,registry:a,poolManager:c,lastOrderId:u.toString(),live:s.toLowerCase()===ke.toLowerCase()&&a.toLowerCase()===Me.toLowerCase()&&c.toLowerCase()===Oe.toLowerCase()}}function Pe(e){if(Array.isArray(e)){let[n,o,i,u,s,a,c,g,f,w,b]=e;return{key:Array.isArray(n)?{currency0:n[0],currency1:n[1],fee:Number(n[2]),tickSpacing:Number(n[3]),hooks:n[4]}:n,owner:o,createdAt:i,expiry:u,zeroForOne:s,status:a,recipient:c,amountIn:BigInt(g),minAmountOut:BigInt(f),bounty:BigInt(w),sqrtPriceLimitX96:BigInt(b)}}let t=e;return{key:{currency0:t.key.currency0,currency1:t.key.currency1,fee:Number(t.key.fee),tickSpacing:Number(t.key.tickSpacing),hooks:t.key.hooks},owner:t.owner,createdAt:t.createdAt,expiry:t.expiry,zeroForOne:!!t.zeroForOne,status:Number(t.status),recipient:t.recipient,amountIn:BigInt(t.amountIn),minAmountOut:BigInt(t.minAmountOut),bounty:BigInt(t.bounty),sqrtPriceLimitX96:BigInt(t.sqrtPriceLimitX96)}}async function Re(e,t,n){let o=R(t,"orderId");if(o<=0n)throw new r("Order ID must be a positive integer.");let i=e.clientFor(S),u=n?.order??await i.readContract({address:k,abi:A,functionName:"getOrder",args:[o]}).catch(()=>{throw new r(`Could not read Hookr order #${o}. Order coverage is incomplete.`)}),s=Pe(u),a=Number(s.status);if(s.owner.toLowerCase()===L.toLowerCase()||a===ee)throw new r(`Hookr order #${o} does not exist.`);let c={currency0:l(s.key.currency0),currency1:l(s.key.currency1),fee:Number(s.key.fee),tickSpacing:Number(s.key.tickSpacing),hooks:l(s.key.hooks)},g=s.zeroForOne?c.currency0:c.currency1,f=s.zeroForOne?c.currency1:c.currency0,w=m=>{let h=m.toLowerCase(),O=n?.tokens.get(h);if(O)return O;let x=J(m,S,i);return n?.tokens.set(h,x),x},[b,p]=await Promise.all([w(g),w(f)]),y=!1,d=0n;if(a===M)try{let m=await i.readContract({address:k,abi:A,functionName:"quoteFill",args:[o]});if(typeof m[0]!="boolean"||typeof m[1]!="bigint"||m[1]<0n)throw new r(`Invalid quote for Hookr order #${o}.`);y=m[0],d=m[1]}catch{throw new r(`Could not quote Hookr order #${o}. Fillability and output amount are unknown.`)}return{orderId:o.toString(),poolId:he(c),key:c,owner:l(s.owner),recipient:l(s.recipient),createdAt:BigInt(s.createdAt).toString(),expiry:BigInt(s.expiry).toString(),zeroForOne:s.zeroForOne,status:a,statusLabel:nt(a),amountIn:s.amountIn.toString(),minAmountOut:s.minAmountOut.toString(),bounty:s.bounty.toString(),sqrtPriceLimitX96:s.sqrtPriceLimitX96.toString(),tokenIn:b,tokenOut:p,fillable:y,quotedAmountOut:d.toString()}}function ct(e){return{name:"hookr_create",inputSchema:{type:"object",properties:{key:{type:"object",properties:{currency0:{type:"string"},currency1:{type:"string"},fee:{type:"number"},tickSpacing:{type:"number"},hooks:{type:"string"}}},tokenIn:{type:"string",description:"Input token address on chain 4663."},tokenOut:{type:"string",description:"Output token address on chain 4663."},zeroForOne:{type:"boolean",description:"True when selling currency0 for currency1."},amountIn:{type:"string",description:"Input amount in base units (uint128)."},minAmountOut:{type:"string",description:"Minimum net output amount in base units (uint128)."},tick:{type:"number",description:"Optional limit tick in [-887272, 887272]."},expiry:{type:"string",description:"Order expiry unix timestamp in seconds (uint40)."},deadline:{type:"string",description:"Alias for expiry unix timestamp in seconds."},bounty:{type:"string",description:"Keeper bounty in native ETH wei (uint128)."},recipient:{type:"string",description:"Order output recipient address (must be the signing wallet)."},sqrtPriceLimitX96:{type:"string",description:"Optional sqrtPriceLimitX96 (defaults to 0)."},chainId:{type:"number",description:"Must be 4663 (Robinhood Chain)."}},required:["amountIn"]},async execute(t,n){N(n);let o=l(n),i=Ae(t.chainId),u=e.clientFor(i),s=De(t),{key:a,zeroForOne:c}=ot(t),g=c?a.currency0:a.currency1,f=c?a.currency1:a.currency0,[w,b]=await Promise.all([J(g,i,u,t.tokenInMeta),J(f,i,u,t.tokenOutMeta)]),p=t.recipient??o;if(typeof p!="string"||!$(p,{strict:!1}))throw new r("Provide a valid recipient address for the Hookr limit order.");let y=l(p);if(Se(y,a.hooks),y!==o)throw new r("Hookr recipient must be the signing wallet.");if(typeof t.amountIn!="string")throw new r("Provide amountIn as an integer string in base units.");let d=H(t.amountIn);if(d<=0n||d>Ve)throw new r("amountIn must be between 1 and int128.max base units.");if(t.tick!==void 0){let P=Number(t.tick);Y(P)}let m;if(t.minAmountOut!==void 0){if(typeof t.minAmountOut!="string")throw new r("Provide minAmountOut as an integer string in base units.");m=H(t.minAmountOut)}else if(t.tick!==void 0)m=it(d,Number(t.tick),c);else throw new r("Provide minAmountOut in base units (or tick to derive minAmountOut).");if(m<=0n||m>me)throw new r("minAmountOut must be between 1 and uint128.max base units.");let h=t.sqrtPriceLimitX96!==void 0?R(t.sqrtPriceLimitX96,"sqrtPriceLimitX96"):0n;if(h>We)throw new r("sqrtPriceLimitX96 exceeds uint160 bounds.");let O=await st(u,t.now),x=t.expiry??t.deadline,I;if(x!==void 0)I=R(x,"expiry");else if(t.lifetime!==void 0||t.ttlSeconds!==void 0){let P=R(t.lifetime??t.ttlSeconds,"lifetime");I=O+P}else I=O+Ue;if(I<O+ce)throw new r(`Order expiry (${I}) is expired or below the minimum lifetime of ${ce} seconds from block timestamp ${O}.`);if(I>O+ue||I>Ge)throw new r(`Order expiry (${I}) exceeds the maximum lifetime of ${ue} seconds (365 days).`);let z=await u.readContract({address:k,abi:A,functionName:"bountyBounds",args:[a,c,d,m]}).catch(()=>{throw new r("Could not read Hookr bounty bounds.")}),_=BigInt(z[0]),q=BigInt(z[1]),X=BigInt(z[2]);if(t.bounty!==void 0&&typeof t.bounty!="string")throw new r("Provide bounty as an integer string in base units.");let C=t.bounty!==void 0?H(t.bounty):q,K=_>0n?_:q;if(C<_||K>0n&&C<K)throw new r(`Order keeper bounty (${C} wei) is underbounty: must be at least ${K} wei (default keeper bounty floor).`);if(C>X||C>me)throw new r(`Order keeper bounty (${C} wei) exceeds the maximum allowed bounty of ${X} wei.`);let te=g.toLowerCase()===L.toLowerCase(),v=[];if(!te){let P;try{let U=await u.readContract({address:g,abi:Z,functionName:"allowance",args:[o,k]});if(typeof U!="bigint"||U<0n)throw new r("Invalid token allowance.");P=U}catch{throw new r(`Could not read token allowance for ${g}. No approval was prepared.`)}P<d&&v.push(e.approval(g,k,d.toString(),i))}let He=te?d+C:C,Te=ge({abi:A,functionName:"createOrder",args:[{key:a,zeroForOne:c,amountIn:d,minAmountOut:m,sqrtPriceLimitX96:h,recipient:y,expiry:Number(I),bounty:C}]}),ne=e.formatAmount(d.toString(),w.decimals),re=e.formatAmount(m.toString(),b.decimals),oe=e.formatAmount(C.toString(),18),$e=e.unsignedTx({to:k,data:Te,value:He.toString(),chainId:i,description:`Create Hookr limit order on ${k}: sell ${ne} ${w.symbol} (${w.address}) for at least ${re} ${b.symbol} (${b.address}) with ${oe} ETH keeper bounty (fee=${a.fee}, tickSpacing=${a.tickSpacing}, expiry=${I}).`});v.push($e);let ie=await e.preview(v,o),Ee=Ce(ie,e),_e=he(a);return{txs:v,summary:`Hookr limit order prepared: sell ${ne} ${w.symbol} for at least ${re} ${b.symbol} (bounty ${oe} ETH, expiry ${I}; preview deltas: ${Ee}).`,preview:ie,poolId:_e,key:a,zeroForOne:c,amountIn:d.toString(),minAmountOut:m.toString(),bounty:C.toString(),bountyBounds:{minBounty:_.toString(),defaultBounty:q.toString(),maxBounty:X.toString()},expiry:I.toString(),recipient:y,sqrtPriceLimitX96:h.toString(),tokenIn:w,tokenOut:b,...s!==void 0?{orderId:s}:{}}}}}function ut(e){return{name:"hookr_cancel",inputSchema:{type:"object",properties:{orderId:{type:"string",description:"Hookr order ID to cancel (uint256 decimal string)."},to:{type:"string",description:"Recipient address for the refunded principal and bounty (must be the signing wallet)."},chainId:{type:"number",description:"Must be 4663 (Robinhood Chain)."}},required:["orderId"]},async execute(t,n){N(n);let o=l(n),i=Ae(t.chainId),u=De(t),s=t.orderId??t.id??u;if(s===void 0)throw new r("Provide orderId to cancel a Hookr limit order.");let a=R(s,"orderId");if(a<=0n)throw new r("orderId must be a positive integer.");let c=await Re(e,a);if(c.owner.toLowerCase()!==o.toLowerCase())throw new r(`Unauthorized cancellation: only the order owner (${c.owner}) can cancel Hookr order #${a} (caller is ${o}).`);if(c.status!==M)throw new r(`Hookr order #${a} is not open (current status: ${c.statusLabel}).`);let g=t.to??o;if(typeof g!="string"||!$(g,{strict:!1}))throw new r("Provide a valid refund recipient address for cancel.");let f=l(g);if(Se(f,c.key.hooks),f!==o)throw new r("Hookr refund recipient must be the signing wallet.");let w=ge({abi:A,functionName:"cancel",args:[a,f]}),b=e.formatAmount(c.amountIn,c.tokenIn.decimals),p=e.formatAmount(c.bounty,18),y=e.unsignedTx({to:k,data:w,value:"0",chainId:i,description:`Cancel Hookr limit order #${a} on ${k} and refund ${b} ${c.tokenIn.symbol} plus ${p} ETH bounty to ${f}.`}),d=await e.preview([y],o),m=Ce(d,e);return{txs:[y],summary:`Cancel Hookr limit order #${a}: refund ${b} ${c.tokenIn.symbol} and ${p} ETH bounty to ${f} (preview deltas: ${m}).`,preview:d,orderId:a.toString(),to:f,refundedAmountIn:c.amountIn,refundedBounty:c.bounty,tokenIn:c.tokenIn,tokenOut:c.tokenOut}}}}function lt(e){let t=performance.now()+je;return new Proxy(e,{get(n,o,i){return o!=="readContract"?Reflect.get(n,o,i):async(...u)=>{let s=t-performance.now(),a=()=>new r("Hookr scan deadline exceeded. Order coverage is incomplete; retry later.");if(s<=0)throw a();let c;try{return await Promise.race([n.readContract(...u),new Promise((g,f)=>{c=setTimeout(()=>f(a()),s)})])}finally{c!==void 0&&clearTimeout(c)}}}})}function mt(e){return async t=>{N(t);let n=l(t),o=lt(e.clientFor(S)),i={...e,clientFor:()=>o},u=await o.readContract({address:k,abi:A,functionName:"lastOrderId"}).catch(()=>{throw new r("Could not read the last Hookr order ID. Order coverage is incomplete.")});if(typeof u!="bigint"||u<0n)throw new r("Could not read a valid last Hookr order ID. Order coverage is incomplete.");let s=u,a=s>le?s-le+1n:1n;if(s<=0n)return[];let c=[],g=new Map;for(let f=a;f<=s;f+=Q){let w=Array.from({length:Number(s-f+1n<Q?s-f+1n:Q)},(p,y)=>f+BigInt(y)),b=await Promise.all(w.map(async p=>{let y=await o.readContract({address:k,abi:A,functionName:"getOrder",args:[p]}).catch(()=>{throw new r(`Could not read Hookr order #${p}. Order coverage is incomplete.`)}),d=Pe(y);if(d.owner.toLowerCase()===L||Number(d.status)===ee)throw new r(`Hookr order #${p} does not exist. Order coverage is incomplete.`);return{id:p,order:d}}));for(let{id:p,order:y}of b){if(y.owner.toLowerCase()!==n.toLowerCase()||Number(y.status)!==M)continue;let d=await Re(i,p,{order:y,tokens:g}),m=[{token:d.tokenIn,amount:d.amountIn}];BigInt(d.bounty)>0n&&m.push({token:{address:B,symbol:"ETH",decimals:18,chainId:S},amount:d.bounty});let h=e.formatAmount(d.amountIn,d.tokenIn.decimals),O=e.formatAmount(d.minAmountOut,d.tokenOut.decimals),x=e.formatAmount(d.bounty,18),I=e.formatAmount(d.quotedAmountOut,d.tokenOut.decimals);c.push({module:"hookr",id:d.orderId,chainId:S,assets:m,description:`Hookr open limit order #${d.orderId}: sell ${h} ${d.tokenIn.symbol} (${d.tokenIn.address}) for at least ${O} ${d.tokenOut.symbol} (${d.tokenOut.address}), bounty ${x} ETH, expiry ${d.expiry}, fillable=${d.fillable} (quoted output ${I} ${d.tokenOut.symbol}).`})}}return a>1n&&c.push({module:"hookr",id:"coverage",chainId:S,assets:[],description:`Hookr order coverage is incomplete: scanned IDs ${a}-${s}. Older orders require an explicit order ID.`}),c}}function Ht(e){return ve({abi:A,data:e})}var E=e=>{let t=[ct(e),ut(e)],n=mt(e);return{tools:t,positions:n}},Tt=E,$t=E,Et=E,_t=e=>{let t=E(e);return{name:"hookr",tools:t.tools,...t.positions?{positions:t.positions}:{}}},vt=E;export{k as a,Fe as b,ke as c,At as d,Me as e,ze as f,Oe as g,ht as h,qe as i,Xe as j,Ke as k,ce as l,Ue as m,ue as n,St as o,Ct as p,xt as q,Dt as r,le as s,je as t,ee as u,M as v,Ze as w,Je as x,et as y,tt as z,A,rt as B,Lt as C,he as D,Le as E,at as F,dt as G,Pt as H,Rt as I,Re as J,ct as K,ut as L,mt as M,Ht as N,E as O,Tt as P,$t as Q,Et as R,_t as S,vt as T};
|
|
1
|
+
import{i as Y}from"./RYOVSHKO.js";import{b as V,c as W,d as G}from"./SXBGOGYQ.js";import{e as de,f as L}from"./XEN45QST.js";import{a as B}from"./Z53DADZ4.js";import{a as N}from"./VBWJOG3N.js";import{a as S,i as D}from"./5BP72XOA.js";import{a as H,b as se,c as ae,d as j}from"./7I6TXFXR.js";import{a as r}from"./Z3FZWNAJ.js";import{decodeEventLog as pe,decodeFunctionData as ve,encodeAbiParameters as ye,encodeFunctionData as ge,erc20Abi as Z,getAddress as l,isAddress as $,keccak256 as Ne,parseAbi as Be,parseAbiParameters as we,toEventSelector as be}from"viem";var k=l(D[4663].hookr.HookrLimitOrders.address),Fe=l(D[4663].hookr.HookrRoot.address),ke=l(D[4663].hookr.HookrRouter.address),At=l(D[4663].hookr.HookrQuoter.address),Me=l(D[4663].hookr.HookrRegistry.address),ze=l(D[4663].hookr.HookrForwarder.address),Oe=l(D[4663].hookr.PoolManager.address),ht=l(D[4663].hookr.HOOKR_Token.address),qe=l("0x000000000000000000000000000000000000dEaD"),Xe=8388608,Ke=200,ce=60n,Ue=604800n,ue=31536000n,St=10,Ct=100,xt="500000000000000",Dt="10000000000000000",le=4096n,Q=32n,je=1e4,Ve=(1n<<127n)-1n,me=(1n<<128n)-1n,We=(1n<<160n)-1n,Ge=(1n<<40n)-1n,Ye=16777215,Qe=8388607,fe=1n<<192n,ee=0,M=1,Ze=2,Je=3,et=be("OrderCreated(uint256,address,bytes32,bool,uint128,uint128,uint128,uint40,address)"),tt=be("OrderCancelled(uint256,address,address,uint256,uint256)"),A=Be(["function bountyBounds((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, bool zeroForOne, uint128 amountIn, uint128 minAmountOut) view returns (uint128 minBounty, uint128 defaultBounty, uint128 maxBounty)","function createOrder(((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, bool zeroForOne, uint128 amountIn, uint128 minAmountOut, uint160 sqrtPriceLimitX96, address recipient, uint40 expiry, uint128 bounty) params) payable returns (uint256 orderId)","function cancel(uint256 orderId, address to)","function getOrder(uint256 orderId) view returns (((address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks) key, address owner, uint40 createdAt, uint40 expiry, bool zeroForOne, uint8 status, address recipient, uint128 amountIn, uint128 minAmountOut, uint128 bounty, uint160 sqrtPriceLimitX96))","function quoteFill(uint256 orderId) view returns (bool fillable, uint256 amountOut)","function lastOrderId() view returns (uint256)","function liabilities(address currency) view returns (uint256)","function router() view returns (address)","function registry() view returns (address)","function poolManager() view returns (address)","function forwarder() view returns (address)","event OrderCreated(uint256 indexed orderId, address indexed owner, bytes32 indexed poolId, bool zeroForOne, uint128 amountIn, uint128 minAmountOut, uint128 bounty, uint40 expiry, address recipient)","event OrderCancelled(uint256 indexed orderId, address indexed owner, address indexed to, uint256 amountIn, uint256 bounty)"]);function F(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ie(e){let t=e.toLowerCase();return t===L.toLowerCase()||t===B.toLowerCase()||t===de.toLowerCase()}function T(e,t){if(typeof e!="string"||!e.trim())throw new r(`Provide a valid contract address for ${t}. Identify tokens by chain and address, never by symbol.`);let n=e.trim();if(!$(n,{strict:!1}))throw new r(`Invalid token address "${n}" for ${t}. Identify tokens by chain and address, never by symbol.`);return Ie(n)?L:l(n)}function Ae(e){let t=e===void 0?S:Number(e);if(!Number.isSafeInteger(t)||t!==S)throw new r(`Hookr limit orders are only supported on Robinhood Chain (${S}).`);return S}function nt(e){switch(e){case ee:return"None";case M:return"Open";case Ze:return"Filled";case Je:return"Cancelled";default:return"Unknown"}}function rt(e,t,n=ae){if(typeof e!="string"||!/^-?\d+$/.test(e.trim()))throw new r("Signed amount must be an integer string in base units.");let o=e.trim();if(o.startsWith("-")){let i=o.slice(1),u=n(i,t);return u==="0"?"0":`-${u}`}return n(o,t)}function Lt(e,t,n="floor"){return se(e,t,n)}function he(e){return Ne(ye(we("address, address, uint24, int24, address"),[l(e.currency0),l(e.currency1),e.fee,e.tickSpacing,l(e.hooks)]))}function Se(e,t){let n=e.toLowerCase();if(new Set([L.toLowerCase(),qe.toLowerCase(),k.toLowerCase(),ke.toLowerCase(),ze.toLowerCase(),Oe.toLowerCase(),t.toLowerCase()]).has(n))throw new r(`Recipient ${e} is a reserved address and cannot receive Hookr limit order funds.`)}async function J(e,t,n,o){if(Ie(e))return{address:B,symbol:V.symbol,decimals:V.decimals,chainId:t};let i=l(e),u=i.toLowerCase();if(F(o)){let s=typeof o.decimals=="number"&&Number.isInteger(o.decimals)&&o.decimals>=0&&o.decimals<=255?o.decimals:void 0,a=typeof o.symbol=="string"&&o.symbol.trim()?o.symbol.trim():void 0;if(s!==void 0&&a!==void 0)return{address:i,symbol:a,decimals:s,chainId:t}}if(u===W.address.toLowerCase())return{...W,chainId:t};if(u===G.address.toLowerCase())return{...G,chainId:t};try{let[s,a]=await Promise.all([n.readContract({address:i,abi:Z,functionName:"symbol"}),n.readContract({address:i,abi:Z,functionName:"decimals"})]);if(typeof s!="string"||!s.trim()||typeof a!="number"||!Number.isInteger(a)||a<0||a>255)throw new r(`Invalid token metadata for ${i}.`);return{address:i,symbol:s.trim(),decimals:a,chainId:t}}catch{throw new r(`Could not read valid token metadata for ${i}. Refusing to guess token decimals.`)}}function ot(e){let t=F(e.key)?e.key:F(e.poolKey)?e.poolKey:void 0,n=t?.fee??e.fee??Xe,o=(typeof n=="string"&&/^\d+$/.test(n),Number(n));if(!Number.isInteger(o)||o<0||o>Ye)throw new r("Pool fee must be a valid uint24 integer (default 8388608 for Hookr dynamic fee pools).");let i=t?.tickSpacing??e.tickSpacing??Ke,u=(typeof i=="string"&&/^-?\d+$/.test(i),Number(i));if(!Number.isInteger(u)||u<=0||u>Qe)throw new r("Pool tickSpacing must be a positive int24 integer.");let s=t?.hooks??e.hooks??Fe;if(typeof s!="string"||!$(s,{strict:!1}))throw new r("Provide a valid Hookr root contract address for hooks.");let a=l(s);if(t?.currency0!==void 0&&t?.currency1!==void 0||e.currency0!==void 0&&e.currency1!==void 0){let m=T(t?.currency0??e.currency0,"currency0"),h=T(t?.currency1??e.currency1,"currency1");if(m.toLowerCase()===h.toLowerCase())throw new r("Pool currency0 and currency1 must be distinct token addresses.");if(BigInt(m)>=BigInt(h))throw new r("Pool currency0 must sort strictly before currency1 by address.");let O;if(typeof e.zeroForOne=="boolean")O=e.zeroForOne;else if(e.tokenIn!==void 0||e.from!==void 0){let x=T(e.tokenIn??e.from,"tokenIn");if(x.toLowerCase()===m.toLowerCase())O=!0;else if(x.toLowerCase()===h.toLowerCase())O=!1;else throw new r("tokenIn does not match currency0 or currency1 of the pool key.")}else throw new r("Provide zeroForOne (boolean) or tokenIn when specifying a pool key.");return{key:{currency0:m,currency1:h,fee:o,tickSpacing:u,hooks:a},zeroForOne:O}}let g=e.tokenIn??e.from,f=e.tokenOut??e.to;if(g===void 0||f===void 0)throw new r("Provide either key ({ currency0, currency1, fee, tickSpacing, hooks }) with zeroForOne or tokenIn and tokenOut addresses.");let w=T(g,"tokenIn"),b=T(f,"tokenOut");if(w.toLowerCase()===b.toLowerCase())throw new r("Input and output tokens must have distinct addresses.");let p=BigInt(w)<BigInt(b),y=p?w:b,d=p?b:w;if(typeof e.zeroForOne=="boolean"&&e.zeroForOne!==p)throw new r("zeroForOne conflicts with the canonical sorting of tokenIn and tokenOut.");return{key:{currency0:y,currency1:d,fee:o,tickSpacing:u,hooks:a},zeroForOne:p}}function it(e,t,n){let o=Y(t),i=o*o;if(n){let s=j(e.toString(),i.toString(),fe.toString(),"ceil");return BigInt(s)}let u=j(e.toString(),fe.toString(),i.toString(),"ceil");return BigInt(u)}function R(e,t){if(typeof e=="bigint"){if(e<0n)throw new r(`${t} must be a non-negative integer.`);return e}if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new r(`${t} must be a non-negative safe integer.`);return BigInt(e)}if(typeof e=="string")return H(e.trim());throw new r(`Provide ${t} as a decimal base-unit string.`)}async function st(e,t){if(t!==void 0)return R(t,"now");if(typeof e.getBlock=="function"){let n=await e.getBlock().catch(()=>{throw new r("Could not read the chain timestamp for Hookr order expiry.")});return BigInt(n.timestamp)}throw new r("Could not read the chain timestamp for Hookr order expiry.")}function Ce(e,t){return!e.changes||e.changes.length===0?"no net ERC-20 transfer deltas":e.changes.map(n=>`${rt(n.amount,n.token.decimals,t.formatAmount)} ${n.token.symbol}`).join(", ")}function xe(e,t,n,o){if(!e||!Array.isArray(e.logs))throw new r("Provide a transaction receipt with a logs array.");for(let i of e.logs){if(!i||typeof i.address!="string"||!$(i.address,{strict:!1})||!Array.isArray(i.topics)||typeof i.data!="string"||i.topics.some(u=>typeof u!="string"||!/^0x[0-9a-fA-F]{64}$/.test(u)))throw new r(`Malformed Hookr ${t} receipt log.`);if(i.address.toLowerCase()===k.toLowerCase()&&i.topics[0]?.toLowerCase()===n.toLowerCase()){if(i.topics.length!==4||!/^0x0{24}/i.test(i.topics[2])||t==="OrderCancelled"&&!/^0x0{24}/i.test(i.topics[3])||!/^0x[0-9a-fA-F]*$/.test(i.data)||i.data.length!==2+o*64)throw new r(`Malformed Hookr ${t} receipt log.`);return{topics:i.topics,data:i.data}}}throw new r(`Could not find Hookr ${t} event in transaction receipt logs.`)}function De(e){if(e.receipt!==void 0){if(!F(e.receipt)||!Array.isArray(e.receipt.logs))throw new r("Provide a transaction receipt with a logs array.");return dt({logs:e.receipt.logs})}if(e.logs!==void 0){if(!Array.isArray(e.logs))throw new r("Provide receipt logs as an array.");return at(e.logs)}}function Le(e){let t=xe(e,"OrderCreated",et,6);try{let n=pe({abi:A,eventName:"OrderCreated",...t,strict:!0});if(ye(we("bool, uint128, uint128, uint128, uint40, address"),[n.args.zeroForOne,n.args.amountIn,n.args.minAmountOut,n.args.bounty,n.args.expiry,n.args.recipient]).toLowerCase()!==t.data.toLowerCase())throw new r("Noncanonical Hookr OrderCreated event data.");return{orderId:n.args.orderId.toString(),owner:l(n.args.owner),poolId:n.args.poolId,zeroForOne:n.args.zeroForOne,amountIn:n.args.amountIn.toString(),minAmountOut:n.args.minAmountOut.toString(),bounty:n.args.bounty.toString(),expiry:n.args.expiry.toString(),recipient:l(n.args.recipient)}}catch{throw new r("Malformed Hookr OrderCreated receipt log.")}}function at(e){return Le({logs:e}).orderId}function dt(e){return Le(e).orderId}function Pt(e){let t=xe(e,"OrderCancelled",tt,2);try{let n=pe({abi:A,eventName:"OrderCancelled",...t,strict:!0});return{orderId:n.args.orderId.toString(),owner:l(n.args.owner),to:l(n.args.to),amountIn:n.args.amountIn.toString(),bounty:n.args.bounty.toString()}}catch{throw new r("Malformed Hookr OrderCancelled receipt log.")}}async function Rt(e){let t=e.clientFor(S),[n,o,i,u]=await Promise.all([t.readContract({address:k,abi:A,functionName:"router"}),t.readContract({address:k,abi:A,functionName:"registry"}),t.readContract({address:k,abi:A,functionName:"poolManager"}),t.readContract({address:k,abi:A,functionName:"lastOrderId"})]).catch(()=>{throw new r("Could not read Hookr deployment details.")}),s=l(n),a=l(o),c=l(i);return{address:k,chainId:S,router:s,registry:a,poolManager:c,lastOrderId:u.toString(),live:s.toLowerCase()===ke.toLowerCase()&&a.toLowerCase()===Me.toLowerCase()&&c.toLowerCase()===Oe.toLowerCase()}}function Pe(e){if(Array.isArray(e)){let[n,o,i,u,s,a,c,g,f,w,b]=e;return{key:Array.isArray(n)?{currency0:n[0],currency1:n[1],fee:Number(n[2]),tickSpacing:Number(n[3]),hooks:n[4]}:n,owner:o,createdAt:i,expiry:u,zeroForOne:s,status:a,recipient:c,amountIn:BigInt(g),minAmountOut:BigInt(f),bounty:BigInt(w),sqrtPriceLimitX96:BigInt(b)}}let t=e;return{key:{currency0:t.key.currency0,currency1:t.key.currency1,fee:Number(t.key.fee),tickSpacing:Number(t.key.tickSpacing),hooks:t.key.hooks},owner:t.owner,createdAt:t.createdAt,expiry:t.expiry,zeroForOne:!!t.zeroForOne,status:Number(t.status),recipient:t.recipient,amountIn:BigInt(t.amountIn),minAmountOut:BigInt(t.minAmountOut),bounty:BigInt(t.bounty),sqrtPriceLimitX96:BigInt(t.sqrtPriceLimitX96)}}async function Re(e,t,n){let o=R(t,"orderId");if(o<=0n)throw new r("Order ID must be a positive integer.");let i=e.clientFor(S),u=n?.order??await i.readContract({address:k,abi:A,functionName:"getOrder",args:[o]}).catch(()=>{throw new r(`Could not read Hookr order #${o}. Order coverage is incomplete.`)}),s=Pe(u),a=Number(s.status);if(s.owner.toLowerCase()===L.toLowerCase()||a===ee)throw new r(`Hookr order #${o} does not exist.`);let c={currency0:l(s.key.currency0),currency1:l(s.key.currency1),fee:Number(s.key.fee),tickSpacing:Number(s.key.tickSpacing),hooks:l(s.key.hooks)},g=s.zeroForOne?c.currency0:c.currency1,f=s.zeroForOne?c.currency1:c.currency0,w=m=>{let h=m.toLowerCase(),O=n?.tokens.get(h);if(O)return O;let x=J(m,S,i);return n?.tokens.set(h,x),x},[b,p]=await Promise.all([w(g),w(f)]),y=!1,d=0n;if(a===M)try{let m=await i.readContract({address:k,abi:A,functionName:"quoteFill",args:[o]});if(typeof m[0]!="boolean"||typeof m[1]!="bigint"||m[1]<0n)throw new r(`Invalid quote for Hookr order #${o}.`);y=m[0],d=m[1]}catch{throw new r(`Could not quote Hookr order #${o}. Fillability and output amount are unknown.`)}return{orderId:o.toString(),poolId:he(c),key:c,owner:l(s.owner),recipient:l(s.recipient),createdAt:BigInt(s.createdAt).toString(),expiry:BigInt(s.expiry).toString(),zeroForOne:s.zeroForOne,status:a,statusLabel:nt(a),amountIn:s.amountIn.toString(),minAmountOut:s.minAmountOut.toString(),bounty:s.bounty.toString(),sqrtPriceLimitX96:s.sqrtPriceLimitX96.toString(),tokenIn:b,tokenOut:p,fillable:y,quotedAmountOut:d.toString()}}function ct(e){return{name:"hookr_create",inputSchema:{type:"object",properties:{key:{type:"object",properties:{currency0:{type:"string"},currency1:{type:"string"},fee:{type:"number"},tickSpacing:{type:"number"},hooks:{type:"string"}}},tokenIn:{type:"string",description:"Input token address on chain 4663."},tokenOut:{type:"string",description:"Output token address on chain 4663."},zeroForOne:{type:"boolean",description:"True when selling currency0 for currency1."},amountIn:{type:"string",description:"Input amount in base units (uint128)."},minAmountOut:{type:"string",description:"Minimum net output amount in base units (uint128)."},tick:{type:"number",description:"Optional limit tick in [-887272, 887272]."},expiry:{type:"string",description:"Order expiry unix timestamp in seconds (uint40)."},deadline:{type:"string",description:"Alias for expiry unix timestamp in seconds."},bounty:{type:"string",description:"Keeper bounty in native ETH wei (uint128)."},recipient:{type:"string",description:"Order output recipient address (must be the signing wallet)."},sqrtPriceLimitX96:{type:"string",description:"Optional sqrtPriceLimitX96 (defaults to 0)."},chainId:{type:"number",description:"Must be 4663 (Robinhood Chain)."}},required:["amountIn"]},async execute(t,n){N(n);let o=l(n),i=Ae(t.chainId),u=e.clientFor(i),s=De(t),{key:a,zeroForOne:c}=ot(t),g=c?a.currency0:a.currency1,f=c?a.currency1:a.currency0,[w,b]=await Promise.all([J(g,i,u,t.tokenInMeta),J(f,i,u,t.tokenOutMeta)]),p=t.recipient??o;if(typeof p!="string"||!$(p,{strict:!1}))throw new r("Provide a valid recipient address for the Hookr limit order.");let y=l(p);if(Se(y,a.hooks),y!==o)throw new r("Hookr recipient must be the signing wallet.");if(typeof t.amountIn!="string")throw new r("Provide amountIn as an integer string in base units.");let d=H(t.amountIn);if(d<=0n||d>Ve)throw new r("amountIn must be between 1 and int128.max base units.");if(t.tick!==void 0){let P=Number(t.tick);Y(P)}let m;if(t.minAmountOut!==void 0){if(typeof t.minAmountOut!="string")throw new r("Provide minAmountOut as an integer string in base units.");m=H(t.minAmountOut)}else if(t.tick!==void 0)m=it(d,Number(t.tick),c);else throw new r("Provide minAmountOut in base units (or tick to derive minAmountOut).");if(m<=0n||m>me)throw new r("minAmountOut must be between 1 and uint128.max base units.");let h=t.sqrtPriceLimitX96!==void 0?R(t.sqrtPriceLimitX96,"sqrtPriceLimitX96"):0n;if(h>We)throw new r("sqrtPriceLimitX96 exceeds uint160 bounds.");let O=await st(u,t.now),x=t.expiry??t.deadline,I;if(x!==void 0)I=R(x,"expiry");else if(t.lifetime!==void 0||t.ttlSeconds!==void 0){let P=R(t.lifetime??t.ttlSeconds,"lifetime");I=O+P}else I=O+Ue;if(I<O+ce)throw new r(`Order expiry (${I}) is expired or below the minimum lifetime of ${ce} seconds from block timestamp ${O}.`);if(I>O+ue||I>Ge)throw new r(`Order expiry (${I}) exceeds the maximum lifetime of ${ue} seconds (365 days).`);let z=await u.readContract({address:k,abi:A,functionName:"bountyBounds",args:[a,c,d,m]}).catch(()=>{throw new r("Could not read Hookr bounty bounds.")}),_=BigInt(z[0]),q=BigInt(z[1]),X=BigInt(z[2]);if(t.bounty!==void 0&&typeof t.bounty!="string")throw new r("Provide bounty as an integer string in base units.");let C=t.bounty!==void 0?H(t.bounty):q,K=_>0n?_:q;if(C<_||K>0n&&C<K)throw new r(`Order keeper bounty (${C} wei) is underbounty: must be at least ${K} wei (default keeper bounty floor).`);if(C>X||C>me)throw new r(`Order keeper bounty (${C} wei) exceeds the maximum allowed bounty of ${X} wei.`);let te=g.toLowerCase()===L.toLowerCase(),v=[];if(!te){let P;try{let U=await u.readContract({address:g,abi:Z,functionName:"allowance",args:[o,k]});if(typeof U!="bigint"||U<0n)throw new r("Invalid token allowance.");P=U}catch{throw new r(`Could not read token allowance for ${g}. No approval was prepared.`)}P<d&&v.push(e.approval(g,k,d.toString(),i))}let He=te?d+C:C,Te=ge({abi:A,functionName:"createOrder",args:[{key:a,zeroForOne:c,amountIn:d,minAmountOut:m,sqrtPriceLimitX96:h,recipient:y,expiry:Number(I),bounty:C}]}),ne=e.formatAmount(d.toString(),w.decimals),re=e.formatAmount(m.toString(),b.decimals),oe=e.formatAmount(C.toString(),18),$e=e.unsignedTx({to:k,data:Te,value:He.toString(),chainId:i,description:`Create Hookr limit order on ${k}: sell ${ne} ${w.symbol} (${w.address}) for at least ${re} ${b.symbol} (${b.address}) with ${oe} ETH keeper bounty (fee=${a.fee}, tickSpacing=${a.tickSpacing}, expiry=${I}).`});v.push($e);let ie=await e.preview(v,o),Ee=Ce(ie,e),_e=he(a);return{txs:v,summary:`Hookr limit order prepared: sell ${ne} ${w.symbol} for at least ${re} ${b.symbol} (bounty ${oe} ETH, expiry ${I}; preview deltas: ${Ee}).`,preview:ie,poolId:_e,key:a,zeroForOne:c,amountIn:d.toString(),minAmountOut:m.toString(),bounty:C.toString(),bountyBounds:{minBounty:_.toString(),defaultBounty:q.toString(),maxBounty:X.toString()},expiry:I.toString(),recipient:y,sqrtPriceLimitX96:h.toString(),tokenIn:w,tokenOut:b,...s!==void 0?{orderId:s}:{}}}}}function ut(e){return{name:"hookr_cancel",inputSchema:{type:"object",properties:{orderId:{type:"string",description:"Hookr order ID to cancel (uint256 decimal string)."},to:{type:"string",description:"Recipient address for the refunded principal and bounty (must be the signing wallet)."},chainId:{type:"number",description:"Must be 4663 (Robinhood Chain)."}},required:["orderId"]},async execute(t,n){N(n);let o=l(n),i=Ae(t.chainId),u=De(t),s=t.orderId??t.id??u;if(s===void 0)throw new r("Provide orderId to cancel a Hookr limit order.");let a=R(s,"orderId");if(a<=0n)throw new r("orderId must be a positive integer.");let c=await Re(e,a);if(c.owner.toLowerCase()!==o.toLowerCase())throw new r(`Unauthorized cancellation: only the order owner (${c.owner}) can cancel Hookr order #${a} (caller is ${o}).`);if(c.status!==M)throw new r(`Hookr order #${a} is not open (current status: ${c.statusLabel}).`);let g=t.to??o;if(typeof g!="string"||!$(g,{strict:!1}))throw new r("Provide a valid refund recipient address for cancel.");let f=l(g);if(Se(f,c.key.hooks),f!==o)throw new r("Hookr refund recipient must be the signing wallet.");let w=ge({abi:A,functionName:"cancel",args:[a,f]}),b=e.formatAmount(c.amountIn,c.tokenIn.decimals),p=e.formatAmount(c.bounty,18),y=e.unsignedTx({to:k,data:w,value:"0",chainId:i,description:`Cancel Hookr limit order #${a} on ${k} and refund ${b} ${c.tokenIn.symbol} plus ${p} ETH bounty to ${f}.`}),d=await e.preview([y],o),m=Ce(d,e);return{txs:[y],summary:`Cancel Hookr limit order #${a}: refund ${b} ${c.tokenIn.symbol} and ${p} ETH bounty to ${f} (preview deltas: ${m}).`,preview:d,orderId:a.toString(),to:f,refundedAmountIn:c.amountIn,refundedBounty:c.bounty,tokenIn:c.tokenIn,tokenOut:c.tokenOut}}}}function lt(e){let t=performance.now()+je;return new Proxy(e,{get(n,o,i){return o!=="readContract"?Reflect.get(n,o,i):async(...u)=>{let s=t-performance.now(),a=()=>new r("Hookr scan deadline exceeded. Order coverage is incomplete; retry later.");if(s<=0)throw a();let c;try{return await Promise.race([n.readContract(...u),new Promise((g,f)=>{c=setTimeout(()=>f(a()),s)})])}finally{c!==void 0&&clearTimeout(c)}}}})}function mt(e){return async t=>{N(t);let n=l(t),o=lt(e.clientFor(S)),i={...e,clientFor:()=>o},u=await o.readContract({address:k,abi:A,functionName:"lastOrderId"}).catch(()=>{throw new r("Could not read the last Hookr order ID. Order coverage is incomplete.")});if(typeof u!="bigint"||u<0n)throw new r("Could not read a valid last Hookr order ID. Order coverage is incomplete.");let s=u,a=s>le?s-le+1n:1n;if(s<=0n)return[];let c=[],g=new Map;for(let f=a;f<=s;f+=Q){let w=Array.from({length:Number(s-f+1n<Q?s-f+1n:Q)},(p,y)=>f+BigInt(y)),b=await Promise.all(w.map(async p=>{let y=await o.readContract({address:k,abi:A,functionName:"getOrder",args:[p]}).catch(()=>{throw new r(`Could not read Hookr order #${p}. Order coverage is incomplete.`)}),d=Pe(y);if(d.owner.toLowerCase()===L||Number(d.status)===ee)throw new r(`Hookr order #${p} does not exist. Order coverage is incomplete.`);return{id:p,order:d}}));for(let{id:p,order:y}of b){if(y.owner.toLowerCase()!==n.toLowerCase()||Number(y.status)!==M)continue;let d=await Re(i,p,{order:y,tokens:g}),m=[{token:d.tokenIn,amount:d.amountIn}];BigInt(d.bounty)>0n&&m.push({token:{address:B,symbol:"ETH",decimals:18,chainId:S},amount:d.bounty});let h=e.formatAmount(d.amountIn,d.tokenIn.decimals),O=e.formatAmount(d.minAmountOut,d.tokenOut.decimals),x=e.formatAmount(d.bounty,18),I=e.formatAmount(d.quotedAmountOut,d.tokenOut.decimals);c.push({module:"hookr",id:d.orderId,chainId:S,assets:m,description:`Hookr open limit order #${d.orderId}: sell ${h} ${d.tokenIn.symbol} (${d.tokenIn.address}) for at least ${O} ${d.tokenOut.symbol} (${d.tokenOut.address}), bounty ${x} ETH, expiry ${d.expiry}, fillable=${d.fillable} (quoted output ${I} ${d.tokenOut.symbol}).`})}}return a>1n&&c.push({module:"hookr",id:"coverage",chainId:S,assets:[],description:`Hookr order coverage is incomplete: scanned IDs ${a}-${s}. Older orders require an explicit order ID.`}),c}}function Ht(e){return ve({abi:A,data:e})}var E=e=>{let t=[ct(e),ut(e)],n=mt(e);return{tools:t,positions:n}},Tt=E,$t=E,Et=E,_t=e=>{let t=E(e);return{name:"hookr",tools:t.tools,...t.positions?{positions:t.positions}:{}}},vt=E;export{k as a,Fe as b,ke as c,At as d,Me as e,ze as f,Oe as g,ht as h,qe as i,Xe as j,Ke as k,ce as l,Ue as m,ue as n,St as o,Ct as p,xt as q,Dt as r,le as s,je as t,ee as u,M as v,Ze as w,Je as x,et as y,tt as z,A,rt as B,Lt as C,he as D,Le as E,at as F,dt as G,Pt as H,Rt as I,Re as J,ct as K,ut as L,mt as M,Ht as N,E as O,Tt as P,$t as Q,Et as R,_t as S,vt as T};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as A}from"./5HCXZWUH.js";import{g as y}from"./
|
|
1
|
+
import{c as A}from"./5HCXZWUH.js";import{g as y}from"./R5CBH2CR.js";import{a as b}from"./Z3FZWNAJ.js";import{erc20Abi as F,getAddress as $}from"viem";var P=new WeakMap,E=3e3,k=new WeakMap;async function q(C,h,u,m,c){u=$(u);let n=A(C),e=P.get(n);e||(e=new Map,P.set(n,e));let i=`${h}:${u.toLowerCase()}:${m}:${c??"latest"}`,t=e.get(i);if(t&&(e.delete(i),e.set(i,t)),!t){for(t=new Promise((s,T)=>{let a=k.get(n);a||(a=new Map,k.set(n,a));let f=`${h}:${c??"latest"}`,l=a.get(f);if(!l){l=[],a.set(f,l);let d=l;queueMicrotask(async()=>{a.delete(f);let w=d.map(r=>({address:r.address,abi:F,functionName:r.field}));try{if(d.length>1&&n.chain?.contracts?.multicall3&&typeof n.multicall=="function"){let r=await y(()=>n.multicall({contracts:w,blockNumber:c,allowFailure:!0}));d.forEach((o,p)=>{let g=r[p];g?.status==="success"?o.resolve(g.result):o.reject(g?.error??new b("Token metadata could not be read."))})}else await Promise.all(d.map(async(r,o)=>{try{r.resolve(await y(()=>n.readContract({...w[o],blockNumber:c})))}catch(p){r.reject(p)}}))}catch(r){d.forEach(o=>o.reject(r))}})}l.push({address:u,field:m,resolve:s,reject:T})}).then(s=>{if(m==="decimals"?!Number.isInteger(s)||Number(s)<0||Number(s)>255:typeof s!="string"||!s.trim())throw new b("The contract returned invalid token metadata.");return s});e.size>=E;)e.delete(e.keys().next().value);e.set(i,t);let M=t;t.catch(()=>{e.get(i)===M&&e.delete(i)})}try{return await t}finally{c!==void 0&&e.get(i)===t&&e.delete(i)}}export{q as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as ae,o as F}from"./VBV366XQ.js";import{a as h,i as re,j as K}from"./25EOXUBI.js";import{a as O}from"./T5E4OJEU.js";import{randomBytes as ue,randomUUID as le}from"node:crypto";import{isDeepStrictEqual as se}from"node:util";import{decodeFunctionData as oe,encodeAbiParameters as Z,erc20Abi as J,getAddress as pe,isAddress as me,keccak256 as ee,parseAbi as te,parseAbiParameters as ne,toEventSelector as fe,zeroAddress as U}from"viem";var ie=re[h].meridian,L=ie.PredictionMarketEscrow.address,H=ie.SecondaryMarketEscrow.address,C={address:ie.CollateralToken_USDe.address,chainId:h,symbol:"USDe",decimals:18},ye="wss://relayer.predict.meridian.xyz/auction",ge=ne("(address conditionResolver,bytes conditionId,uint8 predictedOutcome)[]"),he=ne("bytes32,uint256,uint256,address,address,address,bytes"),be=ne("address,address,address,address,uint256,uint256"),j=te(["function getNonce(address) view returns (uint256)","function isNonceUsed(address,uint256) view returns (bool)"]),we=te(["function mint(((address conditionResolver,bytes conditionId,uint8 predictedOutcome)[] picks,uint256 predictorCollateral,uint256 counterpartyCollateral,address predictor,address counterparty,uint256 predictorNonce,uint256 counterpartyNonce,uint256 predictorDeadline,uint256 counterpartyDeadline,bytes predictorSignature,bytes counterpartySignature,bytes32 refCode,bytes predictorSessionKeyData,bytes counterpartySessionKeyData,address predictorSponsor,bytes predictorSponsorData) request)"]),ke=te(["function executeTrade((address token,address collateral,address seller,address buyer,uint256 tokenAmount,uint256 price,uint256 sellerNonce,uint256 buyerNonce,uint256 sellerDeadline,uint256 buyerDeadline,bytes sellerSignature,bytes buyerSignature,bytes32 refCode,bytes sellerSessionKeyData,bytes buyerSessionKeyData) request)"]),Ie=fe("Transfer(address,address,uint256)"),Be=[{name:"predictionHash",type:"bytes32"},{name:"signer",type:"address"},{name:"collateral",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}],Se=[{name:"tradeHash",type:"bytes32"},{name:"signer",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}];function i(e){throw new O(e)}function R(e){return(!e||typeof e!="object"||Array.isArray(e))&&i("Meridian returned an invalid exchange object."),e}function S(e,n,d=!1){return d&&typeof e=="number"&&Number.isSafeInteger(e)&&e>=0&&(e=String(e)),(typeof e!="string"||!/^\d+$/.test(e)||BigInt(e)>=1n<<256n)&&i(`Provide ${n} as a decimal base-unit integer string.`),e}function x(e){return(typeof e!="string"||!me(e,{strict:!1})||e.toLowerCase()===U)&&i("Provide a nonzero token, resolver or wallet address."),pe(e)}function V(e,n){return(typeof e!="string"||!/^0x(?:[0-9a-fA-F]{2})+$/.test(e)||n!==void 0&&e.length!==2+n*2)&&i("Meridian returned invalid hexadecimal data."),e}function q(e){return(typeof e!="string"||e.length===0||e.length>256)&&i("Meridian returned an invalid exchange identifier."),e}function k(e,n){return e?.toLowerCase()===n.toLowerCase()}function G(){return BigInt(Math.floor(Date.now()/1e3))}function Me(e,n){let d=e==="buy"?["picks","stake","minCounterpartyCollateral","usdgAmountIn","slippageBps","continuation","signature"]:["token","amount","minPrice","slippageBps","continuation","signature"];Object.keys(n).some(I=>!d.includes(I))&&i("Unsupported Meridian arguments; use the tool input schema."),n.slippageBps!==void 0&&(typeof n.slippageBps!="number"||!Number.isInteger(n.slippageBps)||n.slippageBps<0||n.slippageBps>=1e4)&&i("Slippage must be an integer from 0 to 9999 basis points.");let c=n.slippageBps;if(e==="sell"){let I=S(n.amount,"the position amount");BigInt(I)===0n&&i("The position amount must be positive.");let b=x(n.token);(k(b,C.address)||k(b,K))&&i("Choose a Meridian position token to sell.");let $;if(n.minPrice!==void 0){let A=S(n.minPrice,"the minimum sale price");BigInt(A)<=1n&&i("The minimum sale price must be greater than 1 base unit."),$=c===void 0?A:F(A,c),BigInt($)<=1n&&i("The minimum sale price after slippage must be greater than 1 base unit.")}else{let A=BigInt(I)/100n>10n**18n?BigInt(I)/100n:10n**18n;$=c===void 0?A.toString():F(A.toString(),c)}return{side:e,token:b,amount:I,minPrice:$,...c===void 0?{}:{slippageBps:c}}}(!Array.isArray(n.picks)||n.picks.length<1||n.picks.length>10)&&i("Provide between one and ten Meridian picks.");let f=n.picks.map(I=>{let b=R(I);return(Object.keys(b).some($=>!["conditionResolver","conditionId","predictedOutcome"].includes($))||b.predictedOutcome!==0&&b.predictedOutcome!==1)&&i("Each pick needs a resolver, condition ID and outcome 0 or 1."),{conditionResolver:x(b.conditionResolver),conditionId:V(b.conditionId),predictedOutcome:b.predictedOutcome}}).sort((I,b)=>{let $=`${I.conditionResolver.toLowerCase()}:${I.conditionId.toLowerCase()}:${I.predictedOutcome}`,A=`${b.conditionResolver.toLowerCase()}:${b.conditionId.toLowerCase()}:${b.predictedOutcome}`;return $<A?-1:$>A?1:0}),m=f.map(I=>`${I.conditionResolver.toLowerCase()}:${I.conditionId.toLowerCase()}`);new Set(m).size!==f.length&&i("Do not repeat a condition in the same prediction.");let B=S(n.stake,"the USDe stake");BigInt(B)<10n**18n&&i("Meridian requires a stake of at least 1 USDe.");let M=n.usdgAmountIn===void 0?void 0:S(n.usdgAmountIn,"the USDG swap amount");M!==void 0&&BigInt(M)===0n&&i("The USDG swap amount must be positive.");let _=n.minCounterpartyCollateral!==void 0?S(n.minCounterpartyCollateral,"the minimum counterparty collateral"):F(B,c??ae);return BigInt(_)<=1n&&i("The minimum counterparty collateral must be greater than 1 base unit."),{side:e,picks:f,stake:B,minCounterpartyCollateral:_,...M===void 0?{}:{usdgAmountIn:M},...c===void 0?{}:{slippageBps:c}}}var X=class{constructor(n,d){this.id=n;this.prefix=d;this.socket=new globalThis.WebSocket(ye),this.socket.addEventListener("open",()=>{this.opened=!0,this.notify?.()}),this.socket.addEventListener("close",()=>this.stop("Meridian exchange socket was lost. Start a fresh auction.")),this.socket.addEventListener("error",()=>this.stop("Meridian exchange socket failed. Start a fresh auction.")),this.socket.addEventListener("message",c=>{try{(typeof c.data!="string"||c.data.length>65536)&&i("Meridian returned a malformed exchange message.");let f=R(JSON.parse(c.data));if(f.type==="pong")return;let m=q(f.type),B=R(f.payload);if((m==="error"||m===`${d}.error`||m===`${d}.rejected`||m===`${d}.failed`||m===`${d}.expired`)&&i("Meridian rejected or failed the exchange. Start a fresh auction."),m===`${d}.ack`){(B.id!==n||this.auctionId!==void 0)&&i("Meridian acknowledged a different exchange."),this.auctionId=q(B.auctionId);return}if((!m.startsWith(`${d}.`)||B.auctionId!==this.auctionId||!this.auctionId)&&i("Meridian returned a message for a different exchange."),(m===`${d}.pending`||m===`${d}.filled`)&&!this.accepting&&i("Meridian returned settlement before acceptance."),m===`${d}.pending`)return;this.queue.length>=16&&i("Meridian returned too many exchange messages."),this.queue.push({type:m,payload:B}),this.notify?.()}catch{this.stop("Meridian rejected or returned an invalid exchange message. Start a fresh auction.")}})}id;prefix;socket;queue=[];notify;error;auctionId;accepting=!1;opened=!1;check(){if(this.error)throw this.error;this.socket.readyState>1&&i("Meridian exchange socket was lost. Start a fresh auction.")}stop(n){this.error??=new O(n),this.notify?.(),this.socket.readyState<2&&this.socket.close()}async wait(n,d=3e4){return new Promise((c,f)=>{let m=setTimeout(()=>this.stop("Meridian exchange timed out. Start a fresh auction."),d),B=()=>{try{if(this.check(),n===void 0?!this.opened:!this.queue.length)return;let M=n===void 0?void 0:this.queue.shift();M&&M.type!==`${this.prefix}.${n}`&&i("Meridian returned an unexpected exchange stage."),clearTimeout(m),this.notify=void 0,c(M?.payload??{})}catch(M){clearTimeout(m),this.notify=void 0,f(M)}};this.notify=B,B()})}send(n,d){this.check(),this.socket.readyState!==1&&i("Meridian exchange socket is not open."),n==="accept"&&(this.accepting=!0),this.socket.send(JSON.stringify({...n==="start"?{id:this.id}:{},type:`${this.prefix}.${n}`,payload:d}))}};function Y(e){return ee(Z(ge,[e]))}function $e(e,n,d){return ee(Z(he,[Y(e.picks),BigInt(e.stake),BigInt(d.counterpartyCollateral),n,d.counterparty,U,"0x"]))}function Ae(e,n,d,c){return ee(Z(be,[e.token,C.address,n,d,BigInt(e.amount),BigInt(c)]))}function Q(e,n){let{input:d,wallet:c,nonce:f,deadline:m}=e,B={name:d.side==="buy"?"PredictionMarketEscrow":"SecondaryMarketEscrow",version:"1",chainId:h,verifyingContract:e.continuation.escrowContract};return(!f||!m)&&i("Meridian exchange is missing its signing terms."),d.side==="buy"?(n||i("Meridian has not returned a winning bid."),{domain:B,primaryType:"MintApproval",types:{MintApproval:Be},message:{predictionHash:$e(d,c,n),signer:c,collateral:d.stake,nonce:f,deadline:m}}):{domain:B,primaryType:"TradeApproval",types:{TradeApproval:Se},message:{tradeHash:Ae(d,c,n?n.buyer:U,n?n.price:"0"),signer:c,nonce:f,deadline:m}}}function de(e){let n=[BigInt(e.deadline)],d=e.continuation;if(d.stage==="primary_accept"||d.stage==="secondary_accept"){n.push(BigInt(d.acceptDeadline));let c=d.winningBid;d.stage==="primary_accept"&&n.push(BigInt(c.counterpartyDeadline)),c.buyerDeadline!==void 0&&n.push(BigInt(S(c.buyerDeadline,"the buyer deadline",!0)))}return n.reduce((c,f)=>c<f?c:f)}function z(e){e.channel?.check(),e.deadline&&G()>=de(e)&&i("Meridian exchange expired. Start a fresh auction.")}var Ee=e=>{let n=new Map;function d(t){clearTimeout(t.timer),n.delete(t.continuation.requestId),t.channel?.stop("Meridian exchange is closed or expired. Start a fresh auction.")}function c(t,a){clearTimeout(t.timer),t.timer=setTimeout(()=>d(t),a),t.timer.unref?.()}function f(t){let{wallet:a,chainId:s,escrowContract:p,requestId:u}=t.continuation;return{wallet:a,chainId:s,escrowContract:p,requestId:u}}async function m(t){let{input:a,wallet:s}=t,p=e.clientFor(h),u=a.side==="buy"?C.address:a.token,r=a.side==="buy"?a.stake:a.amount,[y,w]=await Promise.all([p.readContract({address:u,abi:J,functionName:"balanceOf",args:[s]}),p.readContract({address:u,abi:J,functionName:"allowance",args:[s,t.continuation.escrowContract]})]);if(a.side==="sell"&&await p.readContract({address:u,abi:J,functionName:"decimals"})!==18&&i("Meridian position tokens must have 18 decimals."),y>=BigInt(r)&&w>=BigInt(r))return;(t.continuation.stage==="primary_accept"||t.continuation.stage==="secondary_accept")&&i("Meridian prerequisites changed during the auction. Start a fresh auction after funding and approval.");let l,D;if(y<BigInt(r)){a.side==="sell"&&i("The wallet does not have enough position tokens to sell."),a.usdgAmountIn||i("Not enough USDe. Provide usdgAmountIn in USDG base units to quote a swap before the auction.");let g=await e.quoteSwap({from:K,to:C.address,amountIn:a.usdgAmountIn,...a.slippageBps===void 0?{}:{slippageBps:a.slippageBps}},s);(G()>=BigInt(S(g.expiresAt,"the swap expiry"))||BigInt(S(g.minAmountOut,"the swap minimum"))+y<BigInt(r))&&i("The USDG swap minimum does not cover the USDe stake, or the quote expired. Request a fresh quote with sufficient input.");let o=await e.buildSwap(g.quoteId,s);(!("txs"in o)||!o.txs.length)&&i("The swap coordinator did not return prerequisite transactions."),l=o.txs,D=`${o.summary} Minimum USDe output: ${g.minAmountOut} base units (18 decimals).`}else l=[e.approval(u,t.continuation.escrowContract,r,h)],D=`Approve exactly ${r} base units (18 decimals) of ${u} for ${t.continuation.escrowContract} on chain ${h}.`;l.some(g=>g.chainId!==h)&&i("Meridian prerequisite transactions must use chain 4663.");let v=await e.preview(l,s),T=v.changes.map(g=>{let o=g.amount.startsWith("-");return`${o?"-":"+"}${e.formatAmount(o?g.amount.slice(1):g.amount,g.token.decimals)} ${g.token.symbol} (${g.token.address}, chain ${g.token.chainId}, ${g.token.decimals} decimals)`}).join("; ");return t.channel?.stop("Meridian prerequisites must be mined before the auction."),t.channel=void 0,t.deadline=void 0,t.nonce=void 0,t.continuation={...f(t),stage:"prerequisites"},{steps:l.map(g=>({kind:"tx",tx:g})),continuation:structuredClone(t.continuation),summary:`${D} ${v.summary} ${T}. Mine these prerequisites before continuing; no RFQ has started.`}}function B(t){let a=t.continuation;a.stage==="prerequisites"&&i("Meridian prerequisites need to finish before signing."),z(t),c(t,Number(de(t)-G())*1e3);let s=t.input,p=s.side==="buy"?`Stake ${s.stake} base units of USDe (${C.address}, 18 decimals)`:`Sell ${s.amount} base units of position ${s.token} (18 decimals)`,u=a.stage==="secondary_start"?"Initial buyer-zero, price-zero intent only.":a.stage==="primary_accept"?`Counterparty ${a.winningBid.counterparty}; counterparty collateral ${a.winningBid.counterpartyCollateral} USDe base units; counterparty deadline ${a.winningBid.counterpartyDeadline}.`:`Buyer ${a.winningBid.buyer}; receive ${a.winningBid.price} USDe base units (${C.address}, 18 decimals).`;return{steps:[{kind:"typedData",request:structuredClone(a.request)}],continuation:structuredClone(a),summary:`${p} on chain ${h}. Approval was checked on chain. ${u} Sign locally for domain ${a.request.domain.name}, version 1, escrow ${a.escrowContract}, signature deadline ${t.deadline}${"acceptDeadline"in a?`, acceptance deadline ${a.acceptDeadline}`:""}. External relayer settlement is pending; a signature is not a fill.`}}async function M(t){let a=await t.channel.wait("result"),s=R(a.winningBid),p=q(a.auctionId);s.auctionId!==p&&i("Meridian winning bid belongs to another auction.");let u=S(a.acceptDeadline,"the acceptance deadline",!0);if(t.input.side==="buy"){let r={auctionId:p,counterparty:q(s.counterparty),counterpartyCollateral:S(s.counterpartyCollateral,"the counterparty collateral"),counterpartyNonce:S(s.counterpartyNonce,"the counterparty nonce",!0),counterpartyDeadline:S(s.counterpartyDeadline,"the counterparty deadline",!0),receivedAt:q(s.receivedAt)};x(r.counterparty),(!Number.isFinite(Date.parse(r.receivedAt))||BigInt(r.counterpartyCollateral)<=1n||BigInt(r.counterpartyCollateral)<BigInt(t.input.minCounterpartyCollateral))&&i("Meridian winning bid counterparty collateral is below the caller minimum."),t.continuation={...f(t),stage:"primary_accept",auctionId:p,winningBid:r,acceptDeadline:u,request:Q(t,r)}}else{let r={auctionId:p,buyer:q(s.buyer),price:S(s.price,"the sale price"),...s.buyerDeadline!==void 0?{buyerDeadline:S(s.buyerDeadline,"the buyer deadline",!0)}:{},...s.buyerNonce!==void 0?{buyerNonce:S(s.buyerNonce,"the buyer nonce",!0)}:{},...s.receivedAt!==void 0?{receivedAt:q(s.receivedAt)}:{}};x(r.buyer),(BigInt(r.price)<=1n||BigInt(r.price)<BigInt(t.input.minPrice))&&i("Meridian winning bid sale price is below the caller minimum."),t.continuation={...f(t),stage:"secondary_accept",auctionId:p,winningBid:r,acceptDeadline:u,request:Q(t,r)}}return B(t)}async function _(t,a){let s=t.continuation;s.stage!=="primary_accept"&&s.stage!=="secondary_accept"&&i("Meridian exchange is not ready for acceptance."),z(t),t.channel.send("accept",{auctionId:s.auctionId,[t.input.side==="buy"?"predictorSignature":"sellerSignature"]:a}),c(t,15e4);let p=await t.channel.wait("filled",12e4),u=V(p.transactionHash,32),r=e.clientFor(h),[y,w]=await Promise.all([r.waitForTransactionReceipt({hash:u,timeout:12e4}),r.getTransaction({hash:u})]);(y.status!=="success"||!k(y.transactionHash,u)||!k(w.hash,u)||!k(y.to,s.escrowContract)||!k(w.to,s.escrowContract)||w.chainId!==h)&&i("Meridian fill has no matching successful receipt on chain 4663.");let{input:l,wallet:D}=t;if(l.side==="buy"&&s.stage==="primary_accept"){let o=oe({abi:we,data:w.input}).args[0];(!k(Y([...o.picks]),Y(l.picks))||o.predictorCollateral!==BigInt(l.stake)||o.counterpartyCollateral!==BigInt(s.winningBid.counterpartyCollateral)||!k(o.predictor,D)||!k(o.counterparty,s.winningBid.counterparty)||o.predictorNonce!==BigInt(t.nonce)||o.counterpartyNonce!==BigInt(s.winningBid.counterpartyNonce)||o.predictorDeadline!==BigInt(t.deadline)||o.counterpartyDeadline!==BigInt(s.winningBid.counterpartyDeadline)||!k(o.predictorSponsor,U)||o.predictorSponsorData!=="0x"||o.predictorSignature!==a)&&i("Meridian mint receipt does not match the accepted prediction.")}else if(l.side==="sell"&&s.stage==="secondary_accept"){let o=oe({abi:ke,data:w.input}).args[0];(!k(o.token,l.token)||!k(o.collateral,C.address)||!k(o.seller,D)||!k(o.buyer,s.winningBid.buyer)||o.tokenAmount!==BigInt(l.amount)||o.price!==BigInt(s.winningBid.price)||o.sellerNonce!==BigInt(t.nonce)||o.sellerDeadline!==BigInt(t.deadline)||o.sellerSignature!==a)&&i("Meridian sale receipt does not match the accepted trade.")}let v=new Map,T=new Map;for(let o of y.logs){if(o.topics[0]!==Ie||o.topics.length!==3)continue;(!/^0x[0-9a-fA-F]{64}$/.test(o.data)||!o.topics.slice(1).every(ce=>/^0x0{24}[0-9a-fA-F]{40}$/.test(ce)))&&i("Meridian receipt has malformed transfer logs.");let E=`0x${o.topics[1].slice(-40)}`,N=`0x${o.topics[2].slice(-40)}`,P=o.address.toLowerCase(),W=BigInt(o.data);v.set(P,(v.get(P)??0n)+(k(N,D)?W:0n)-(k(E,D)?W:0n)),k(E,U)&&k(N,D)&&T.set(P,(T.get(P)??0n)+W)}let g;if(l.side==="buy"&&s.stage==="primary_accept"){let o=BigInt(l.stake)+BigInt(s.winningBid.counterpartyCollateral),E=[...T].filter(([N,P])=>!k(N,C.address)&&P===o&&v.get(N)===o);(E.length!==1||v.get(C.address.toLowerCase())!==-BigInt(l.stake))&&i("Meridian mint receipt does not prove the expected collateral and position delta."),g=`${o} base units received in position ${E[0][0]}`}else l.side==="sell"&&s.stage==="secondary_accept"?((v.get(l.token.toLowerCase())!==-BigInt(l.amount)||v.get(C.address.toLowerCase())!==BigInt(s.winningBid.price))&&i("Meridian sale receipt does not prove the expected collateral and position delta."),g=`${l.amount} base units sold from position ${l.token}; ${s.winningBid.price} USDe base units received`):i("Meridian fill has a different exchange stage.");return{txs:[],summary:`Meridian ${l.side} filled by the external relayer: ${u}. Successful receipt and transfer deltas verified on chain ${h}: ${g} (18 decimals); collateral USDe ${C.address} (18 decimals).`}}async function I(t,a,s){let p=x(s),u=Me(t,a),r;if(a.continuation!==void 0){let y=R(a.continuation),w=n.get(q(y.requestId));w||i("Meridian exchange is lost or expired. Start a fresh auction."),(!k(w.wallet,p)||!se(w.input,u)||!se(w.continuation,y))&&i("Meridian continuation or arguments do not match the active wallet exchange."),w.busy&&i("Meridian exchange is already processing this continuation."),r=w}else{a.signature!==void 0&&i("A signature requires an active Meridian continuation."),n.size>=1e3&&i("Too many active Meridian exchanges. Please try again later.");let y=le(),w=setTimeout(()=>{let l=n.get(y);l&&d(l)},9e5);w.unref?.(),r={input:u,wallet:p,continuation:{stage:"prerequisites",wallet:p,chainId:h,escrowContract:t==="buy"?L:H,requestId:y},busy:!1,timer:w},n.set(y,r)}r.busy=!0;try{z(r),await e.clientFor(h).getChainId()!==h&&i("Meridian requires an RPC on chain 4663.");let y=r.continuation.stage;y==="prerequisites"&&a.signature!==void 0&&i("Do not sign before Meridian prerequisites have mined.");let w=await m(r);if(w)return w;if(y==="prerequisites")return r.nonce=t==="buy"?(await e.clientFor(h).readContract({address:L,abi:j,functionName:"getNonce",args:[p]})).toString():BigInt(`0x${ue(16).toString("hex")}`).toString(),r.deadline=(G()+300n).toString(),t==="sell"&&await e.clientFor(h).readContract({address:H,abi:j,functionName:"isNonceUsed",args:[p,BigInt(r.nonce)]})&&i("Meridian seller nonce is already used. Start a fresh auction."),r.channel=new X(r.continuation.requestId,t==="buy"?"auction":"secondary.auction"),await r.channel.wait(),u.side==="buy"?(r.channel.send("start",{id:r.continuation.requestId,picks:u.picks,predictorCollateral:u.stake,predictor:p,predictorNonce:r.nonce,predictorDeadline:r.deadline,chainId:h,escrowContract:L,mode:"blind"}),await M(r)):(r.continuation={...f(r),stage:"secondary_start",request:Q(r)},B(r));let l=V(a.signature);if(t==="sell"&&await e.clientFor(h).readContract({address:H,abi:j,functionName:"isNonceUsed",args:[p,BigInt(r.nonce)]})&&i("Meridian seller nonce is already used. Start a fresh auction."),t==="buy"&&(await e.clientFor(h).readContract({address:L,abi:j,functionName:"getNonce",args:[p]})).toString()!==r.nonce&&i("Meridian predictor nonce changed. Start a fresh auction."),z(r),y==="secondary_start"&&u.side==="sell")return r.channel.send("start",{id:r.continuation.requestId,token:u.token,collateral:C.address,tokenAmount:u.amount,seller:p,sellerNonce:r.nonce,sellerDeadline:r.deadline,chainId:h,escrowContract:H,mode:"blind",sellerSignature:l}),await M(r);let D=await _(r,l);return d(r),D}catch(y){throw d(r),new O(e.plainError(y))}finally{r.busy=!1}}let b={type:"string",pattern:"^\\d+$"},$={type:"string",pattern:"^0x[0-9a-fA-F]{40}$"},A={continuation:{type:"object"},signature:{type:"string",pattern:"^0x([0-9a-fA-F]{2})+$"}};return{tools:[{name:"meridian_buy",inputSchema:{type:"object",additionalProperties:!1,required:["picks","stake"],properties:{...A,stake:{...b,description:"USDe stake in base units, 18 decimals, chain 4663."},minCounterpartyCollateral:{...b,description:"Optional caller minimum counterparty collateral in USDe base units, 18 decimals."},usdgAmountIn:{...b,description:"Optional exact USDG swap input in base units, 6 decimals, if USDe balance is insufficient."},slippageBps:{type:"integer",minimum:0,maximum:9999},picks:{type:"array",minItems:1,maxItems:10,items:{type:"object",additionalProperties:!1,required:["conditionResolver","conditionId","predictedOutcome"],properties:{conditionResolver:$,conditionId:{type:"string",pattern:"^0x([0-9a-fA-F]{2})+$"},predictedOutcome:{type:"integer",enum:[0,1]}}}}}},execute:(t,a)=>I("buy",t,a)},{name:"meridian_sell",inputSchema:{type:"object",additionalProperties:!1,required:["token","amount"],properties:{...A,token:{...$,description:"Position token address on chain 4663."},amount:{...b,description:"Position amount in base units, 18 decimals."},minPrice:{...b,description:"Optional caller minimum sale price in USDe base units, 18 decimals."},slippageBps:{type:"integer",minimum:0,maximum:9999}}},execute:(t,a)=>I("sell",t,a)}]}};export{Ee as a};
|
|
1
|
+
import{b as ae,o as F}from"./XEN45QST.js";import{a as h,i as re,j as K}from"./5BP72XOA.js";import{a as O}from"./Z3FZWNAJ.js";import{randomBytes as ue,randomUUID as le}from"node:crypto";import{isDeepStrictEqual as se}from"node:util";import{decodeFunctionData as oe,encodeAbiParameters as Z,erc20Abi as J,getAddress as pe,isAddress as me,keccak256 as ee,parseAbi as te,parseAbiParameters as ne,toEventSelector as fe,zeroAddress as U}from"viem";var ie=re[h].meridian,L=ie.PredictionMarketEscrow.address,H=ie.SecondaryMarketEscrow.address,C={address:ie.CollateralToken_USDe.address,chainId:h,symbol:"USDe",decimals:18},ye="wss://relayer.predict.meridian.xyz/auction",ge=ne("(address conditionResolver,bytes conditionId,uint8 predictedOutcome)[]"),he=ne("bytes32,uint256,uint256,address,address,address,bytes"),be=ne("address,address,address,address,uint256,uint256"),j=te(["function getNonce(address) view returns (uint256)","function isNonceUsed(address,uint256) view returns (bool)"]),we=te(["function mint(((address conditionResolver,bytes conditionId,uint8 predictedOutcome)[] picks,uint256 predictorCollateral,uint256 counterpartyCollateral,address predictor,address counterparty,uint256 predictorNonce,uint256 counterpartyNonce,uint256 predictorDeadline,uint256 counterpartyDeadline,bytes predictorSignature,bytes counterpartySignature,bytes32 refCode,bytes predictorSessionKeyData,bytes counterpartySessionKeyData,address predictorSponsor,bytes predictorSponsorData) request)"]),ke=te(["function executeTrade((address token,address collateral,address seller,address buyer,uint256 tokenAmount,uint256 price,uint256 sellerNonce,uint256 buyerNonce,uint256 sellerDeadline,uint256 buyerDeadline,bytes sellerSignature,bytes buyerSignature,bytes32 refCode,bytes sellerSessionKeyData,bytes buyerSessionKeyData) request)"]),Ie=fe("Transfer(address,address,uint256)"),Be=[{name:"predictionHash",type:"bytes32"},{name:"signer",type:"address"},{name:"collateral",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}],Se=[{name:"tradeHash",type:"bytes32"},{name:"signer",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}];function i(e){throw new O(e)}function R(e){return(!e||typeof e!="object"||Array.isArray(e))&&i("Meridian returned an invalid exchange object."),e}function S(e,n,d=!1){return d&&typeof e=="number"&&Number.isSafeInteger(e)&&e>=0&&(e=String(e)),(typeof e!="string"||!/^\d+$/.test(e)||BigInt(e)>=1n<<256n)&&i(`Provide ${n} as a decimal base-unit integer string.`),e}function x(e){return(typeof e!="string"||!me(e,{strict:!1})||e.toLowerCase()===U)&&i("Provide a nonzero token, resolver or wallet address."),pe(e)}function V(e,n){return(typeof e!="string"||!/^0x(?:[0-9a-fA-F]{2})+$/.test(e)||n!==void 0&&e.length!==2+n*2)&&i("Meridian returned invalid hexadecimal data."),e}function q(e){return(typeof e!="string"||e.length===0||e.length>256)&&i("Meridian returned an invalid exchange identifier."),e}function k(e,n){return e?.toLowerCase()===n.toLowerCase()}function G(){return BigInt(Math.floor(Date.now()/1e3))}function Me(e,n){let d=e==="buy"?["picks","stake","minCounterpartyCollateral","usdgAmountIn","slippageBps","continuation","signature"]:["token","amount","minPrice","slippageBps","continuation","signature"];Object.keys(n).some(I=>!d.includes(I))&&i("Unsupported Meridian arguments; use the tool input schema."),n.slippageBps!==void 0&&(typeof n.slippageBps!="number"||!Number.isInteger(n.slippageBps)||n.slippageBps<0||n.slippageBps>=1e4)&&i("Slippage must be an integer from 0 to 9999 basis points.");let c=n.slippageBps;if(e==="sell"){let I=S(n.amount,"the position amount");BigInt(I)===0n&&i("The position amount must be positive.");let b=x(n.token);(k(b,C.address)||k(b,K))&&i("Choose a Meridian position token to sell.");let $;if(n.minPrice!==void 0){let A=S(n.minPrice,"the minimum sale price");BigInt(A)<=1n&&i("The minimum sale price must be greater than 1 base unit."),$=c===void 0?A:F(A,c),BigInt($)<=1n&&i("The minimum sale price after slippage must be greater than 1 base unit.")}else{let A=BigInt(I)/100n>10n**18n?BigInt(I)/100n:10n**18n;$=c===void 0?A.toString():F(A.toString(),c)}return{side:e,token:b,amount:I,minPrice:$,...c===void 0?{}:{slippageBps:c}}}(!Array.isArray(n.picks)||n.picks.length<1||n.picks.length>10)&&i("Provide between one and ten Meridian picks.");let f=n.picks.map(I=>{let b=R(I);return(Object.keys(b).some($=>!["conditionResolver","conditionId","predictedOutcome"].includes($))||b.predictedOutcome!==0&&b.predictedOutcome!==1)&&i("Each pick needs a resolver, condition ID and outcome 0 or 1."),{conditionResolver:x(b.conditionResolver),conditionId:V(b.conditionId),predictedOutcome:b.predictedOutcome}}).sort((I,b)=>{let $=`${I.conditionResolver.toLowerCase()}:${I.conditionId.toLowerCase()}:${I.predictedOutcome}`,A=`${b.conditionResolver.toLowerCase()}:${b.conditionId.toLowerCase()}:${b.predictedOutcome}`;return $<A?-1:$>A?1:0}),m=f.map(I=>`${I.conditionResolver.toLowerCase()}:${I.conditionId.toLowerCase()}`);new Set(m).size!==f.length&&i("Do not repeat a condition in the same prediction.");let B=S(n.stake,"the USDe stake");BigInt(B)<10n**18n&&i("Meridian requires a stake of at least 1 USDe.");let M=n.usdgAmountIn===void 0?void 0:S(n.usdgAmountIn,"the USDG swap amount");M!==void 0&&BigInt(M)===0n&&i("The USDG swap amount must be positive.");let _=n.minCounterpartyCollateral!==void 0?S(n.minCounterpartyCollateral,"the minimum counterparty collateral"):F(B,c??ae);return BigInt(_)<=1n&&i("The minimum counterparty collateral must be greater than 1 base unit."),{side:e,picks:f,stake:B,minCounterpartyCollateral:_,...M===void 0?{}:{usdgAmountIn:M},...c===void 0?{}:{slippageBps:c}}}var X=class{constructor(n,d){this.id=n;this.prefix=d;this.socket=new globalThis.WebSocket(ye),this.socket.addEventListener("open",()=>{this.opened=!0,this.notify?.()}),this.socket.addEventListener("close",()=>this.stop("Meridian exchange socket was lost. Start a fresh auction.")),this.socket.addEventListener("error",()=>this.stop("Meridian exchange socket failed. Start a fresh auction.")),this.socket.addEventListener("message",c=>{try{(typeof c.data!="string"||c.data.length>65536)&&i("Meridian returned a malformed exchange message.");let f=R(JSON.parse(c.data));if(f.type==="pong")return;let m=q(f.type),B=R(f.payload);if((m==="error"||m===`${d}.error`||m===`${d}.rejected`||m===`${d}.failed`||m===`${d}.expired`)&&i("Meridian rejected or failed the exchange. Start a fresh auction."),m===`${d}.ack`){(B.id!==n||this.auctionId!==void 0)&&i("Meridian acknowledged a different exchange."),this.auctionId=q(B.auctionId);return}if((!m.startsWith(`${d}.`)||B.auctionId!==this.auctionId||!this.auctionId)&&i("Meridian returned a message for a different exchange."),(m===`${d}.pending`||m===`${d}.filled`)&&!this.accepting&&i("Meridian returned settlement before acceptance."),m===`${d}.pending`)return;this.queue.length>=16&&i("Meridian returned too many exchange messages."),this.queue.push({type:m,payload:B}),this.notify?.()}catch{this.stop("Meridian rejected or returned an invalid exchange message. Start a fresh auction.")}})}id;prefix;socket;queue=[];notify;error;auctionId;accepting=!1;opened=!1;check(){if(this.error)throw this.error;this.socket.readyState>1&&i("Meridian exchange socket was lost. Start a fresh auction.")}stop(n){this.error??=new O(n),this.notify?.(),this.socket.readyState<2&&this.socket.close()}async wait(n,d=3e4){return new Promise((c,f)=>{let m=setTimeout(()=>this.stop("Meridian exchange timed out. Start a fresh auction."),d),B=()=>{try{if(this.check(),n===void 0?!this.opened:!this.queue.length)return;let M=n===void 0?void 0:this.queue.shift();M&&M.type!==`${this.prefix}.${n}`&&i("Meridian returned an unexpected exchange stage."),clearTimeout(m),this.notify=void 0,c(M?.payload??{})}catch(M){clearTimeout(m),this.notify=void 0,f(M)}};this.notify=B,B()})}send(n,d){this.check(),this.socket.readyState!==1&&i("Meridian exchange socket is not open."),n==="accept"&&(this.accepting=!0),this.socket.send(JSON.stringify({...n==="start"?{id:this.id}:{},type:`${this.prefix}.${n}`,payload:d}))}};function Y(e){return ee(Z(ge,[e]))}function $e(e,n,d){return ee(Z(he,[Y(e.picks),BigInt(e.stake),BigInt(d.counterpartyCollateral),n,d.counterparty,U,"0x"]))}function Ae(e,n,d,c){return ee(Z(be,[e.token,C.address,n,d,BigInt(e.amount),BigInt(c)]))}function Q(e,n){let{input:d,wallet:c,nonce:f,deadline:m}=e,B={name:d.side==="buy"?"PredictionMarketEscrow":"SecondaryMarketEscrow",version:"1",chainId:h,verifyingContract:e.continuation.escrowContract};return(!f||!m)&&i("Meridian exchange is missing its signing terms."),d.side==="buy"?(n||i("Meridian has not returned a winning bid."),{domain:B,primaryType:"MintApproval",types:{MintApproval:Be},message:{predictionHash:$e(d,c,n),signer:c,collateral:d.stake,nonce:f,deadline:m}}):{domain:B,primaryType:"TradeApproval",types:{TradeApproval:Se},message:{tradeHash:Ae(d,c,n?n.buyer:U,n?n.price:"0"),signer:c,nonce:f,deadline:m}}}function de(e){let n=[BigInt(e.deadline)],d=e.continuation;if(d.stage==="primary_accept"||d.stage==="secondary_accept"){n.push(BigInt(d.acceptDeadline));let c=d.winningBid;d.stage==="primary_accept"&&n.push(BigInt(c.counterpartyDeadline)),c.buyerDeadline!==void 0&&n.push(BigInt(S(c.buyerDeadline,"the buyer deadline",!0)))}return n.reduce((c,f)=>c<f?c:f)}function z(e){e.channel?.check(),e.deadline&&G()>=de(e)&&i("Meridian exchange expired. Start a fresh auction.")}var Ee=e=>{let n=new Map;function d(t){clearTimeout(t.timer),n.delete(t.continuation.requestId),t.channel?.stop("Meridian exchange is closed or expired. Start a fresh auction.")}function c(t,a){clearTimeout(t.timer),t.timer=setTimeout(()=>d(t),a),t.timer.unref?.()}function f(t){let{wallet:a,chainId:s,escrowContract:p,requestId:u}=t.continuation;return{wallet:a,chainId:s,escrowContract:p,requestId:u}}async function m(t){let{input:a,wallet:s}=t,p=e.clientFor(h),u=a.side==="buy"?C.address:a.token,r=a.side==="buy"?a.stake:a.amount,[y,w]=await Promise.all([p.readContract({address:u,abi:J,functionName:"balanceOf",args:[s]}),p.readContract({address:u,abi:J,functionName:"allowance",args:[s,t.continuation.escrowContract]})]);if(a.side==="sell"&&await p.readContract({address:u,abi:J,functionName:"decimals"})!==18&&i("Meridian position tokens must have 18 decimals."),y>=BigInt(r)&&w>=BigInt(r))return;(t.continuation.stage==="primary_accept"||t.continuation.stage==="secondary_accept")&&i("Meridian prerequisites changed during the auction. Start a fresh auction after funding and approval.");let l,D;if(y<BigInt(r)){a.side==="sell"&&i("The wallet does not have enough position tokens to sell."),a.usdgAmountIn||i("Not enough USDe. Provide usdgAmountIn in USDG base units to quote a swap before the auction.");let g=await e.quoteSwap({from:K,to:C.address,amountIn:a.usdgAmountIn,...a.slippageBps===void 0?{}:{slippageBps:a.slippageBps}},s);(G()>=BigInt(S(g.expiresAt,"the swap expiry"))||BigInt(S(g.minAmountOut,"the swap minimum"))+y<BigInt(r))&&i("The USDG swap minimum does not cover the USDe stake, or the quote expired. Request a fresh quote with sufficient input.");let o=await e.buildSwap(g.quoteId,s);(!("txs"in o)||!o.txs.length)&&i("The swap coordinator did not return prerequisite transactions."),l=o.txs,D=`${o.summary} Minimum USDe output: ${g.minAmountOut} base units (18 decimals).`}else l=[e.approval(u,t.continuation.escrowContract,r,h)],D=`Approve exactly ${r} base units (18 decimals) of ${u} for ${t.continuation.escrowContract} on chain ${h}.`;l.some(g=>g.chainId!==h)&&i("Meridian prerequisite transactions must use chain 4663.");let v=await e.preview(l,s),T=v.changes.map(g=>{let o=g.amount.startsWith("-");return`${o?"-":"+"}${e.formatAmount(o?g.amount.slice(1):g.amount,g.token.decimals)} ${g.token.symbol} (${g.token.address}, chain ${g.token.chainId}, ${g.token.decimals} decimals)`}).join("; ");return t.channel?.stop("Meridian prerequisites must be mined before the auction."),t.channel=void 0,t.deadline=void 0,t.nonce=void 0,t.continuation={...f(t),stage:"prerequisites"},{steps:l.map(g=>({kind:"tx",tx:g})),continuation:structuredClone(t.continuation),summary:`${D} ${v.summary} ${T}. Mine these prerequisites before continuing; no RFQ has started.`}}function B(t){let a=t.continuation;a.stage==="prerequisites"&&i("Meridian prerequisites need to finish before signing."),z(t),c(t,Number(de(t)-G())*1e3);let s=t.input,p=s.side==="buy"?`Stake ${s.stake} base units of USDe (${C.address}, 18 decimals)`:`Sell ${s.amount} base units of position ${s.token} (18 decimals)`,u=a.stage==="secondary_start"?"Initial buyer-zero, price-zero intent only.":a.stage==="primary_accept"?`Counterparty ${a.winningBid.counterparty}; counterparty collateral ${a.winningBid.counterpartyCollateral} USDe base units; counterparty deadline ${a.winningBid.counterpartyDeadline}.`:`Buyer ${a.winningBid.buyer}; receive ${a.winningBid.price} USDe base units (${C.address}, 18 decimals).`;return{steps:[{kind:"typedData",request:structuredClone(a.request)}],continuation:structuredClone(a),summary:`${p} on chain ${h}. Approval was checked on chain. ${u} Sign locally for domain ${a.request.domain.name}, version 1, escrow ${a.escrowContract}, signature deadline ${t.deadline}${"acceptDeadline"in a?`, acceptance deadline ${a.acceptDeadline}`:""}. External relayer settlement is pending; a signature is not a fill.`}}async function M(t){let a=await t.channel.wait("result"),s=R(a.winningBid),p=q(a.auctionId);s.auctionId!==p&&i("Meridian winning bid belongs to another auction.");let u=S(a.acceptDeadline,"the acceptance deadline",!0);if(t.input.side==="buy"){let r={auctionId:p,counterparty:q(s.counterparty),counterpartyCollateral:S(s.counterpartyCollateral,"the counterparty collateral"),counterpartyNonce:S(s.counterpartyNonce,"the counterparty nonce",!0),counterpartyDeadline:S(s.counterpartyDeadline,"the counterparty deadline",!0),receivedAt:q(s.receivedAt)};x(r.counterparty),(!Number.isFinite(Date.parse(r.receivedAt))||BigInt(r.counterpartyCollateral)<=1n||BigInt(r.counterpartyCollateral)<BigInt(t.input.minCounterpartyCollateral))&&i("Meridian winning bid counterparty collateral is below the caller minimum."),t.continuation={...f(t),stage:"primary_accept",auctionId:p,winningBid:r,acceptDeadline:u,request:Q(t,r)}}else{let r={auctionId:p,buyer:q(s.buyer),price:S(s.price,"the sale price"),...s.buyerDeadline!==void 0?{buyerDeadline:S(s.buyerDeadline,"the buyer deadline",!0)}:{},...s.buyerNonce!==void 0?{buyerNonce:S(s.buyerNonce,"the buyer nonce",!0)}:{},...s.receivedAt!==void 0?{receivedAt:q(s.receivedAt)}:{}};x(r.buyer),(BigInt(r.price)<=1n||BigInt(r.price)<BigInt(t.input.minPrice))&&i("Meridian winning bid sale price is below the caller minimum."),t.continuation={...f(t),stage:"secondary_accept",auctionId:p,winningBid:r,acceptDeadline:u,request:Q(t,r)}}return B(t)}async function _(t,a){let s=t.continuation;s.stage!=="primary_accept"&&s.stage!=="secondary_accept"&&i("Meridian exchange is not ready for acceptance."),z(t),t.channel.send("accept",{auctionId:s.auctionId,[t.input.side==="buy"?"predictorSignature":"sellerSignature"]:a}),c(t,15e4);let p=await t.channel.wait("filled",12e4),u=V(p.transactionHash,32),r=e.clientFor(h),[y,w]=await Promise.all([r.waitForTransactionReceipt({hash:u,timeout:12e4}),r.getTransaction({hash:u})]);(y.status!=="success"||!k(y.transactionHash,u)||!k(w.hash,u)||!k(y.to,s.escrowContract)||!k(w.to,s.escrowContract)||w.chainId!==h)&&i("Meridian fill has no matching successful receipt on chain 4663.");let{input:l,wallet:D}=t;if(l.side==="buy"&&s.stage==="primary_accept"){let o=oe({abi:we,data:w.input}).args[0];(!k(Y([...o.picks]),Y(l.picks))||o.predictorCollateral!==BigInt(l.stake)||o.counterpartyCollateral!==BigInt(s.winningBid.counterpartyCollateral)||!k(o.predictor,D)||!k(o.counterparty,s.winningBid.counterparty)||o.predictorNonce!==BigInt(t.nonce)||o.counterpartyNonce!==BigInt(s.winningBid.counterpartyNonce)||o.predictorDeadline!==BigInt(t.deadline)||o.counterpartyDeadline!==BigInt(s.winningBid.counterpartyDeadline)||!k(o.predictorSponsor,U)||o.predictorSponsorData!=="0x"||o.predictorSignature!==a)&&i("Meridian mint receipt does not match the accepted prediction.")}else if(l.side==="sell"&&s.stage==="secondary_accept"){let o=oe({abi:ke,data:w.input}).args[0];(!k(o.token,l.token)||!k(o.collateral,C.address)||!k(o.seller,D)||!k(o.buyer,s.winningBid.buyer)||o.tokenAmount!==BigInt(l.amount)||o.price!==BigInt(s.winningBid.price)||o.sellerNonce!==BigInt(t.nonce)||o.sellerDeadline!==BigInt(t.deadline)||o.sellerSignature!==a)&&i("Meridian sale receipt does not match the accepted trade.")}let v=new Map,T=new Map;for(let o of y.logs){if(o.topics[0]!==Ie||o.topics.length!==3)continue;(!/^0x[0-9a-fA-F]{64}$/.test(o.data)||!o.topics.slice(1).every(ce=>/^0x0{24}[0-9a-fA-F]{40}$/.test(ce)))&&i("Meridian receipt has malformed transfer logs.");let E=`0x${o.topics[1].slice(-40)}`,N=`0x${o.topics[2].slice(-40)}`,P=o.address.toLowerCase(),W=BigInt(o.data);v.set(P,(v.get(P)??0n)+(k(N,D)?W:0n)-(k(E,D)?W:0n)),k(E,U)&&k(N,D)&&T.set(P,(T.get(P)??0n)+W)}let g;if(l.side==="buy"&&s.stage==="primary_accept"){let o=BigInt(l.stake)+BigInt(s.winningBid.counterpartyCollateral),E=[...T].filter(([N,P])=>!k(N,C.address)&&P===o&&v.get(N)===o);(E.length!==1||v.get(C.address.toLowerCase())!==-BigInt(l.stake))&&i("Meridian mint receipt does not prove the expected collateral and position delta."),g=`${o} base units received in position ${E[0][0]}`}else l.side==="sell"&&s.stage==="secondary_accept"?((v.get(l.token.toLowerCase())!==-BigInt(l.amount)||v.get(C.address.toLowerCase())!==BigInt(s.winningBid.price))&&i("Meridian sale receipt does not prove the expected collateral and position delta."),g=`${l.amount} base units sold from position ${l.token}; ${s.winningBid.price} USDe base units received`):i("Meridian fill has a different exchange stage.");return{txs:[],hashes:[u],status:"mined",summary:`Mined: ${u}. Status: mined. Meridian ${l.side} filled by the external relayer. Successful receipt and transfer deltas verified on chain ${h}: ${g} (18 decimals); collateral USDe ${C.address} (18 decimals).`}}async function I(t,a,s){let p=x(s),u=Me(t,a),r;if(a.continuation!==void 0){let y=R(a.continuation),w=n.get(q(y.requestId));w||i("Meridian exchange is lost or expired. Start a fresh auction."),(!k(w.wallet,p)||!se(w.input,u)||!se(w.continuation,y))&&i("Meridian continuation or arguments do not match the active wallet exchange."),w.busy&&i("Meridian exchange is already processing this continuation."),r=w}else{a.signature!==void 0&&i("A signature requires an active Meridian continuation."),n.size>=1e3&&i("Too many active Meridian exchanges. Please try again later.");let y=le(),w=setTimeout(()=>{let l=n.get(y);l&&d(l)},9e5);w.unref?.(),r={input:u,wallet:p,continuation:{stage:"prerequisites",wallet:p,chainId:h,escrowContract:t==="buy"?L:H,requestId:y},busy:!1,timer:w},n.set(y,r)}r.busy=!0;try{z(r),await e.clientFor(h).getChainId()!==h&&i("Meridian requires an RPC on chain 4663.");let y=r.continuation.stage;y==="prerequisites"&&a.signature!==void 0&&i("Do not sign before Meridian prerequisites have mined.");let w=await m(r);if(w)return w;if(y==="prerequisites")return r.nonce=t==="buy"?(await e.clientFor(h).readContract({address:L,abi:j,functionName:"getNonce",args:[p]})).toString():BigInt(`0x${ue(16).toString("hex")}`).toString(),r.deadline=(G()+300n).toString(),t==="sell"&&await e.clientFor(h).readContract({address:H,abi:j,functionName:"isNonceUsed",args:[p,BigInt(r.nonce)]})&&i("Meridian seller nonce is already used. Start a fresh auction."),r.channel=new X(r.continuation.requestId,t==="buy"?"auction":"secondary.auction"),await r.channel.wait(),u.side==="buy"?(r.channel.send("start",{id:r.continuation.requestId,picks:u.picks,predictorCollateral:u.stake,predictor:p,predictorNonce:r.nonce,predictorDeadline:r.deadline,chainId:h,escrowContract:L,mode:"blind"}),await M(r)):(r.continuation={...f(r),stage:"secondary_start",request:Q(r)},B(r));let l=V(a.signature);if(t==="sell"&&await e.clientFor(h).readContract({address:H,abi:j,functionName:"isNonceUsed",args:[p,BigInt(r.nonce)]})&&i("Meridian seller nonce is already used. Start a fresh auction."),t==="buy"&&(await e.clientFor(h).readContract({address:L,abi:j,functionName:"getNonce",args:[p]})).toString()!==r.nonce&&i("Meridian predictor nonce changed. Start a fresh auction."),z(r),y==="secondary_start"&&u.side==="sell")return r.channel.send("start",{id:r.continuation.requestId,token:u.token,collateral:C.address,tokenAmount:u.amount,seller:p,sellerNonce:r.nonce,sellerDeadline:r.deadline,chainId:h,escrowContract:H,mode:"blind",sellerSignature:l}),await M(r);let D=await _(r,l);return d(r),D}catch(y){throw d(r),new O(e.plainError(y))}finally{r.busy=!1}}let b={type:"string",pattern:"^\\d+$"},$={type:"string",pattern:"^0x[0-9a-fA-F]{40}$"},A={continuation:{type:"object"},signature:{type:"string",pattern:"^0x([0-9a-fA-F]{2})+$"}};return{tools:[{name:"meridian_buy",inputSchema:{type:"object",additionalProperties:!1,required:["picks","stake"],properties:{...A,stake:{...b,description:"USDe stake in base units, 18 decimals, chain 4663."},minCounterpartyCollateral:{...b,description:"Optional caller minimum counterparty collateral in USDe base units, 18 decimals."},usdgAmountIn:{...b,description:"Optional exact USDG swap input in base units, 6 decimals, if USDe balance is insufficient."},slippageBps:{type:"integer",minimum:0,maximum:9999},picks:{type:"array",minItems:1,maxItems:10,items:{type:"object",additionalProperties:!1,required:["conditionResolver","conditionId","predictedOutcome"],properties:{conditionResolver:$,conditionId:{type:"string",pattern:"^0x([0-9a-fA-F]{2})+$"},predictedOutcome:{type:"integer",enum:[0,1]}}}}}},execute:(t,a)=>I("buy",t,a)},{name:"meridian_sell",inputSchema:{type:"object",additionalProperties:!1,required:["token","amount"],properties:{...A,token:{...$,description:"Position token address on chain 4663."},amount:{...b,description:"Position amount in base units, 18 decimals."},minPrice:{...b,description:"Optional caller minimum sale price in USDe base units, 18 decimals."},slippageBps:{type:"integer",minimum:0,maximum:9999}}},execute:(t,a)=>I("sell",t,a)}]}};export{Ee as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as E,o as O}from"./XEN45QST.js";import{c as Q}from"./TU3KHOZK.js";import{b as K}from"./UB5U6SI2.js";import{a as p,i as G}from"./5BP72XOA.js";import{a as _}from"./XAB4OIE3.js";import{a as J}from"./7I6TXFXR.js";import{a as r}from"./Z3FZWNAJ.js";import{decodeFunctionResult as ie,encodeAbiParameters as P,encodeFunctionData as v,erc20Abi as H,isAddress as te,parseAbi as oe,parseAbiParameters as L,toHex as F,zeroAddress as $}from"viem";var h=G[p].clanker,U=oe(["function deployToken(((address tokenAdmin,string name,string symbol,bytes32 salt,string image,string metadata,string context,uint256 originatingChainId) tokenConfig,(address hook,address pairedToken,int24 tickIfToken0IsClanker,int24 tickSpacing,bytes poolData) poolConfig,(address locker,address[] rewardAdmins,address[] rewardRecipients,uint16[] rewardBps,int24[] tickLower,int24[] tickUpper,uint16[] positionBps,bytes lockerData) lockerConfig,(address mevModule,bytes mevModuleData) mevModuleConfig,(address extension,uint256 msgValue,uint16 extensionBps,bytes extensionData)[] extensionConfigs) config) payable returns (address)","function tokenDeploymentInfo(address) view returns ((address,address,address,address[]))"]),k=oe(["function availableFees(address,address) view returns (uint256)","function claim(address,address)","function collectRewards(address)","function mevModuleEnabled(bytes32) view returns (bool)","function mevModuleOperational(bytes32) returns (bool)"]),C={address:h.paired_weth.address,symbol:"WETH",decimals:18,chainId:p},ae="https://www.clanker.world/api/tokens",X={type:"string",pattern:"^\\d+$"},Y={type:"string",pattern:"^0x[0-9a-fA-F]{40}$"},Z={type:"string",pattern:"^0x[0-9a-fA-F]{64}$"};function S(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function b(e){if(typeof e!="string"||!te(e,{strict:!1})||e.toLowerCase()===$)throw new r("Provide a valid nonzero address.");return e}function ee(e,t){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new r(`Provide an explicit bytes32 ${t}.`);return e}function A(e,t,i=!1){if(e===void 0&&!i)return"";if(typeof e!="string"||i&&!e.trim())throw new r(`Provide ${t} as text.`);return e}function R(e,t=256){let i=J(e);if(i>=1n<<BigInt(t))throw new r(`Amount exceeds the uint${t} range.`);return i}function q(e){if(typeof e!="bigint"||e<0n||e>=1n<<256n)throw new r("The contract returned an invalid amount.");return e.toString()}function V(e,t){let i=Object.keys(e).find(m=>!t.includes(m));if(i)throw new r(`Unsupported Clanker input: ${i}.`)}function ne(e,t){return t.changes.map(({token:i,amount:m})=>{let w=m.startsWith("-");return`${w?"-":"+"}${e.formatAmount(w?m.slice(1):m,i.decimals)} ${i.symbol} (${i.address}, chain ${i.chainId})`}).join("; ")}function de(e){return S(e)&&Array.isArray(e.data)&&Number.isSafeInteger(e.total)&&Number(e.total)>=0&&Number.isSafeInteger(e.tokensDeployed)&&Number(e.tokensDeployed)>=0&&(e.cursor===null||typeof e.cursor=="string"||e.cursor===void 0&&e.data.length===0&&e.total===0&&e.tokensDeployed===0)&&e.data.every(t=>S(t)&&typeof t.name=="string"&&typeof t.symbol=="string"&&Number.isSafeInteger(t.chain_id)&&["contract_address","admin","msg_sender","factory_address"].every(i=>typeof t[i]=="string"&&te(t[i],{strict:!1})))}async function ce(e,t={}){V(t,["q","limit","cursor","deployer"]);let i=t.limit??10;if(typeof i!="number"||!Number.isInteger(i)||i<1||i>20)throw new r("Choose an indexer limit from 1 to 20.");let m=new URL(ae);m.searchParams.set("chainId",String(p)),m.searchParams.set("limit",String(i)),t.q!==void 0&&m.searchParams.set("q",A(t.q,"search")),t.cursor!==void 0&&m.searchParams.set("cursor",A(t.cursor,"cursor",!0)),t.deployer!==void 0&&m.searchParams.set("msgSender",b(t.deployer));let w=await Q(e.http,m.toString(),{headers:{"User-Agent":"Oak-Clanker/1.0"}},de);return{tokens:w.data.filter(x=>x.chain_id===p&&x.factory_address.toLowerCase()===h.factory.address.toLowerCase()),total:w.total,cursor:w.cursor||null,tokensDeployed:w.tokensDeployed}}var ue=e=>{let t=()=>e.clientFor(p),i=async n=>{try{return await n()}catch(s){throw new r(e.plainError(s))}},m=(n,s,l,d="0")=>e.unsignedTx({to:n,data:s,value:d,chainId:p,description:l}),w=async(n,s)=>q(await t().readContract({address:h.fee_locker.address,abi:k,functionName:"availableFees",args:[n,s]})),x=async n=>{if(n.toLowerCase()===C.address.toLowerCase())return C;let[s,l]=await Promise.all([t().readContract({address:n,abi:H,functionName:"symbol"}),t().readContract({address:n,abi:H,functionName:"decimals"})]);if(typeof s!="string"||!s.trim()||!Number.isInteger(l)||l<0||l>255)throw new r("The contract returned invalid token metadata.");return{address:n,chainId:p,symbol:s,decimals:l}},j=n=>ce(e,n),se=async(n,s)=>{if(V(n,["name","symbol","salt","image","metadata","context","vanity","initialBuy","minAmountOut","slippageBps"]),n.vanity!==void 0&&n.vanity!==!1)throw new r("Clanker launches use vanity false and an explicit salt.");let l=A(n.name,"token name",!0),d=A(n.symbol,"token symbol",!0),g=ee(n.salt,"salt"),f=R(n.initialBuy??"0"),c=n.slippageBps??E;if(typeof c!="number")throw new r("Slippage must be an integer from 0 to 9999 bps.");O("0",c);let o=n.minAmountOut===void 0?void 0:R(n.minAmountOut,128);if(o!==void 0&&o<=1n)throw new r("Initial-buy minimum must exceed one base unit.");if(!f&&o!==void 0)throw new r("A minimum requires a positive initial buy.");let u={tokenConfig:{tokenAdmin:s,name:l,symbol:d,salt:g,image:A(n.image,"image"),metadata:A(n.metadata,"metadata"),context:n.context===void 0?JSON.stringify({interface:"Oak",platform:"robinhood"}):A(n.context,"context"),originatingChainId:BigInt(p)},poolConfig:{hook:h.fee_static_hook_v2.address,pairedToken:C.address,tickIfToken0IsClanker:-230400,tickSpacing:200,poolData:P(L("(address,bytes,bytes)"),[[$,"0x",P(L("uint24,uint24"),[1e4,1e4])]])},lockerConfig:{locker:h.locker.address,rewardAdmins:[s],rewardRecipients:[s],rewardBps:[1e4],tickLower:[-230400],tickUpper:[-12e4],positionBps:[1e4],lockerData:P(L("(uint8[])"),[[[0]]])},mevModuleConfig:{mevModule:h.mev_module.address,mevModuleData:P(L("(uint24,uint24,uint256)"),[[666777,41673,15n]])},extensionConfigs:[]},y=await t().simulateContract({address:h.factory.address,abi:U,functionName:"deployToken",args:[u],account:s,value:0n,gas:_}),a=b(y.result),D=W=>{let M=f?[{extension:h.devbuy.address,msgValue:f,extensionBps:0,extensionData:P(L("(address,address,uint24,int24,address),uint128,address"),[[$,$,0,0,$],W,s])}]:[];return m(h.factory.address,v({abi:U,functionName:"deployToken",args:[{...u,extensionConfigs:M}]}),`Launch ${l} (${d}); initial buy ${f} native ETH base units.`,f.toString())};if(f&&o===void 0){let M=(await e.preview([D(0n)],s)).changes.filter(T=>T.token.chainId===p&&T.token.address.toLowerCase()===a.toLowerCase()&&T.token.decimals===18).reduce((T,z)=>T+(/^-?\d+$/.test(z.amount)?BigInt(z.amount):(()=>{throw new r("Invalid initial-buy simulation amount.")})()),0n);if(M<=0n)throw new r("Initial-buy simulation returned no token output.");if(o=R(O(M.toString(),c),128),o<=1n)throw new r("Initial-buy output is too small for a protected minimum.")}let I=[D(o??0n)],B=await e.preview(I,s);return{txs:I,preview:B,predictedToken:a,token:{address:a,chainId:p,symbol:d,decimals:18},...o!==void 0?{minAmountOut:o.toString()}:{},summary:`Launch ${d} at ${a} (CREATE2 address predicted from simulation); vanity false; salt ${g}. Supply 100000000000000000000000000000 base units (18 decimals). Static LP fee 1%; protocol adds 20% of LP fees. Reward allocation: ${s} 10000 bps, both assets. Position 10000 bps, ticks -230400 to -120000, spacing 200. Sniper fees 666777 to 41673 over 15 seconds. ${B.summary} ${ne(e,B)}`}},re=async(n,s)=>{if(V(n,["token","poolId"]),n.poolId!==void 0&&n.token===void 0)throw new r("A pool ID requires its Clanker token.");let l=[C],d=[];if(n.token!==void 0){let o=b(n.token);if(o.toLowerCase()===C.address.toLowerCase())throw new r("Provide the launched Clanker token, not WETH.");if(n.poolId!==void 0){let u=ee(n.poolId,"pool ID for fee collection"),y=await t().readContract({address:h.factory.address,abi:U,functionName:"tokenDeploymentInfo",args:[o]});if(!Array.isArray(y)||y.length!==4||typeof y[0]!="string"||y[0].toLowerCase()!==o.toLowerCase())throw new r("The factory did not identify this Clanker token.");let a=b(y[1]),D=b(y[2]),I=await t().readContract({address:a,abi:k,functionName:"mevModuleEnabled",args:[u]});if(typeof I!="boolean")throw new r("The hook returned an invalid MEV guard state.");I&&d.push(m(a,v({abi:k,functionName:"mevModuleOperational",args:[u]}),"Update the Clanker pool MEV guard before collection.")),d.push(m(D,v({abi:k,functionName:"collectRewards",args:[o]}),"Collect pending LP fees into the fee locker."))}l.push(await x(o))}let g;if(d.length){if(await t().getChainId()!==p)throw new r("Fee simulation endpoint is on the wrong chain.");let o=[...d.map(a=>({from:s,gas:F(_),to:a.to,data:a.data,value:F(BigInt(a.value))})),...l.map(a=>({from:s,gas:F(_),to:h.fee_locker.address,data:v({abi:k,functionName:"availableFees",args:[s,a.address]}),value:"0x0"}))],u=await t().request({method:"eth_simulateV1",params:[{blockStateCalls:[{calls:o}],validation:!1,traceTransfers:!1},"latest"]},{retryCount:0});if(!Array.isArray(u)||u.length!==1||!S(u[0])||!Array.isArray(u[0].calls)||u[0].calls.length!==o.length)throw new r("The endpoint returned an unexpected fee simulation response.");let y=u[0].calls;if(!y.every(a=>S(a)&&a.status==="0x1"&&!a.error))throw new r("Clanker fee collection simulation failed.");g=y.slice(d.length).map(a=>{if(!S(a)||typeof a.returnData!="string"||!/^0x[0-9a-fA-F]{64}$/.test(a.returnData))throw new r("The endpoint returned an invalid fee balance.");return q(ie({abi:k,functionName:"availableFees",data:a.returnData}))})}else g=await Promise.all(l.map(o=>w(s,o.address)));let f=l.flatMap((o,u)=>BigInt(g[u])>0n?[{token:o,amount:g[u]}]:[]);if(!f.length)throw new r("No claimable fees for this wallet; pending LP fees may require the MEV window to end.");for(let{token:o}of f)d.push(m(h.fee_locker.address,v({abi:k,functionName:"claim",args:[s,o.address]}),`Claim ${o.symbol} fees to ${s}.`));let c=await e.preview(d,s);return{txs:d,preview:c,fees:f,summary:`Claim fees to ${s}. WETH fees aggregate across all Clanker launches for this recipient. ${c.summary} ${ne(e,c)}`}},N=(n,s,l,d)=>({name:`clanker_${n}`,inputSchema:{type:"object",properties:s,required:l,additionalProperties:!1},execute:(g,f)=>i(async()=>d(g,b(f)))});return{tools:[N("launch",{name:{type:"string"},symbol:{type:"string"},salt:Z,image:{type:"string"},metadata:{type:"string"},context:{type:"string"},vanity:{const:!1},initialBuy:{...X,description:"Native ETH base units, 18 decimals."},minAmountOut:{...X,description:"Minimum new token base units, 18 decimals; derived from simulation when omitted."},slippageBps:{type:"integer",minimum:0,maximum:9999,default:E}},["name","symbol","salt"],se),N("claim",{token:{...Y,description:"Optional launched token to claim already-collected token fees or collect LP fees."},poolId:{...Z,description:"Optional pool ID used with token to sync the MEV guard and collect pending LP fees before claiming."}},[],re),N("browse",{q:{type:"string"},limit:{type:"integer",minimum:1,maximum:20},cursor:{type:"string"},deployer:Y},[],j)],positions:n=>i(async()=>{b(n);let s=new Map,l=new Set,d;do{let c=await j({deployer:n,limit:20,...d?{cursor:d}:{}});for(let o of c.tokens)o.msg_sender.toLowerCase()===n.toLowerCase()&&s.set(o.contract_address.toLowerCase(),o);if(c.cursor&&l.has(c.cursor))throw new r("The Clanker indexer repeated a pagination cursor.");c.cursor&&l.add(c.cursor),d=c.cursor??void 0}while(d);let g=[],f=[C];for(let[c,o]of s){let u=await x(o.contract_address),y=q(await t().readContract({address:u.address,abi:H,functionName:"balanceOf",args:[n]}));g.push({module:"clanker",id:`launch:${c}`,chainId:p,assets:[{token:u,amount:y}],description:`Indexed launch ${o.name}; wallet token balance, not locked LP principal.`}),f.some(a=>a.address.toLowerCase()===u.address.toLowerCase())||f.push(u)}for(let c of f){let o=await w(n,c.address);BigInt(o)>0n&&g.push({module:"clanker",id:`fees:${c.address.toLowerCase()}`,chainId:p,assets:[{token:c,amount:o}],description:"Collected fees across launches for this recipient. Pending LP fees excluded; token-side discovery covers indexed launches by this wallet."})}return g})}},ke=e=>K("clanker",[ue(e)]);export{ce as a,ue as b,ke as c};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as d}from"./
|
|
1
|
+
import{a as d}from"./5BP72XOA.js";import{a as v}from"./7I6TXFXR.js";import{a as c}from"./Z3FZWNAJ.js";import{concat as B,encodeAbiParameters as D,getAddress as k,isAddress as F,keccak256 as g,parseAbiParameters as O,recoverAddress as q,toHex as N}from"viem";import{privateKeyToAccount as U}from"viem/accounts";var T="OakPriceNote",l="1",w=300,E="0x0000000000000000000000000000000000000000",W=g(N("PriceNote(address wallet,uint256 oakPerEthE18,uint64 timestamp,bytes32 nonce)")),L=g(N("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")),M=(1n<<64n)-1n,P=(1n<<256n)-1n,z=0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,G=0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0n;function X(e){if(typeof e!="string"||!/^0x[0-9a-fA-F]{130}$/.test(e))return!1;let n=BigInt(`0x${e.slice(2,66)}`),t=BigInt(`0x${e.slice(66,130)}`),i=Number.parseInt(e.slice(130,132),16);return!(i!==27&&i!==28||n<=0n||n>=z||t<=0n||t>G)}function m(e,n){if(typeof e!="string"||!F(e,{strict:!1}))throw new c(`Invalid ${n} address.`);return k(e)}function p(e,n){let t;if(typeof e=="bigint")t=e;else if(typeof e=="number"){if(!Number.isSafeInteger(e)||e<0)throw new c(`Invalid ${n}.`);t=BigInt(e)}else t=v(e);if(t<0n||t>P)throw new c(`${n} exceeds uint256 bounds.`);return t}function h(e,n){let t=p(e,n);if(t>M)throw new c(`${n} exceeds uint64 bounds.`);return t}function Y(e,n){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new c(`${n} must be a 32-byte hex string.`);return e}function j(e){if(typeof e=="bigint"){if(e<=0n||e>P)throw new c("Private key must be a positive scalar.");return`0x${e.toString(16).padStart(64,"0")}`}if(typeof e=="string"&&/^0x[0-9a-fA-F]{1,64}$/.test(e))return`0x${e.slice(2).padStart(64,"0")}`;throw new c("Invalid private key format.")}function K(e){let n=p(e.chainId,"chainId"),t=m(e.verifyingContract,"verifyingContract");return g(D(O("bytes32, bytes32, bytes32, uint256, address"),[L,g(N(e.name)),g(N(e.version)),n,t]))}function ce(e,n=d,t=l){return{name:T,version:t,chainId:Number(p(n,"chainId")),verifyingContract:m(e,"consumer")}}function J(e,n=d,t=l){return K({name:T,version:t,chainId:n,verifyingContract:e})}function Q(e){let n=m(e.wallet,"wallet"),t=p(e.oakPerEthE18,"oakPerEthE18"),i=h(e.timestamp,"timestamp"),r=Y(e.nonce,"nonce");return g(D(O("bytes32, address, uint256, uint64, bytes32"),[W,n,t,i,r]))}function C(e,n,t=d,i=l){let r=J(n,t,i),o=Q(e);return g(B(["0x1901",r,o]))}async function fe(e,n,t,i=d,r=l){let o=C(e,n,i,r);return typeof t=="object"&&t!==null&&"sign"in t?t.sign({hash:o}):U(j(t)).sign({hash:o})}async function Z(e,n,t,i=d,r=l){if(!X(n))return E;try{let o=C(e,t,i,r),x=await q({hash:o,signature:n});return k(x)}catch{return E}}function ee(e,n){let t=p(e,"oakPerEthE18"),i=p(n,"spotOakPerEthE18");if(i<=0n||t<=0n)return!1;if(t>P/2n||i>P/3n)throw new c("Guard arithmetic overflow.");let r=t*2n;return r>=i&&r<=i*3n}function te(e,n,t,i){if("signature"in e&&"consumer"in e&&"note"in e&&!("average"in e))return e;if("note"in e&&"signature"in e&&"consumer"in e){let a=e,f=n??{};return{...f,note:a.note,signature:a.signature,consumer:f.consumer??a.consumer,expiresAt:f.expiresAt??a.expiresAt}}return{...i??{},note:e,signature:n,consumer:t}}async function ne(e,n,t,i){let r=te(e,n,t,i),{note:o,signature:x,consumer:y}=r,a=h(o.timestamp,"timestamp"),f=p(o.oakPerEthE18,"oakPerEthE18"),S=(a+BigInt(w)).toString(),s=(b,V,H)=>({valid:!1,ok:!1,...H?{signer:H}:{},oakPerEthE18:f.toString(),expiresAt:S,reason:b,error:V}),I=r.wallet??r.boundWallet;if(I===void 0)return s("wrong_wallet","Bound wallet context is required to verify a price note.");if(m(o.wallet,"wallet")!==m(I,"boundWallet"))return s("wrong_wallet","Price note wallet does not match the bound wallet.");if(r.now===void 0)return s("expired","Current time (now) is required to verify price note expiry.");let A=h(r.now,"now");if(a>A)return s("not_yet_valid","Price note timestamp is in the future.");if(A-a>BigInt(w))return s("expired","Price note has expired.");if(r.expiresAt!==void 0){let b=h(r.expiresAt,"expiresAt");if(b!==a+BigInt(w)||A>b)return s("expired","Price note has expired.")}let R=r.chainId??d,$=r.version??l,u=await Z(o,x,y,R,$);if(u===E)return s("bad_signature","Price note signature could not be recovered.");if(r.signer===void 0)return s("bad_signature","Expected oracle signer is required to verify a price note.",u);let _=m(r.signer,"signer");return _===E||u!==_?s("bad_signature","Price note signer does not match the oracle signer.",u):r.spotOakPerEthE18===void 0?s("outside_guard","Spot OAK/ETH price is required to verify the price note guard band.",u):ee(f,r.spotOakPerEthE18)?{valid:!0,ok:!0,signer:u,oakPerEthE18:f.toString(),expiresAt:S}:s("outside_guard","Price note is outside the 50% spot guard band.",u)}var ue=ne;export{T as a,l as b,w as c,E as d,W as e,K as f,ce as g,J as h,Q as i,C as j,fe as k,Z as l,ee as m,ne as n,ue as o};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as u,b as R,i as M}from"./
|
|
1
|
+
import{a as u,b as R,i as M}from"./5BP72XOA.js";import{a as o}from"./Z3FZWNAJ.js";import{a as D}from"./XN4WDN3O.js";import{createPublicClient as A,custom as v,defineChain as F}from"viem";var g="https://rpc.mainnet.chain.robinhood.com",$="oak-core/0.1.0",H=M[4663].ponsClaims.multicall3.address,E=new Set(["eth_sendTransaction","eth_sendRawTransaction","eth_sign","personal_sign","eth_signTransaction","eth_signTypedData","eth_signTypedData_v1","eth_signTypedData_v3","eth_signTypedData_v4","wallet_sendTransaction","wallet_sign"]);function S(e=u,t=g){if(!Number.isSafeInteger(e)||e<=0)throw new o("Provide a positive integer chain ID.");let n=e===u?"Robinhood Chain":e===R?"Robinhood Chain Testnet":`Chain ${e}`;return F({id:e,name:n,nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:[t]}},...e===u?{contracts:{multicall3:{address:H}}}:{}})}function Q(e=u,t){if(t?.chain&&t.chain.id===e)return t.chain.contracts?.multicall3?.address;if(!(!Number.isSafeInteger(e)||e<=0))return S(e).contracts?.multicall3?.address}function j(e,t){if(e===null)return t;if(/^\d+(\.\d+)?$/.test(e.trim()))return Number(e.trim())*1e3;let n=Date.parse(e);return Number.isFinite(n)?Math.max(0,n-Date.now()):t}function T(e,t){return t.throwIfAborted(),e<=0?Promise.resolve():new Promise((n,i)=>{let r=()=>{clearTimeout(a),i(t.reason)},a=setTimeout(()=>{t.removeEventListener("abort",r),n()},e);t.addEventListener("abort",r,{once:!0})})}function z(e,t,n){let i=e?.trim()||n?.rpcUrl?.trim()||n?.rpcUrls?.[t]?.trim(),r=t===u?process.env.OAK_RPC_URL?.trim():t===R?(process.env.OAK_TESTNET_RPC_URL??process.env.OAK_RPC_URL)?.trim():process.env[`OAK_RPC_URL_${t}`]?.trim(),a=i||r||(t===u?g:void 0);if(!a)throw new o(`No RPC URL configured for chain ${t}.`);if((n?.requireKeyedRpc??process.env.NODE_ENV==="production")&&t===u&&a===g)throw new o("Production requires a keyed OAK_RPC_URL.");return a}var U=1e4;async function x(e,t=U){if(!Number.isFinite(t)||t<=0||t>3e4)throw new o("RPC timeout must be greater than zero and at most 30000 ms.");let n=new AbortController,i;try{return await Promise.race([new Promise((r,a)=>{i=setTimeout(()=>{a(new o("The RPC request timed out. Please try again.")),n.abort()},t)}),e(n.signal)])}finally{clearTimeout(i)}}function J(e,t=u,n){let i=typeof e=="object"&&e!==null,r=i?e:n??{},a=typeof e=="string"?e:r.rpcUrl,p=i?r.chainId??t:t;if(!Number.isSafeInteger(p)||p<=0)throw new o("Provide a positive integer chain ID.");if(r.timeoutMs!==void 0&&(!Number.isFinite(r.timeoutMs)||r.timeoutMs<=0||r.timeoutMs>3e4))throw new o("RPC timeout must be greater than zero and at most 30000 ms.");let P=z(a,p,r),w=S(p,P);if(r.transport){let d=r.transport({chain:w,retryCount:0});return A({chain:w,transport:v({request:f=>{if(E.has(f.method)||/^(eth_send|eth_sign|personal_sign|wallet_)/i.test(f.method))throw new o("Read-only RPC client does not allow this method.");return x(()=>d.request(f),r.timeoutMs)}},{retryCount:0})})}let N=r.fetch??globalThis.fetch,L=r.userAgent?.trim()||$,C=r.retries??3,b=r.retryDelayMs??250,_=r.maxRetryDelayMs??3e4,O=1,q=v({async request({method:d,params:f}){return x(async h=>{if(E.has(d)||/^(eth_send|eth_sign|personal_sign|wallet_)/i.test(d))throw new o(`Read-only RPC client does not allow ${d}.`);let k=O++,K=JSON.stringify({jsonrpc:"2.0",id:k,method:d,params:f??[]});for(let c=0;;c++){h.throwIfAborted();let m=await N(P,{method:"POST",redirect:"error",headers:{"content-type":"application/json","user-agent":L},body:K,signal:h});if(m.status===429){let y=b*2**c*(.5+Math.random()),l=Math.max(y,j(m.headers.get("retry-after"),y));if(await m.body?.cancel?.(),c>=C||l>_||l>=(r.timeoutMs??U))throw new o(`The RPC endpoint is busy; retry in ${Math.max(1,Math.ceil(l/1e3))} seconds.`);await T(l,h);continue}if(!m.ok){let y=m.status>=500;if(await m.body?.cancel?.(),!y||c>=C)throw new o(`The RPC endpoint returned HTTP ${m.status}. Please try again.`);await T(Math.min(_,b*2**c*(.5+Math.random())),h);continue}let s;try{s=await m.json()}catch{throw new o("The RPC endpoint returned malformed JSON.")}if(s.error){if(s.error.code===429||/rate limit|too many requests/i.test(s.error.message??"")){if(c>=C)throw new o(`The RPC endpoint is busy; retry in ${Math.max(1,Math.ceil(b*2**c/1e3))} seconds.`);await T(Math.min(_,b*2**c*(.5+Math.random())),h);continue}let l=new Error(D(s.error.message??"RPC error"));throw typeof s.error.code=="number"&&(l.code=s.error.code),s.error.data!==void 0&&(l.data=s.error.data),l}return s.result}},r.timeoutMs)}},{retryCount:0});return A({chain:w,transport:q})}function W(e={}){let t=new Map;return n=>{let i=t.get(n);if(i)return i;let r=J(e.rpcUrls?.[n],n,e);return t.set(n,r),r}}export{g as a,$ as b,H as c,S as d,Q as e,U as f,x as g,J as h,W as i};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as U,l as C,p as X,r as F,t as V}from"./MGEJPRXP.js";import{m as A,n as q}from"./ZKOMJGNH.js";import{a as $}from"./YTHDLCHL.js";import{b as j,e as O,h as z}from"./KFMNCJXJ.js";import{a as y,b as h}from"./S3YSJ7XH.js";import{a as v}from"./LIUXNOLP.js";import{a as P}from"./P7Q6MJZH.js";import{h as g}from"./UL2L7NHO.js";import{a as m,b as f,c as W,d as k,i as w,j as R,k as K,p as B}from"./25EOXUBI.js";import{a as S}from"./B5RZYFQC.js";import{a as c}from"./T5E4OJEU.js";import{a as T,b as H}from"./XN4WDN3O.js";import{getAddress as b,isAddress as D,parseAbi as ie}from"viem";var Y=[{inputs:[],name:"available",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"ethUsdE18",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"liquidityUsdgE6",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"phase",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"priceSigner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"signer",type:"address"}],name:"setPriceSigner",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"spotOakPerEthE18",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"supplyNet",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"syncPhase",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"wallet",type:"address"},{internalType:"uint256",name:"oakPerEthE18",type:"uint256"},{internalType:"uint64",name:"timestamp",type:"uint64"},{internalType:"bytes32",name:"nonce",type:"bytes32"}],internalType:"struct PriceNote",name:"n",type:"tuple"},{internalType:"bytes",name:"sig",type:"bytes"},{internalType:"address",name:"boundWallet",type:"address"}],name:"verifyNote",outputs:[{internalType:"uint256",name:"oakPerEthE18",type:"uint256"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"signer",type:"address"}],name:"PriceSignerSet",type:"event"},{inputs:[],name:"NotReady",type:"error"},{inputs:[],name:"NoteBadSignature",type:"error"},{inputs:[],name:"NoteExpired",type:"error"},{inputs:[],name:"NoteNotYetValid",type:"error"},{inputs:[{internalType:"uint256",name:"spot",type:"uint256"},{internalType:"uint256",name:"note",type:"uint256"}],name:"NoteOutsideGuard",type:"error"},{inputs:[],name:"NoteWrongWallet",type:"error"},{inputs:[{internalType:"address",name:"source",type:"address"}],name:"OracleUnreadable",type:"error"}];var M=300,re="1000000000000000000",J=b(w[m].tokens.USDG.address),Q=b(w[f].deployments.test_USDG.address),_=b(w[m].tokens.WETH.address),I=b(w[f].deployments.test_WETH.address);function Z(n){let e=n.address.toLowerCase();return n.chainId===m?e===J.toLowerCase():n.chainId===f?e===Q.toLowerCase():!1}function ee(n){return n.chainId!==m&&n.chainId!==f?!1:h(n.address)===y}function te(n){let e=n.address.toLowerCase();return n.chainId===m?e===_.toLowerCase():n.chainId===f?e===I.toLowerCase():!1}function ae(n){return ee(n)||te(n)}var se=-887272,oe=887272,de=(1n<<256n)-1n,ce=ie(["function observe(uint32[] secondsAgos) view returns (int56[] tickCumulatives, uint160[] secondsPerLiquidityCumulativeX128s)","function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)"]);function L(n,e){if(typeof n=="bigint")return n;if(typeof n=="number"){if(!Number.isSafeInteger(n))throw new c(`Invalid ${e} timestamp.`);return BigInt(n)}if(typeof n=="string"&&/^-?\d+$/.test(n.trim()))return BigInt(n.trim());throw new c(`Invalid ${e} timestamp.`)}function Pe(n,e=BigInt(Math.floor(Date.now()/1e3)),t=M){try{return p(n,e,t),!0}catch{return!1}}function p(n,e=BigInt(Math.floor(Date.now()/1e3)),t=M){if(!Number.isInteger(t)||t<0)throw new c("Maximum price age must be a non-negative integer.");let a=L(n,"price"),s=L(e,"current");if(a<=0n)throw new c("Price timestamp must be positive.");if(a>s)throw new c("Price timestamp is in the future.");let r=s-a;if(r>BigInt(t))throw new c(`Price is stale: age ${r}s exceeds ${t}s.`);return a.toString()}function ue(n){if(!Number.isInteger(n)||n<se||n>oe)throw new c(`Tick ${n} is outside valid Uniswap bounds.`);let e=BigInt(n<0?-n:n),t=(e&0x1n)!==0n?0xfffcb933bd6fad37aa2d162d1a594001n:0x100000000000000000000000000000000n;return(e&0x2n)!==0n&&(t=t*0xfff97272373d413259a46990580e213an>>128n),(e&0x4n)!==0n&&(t=t*0xfff2e50f5f656932ef12357cf3c7fdccn>>128n),(e&0x8n)!==0n&&(t=t*0xffe5caca7e10e4e61c3624eaa0941cd0n>>128n),(e&0x10n)!==0n&&(t=t*0xffcb9843d60f6159c9db58835c926644n>>128n),(e&0x20n)!==0n&&(t=t*0xff973b41fa98c081472e6896dfb254c0n>>128n),(e&0x40n)!==0n&&(t=t*0xff2ea16466c96a3843ec78b326b52861n>>128n),(e&0x80n)!==0n&&(t=t*0xfe5dee046a99a2a811c461f1969c3053n>>128n),(e&0x100n)!==0n&&(t=t*0xfcbe86c7900a88aedcffc83b479aa3a4n>>128n),(e&0x200n)!==0n&&(t=t*0xf987a7253ac413176f2b074cf7815e54n>>128n),(e&0x400n)!==0n&&(t=t*0xf3392b0822b70005940c7a398e4b70f3n>>128n),(e&0x800n)!==0n&&(t=t*0xe7159475a2c29b7443b29c7fa6e889d9n>>128n),(e&0x1000n)!==0n&&(t=t*0xd097f3bdfd2022b8845ad8f792aa5825n>>128n),(e&0x2000n)!==0n&&(t=t*0xa9f746462d870fdf8a65dc1f90e061e5n>>128n),(e&0x4000n)!==0n&&(t=t*0x70d869a156d2a1b890bb3df62baf32f7n>>128n),(e&0x8000n)!==0n&&(t=t*0x31be135f97d08fd981231505542fcfa6n>>128n),(e&0x10000n)!==0n&&(t=t*0x9aa508b5b7a84e1c677de54f3e99bc9n>>128n),(e&0x20000n)!==0n&&(t=t*0x5d6af8dedb81196699c329225ee604n>>128n),(e&0x40000n)!==0n&&(t=t*0x2216e584f5fa1ea926041bedfe98n>>128n),(e&0x80000n)!==0n&&(t=t*0x48a170391f7dc42444e8fa2n>>128n),n>0&&(t=de/t),(t>>32n)+(t%(1n<<32n)===0n?0n:1n)}async function me(n,e,t){if(typeof n=="object"&&n!==null){let i=n.chainId??e,o=h(n.address)===y?y:b(n.address),d={address:o,symbol:n.symbol,decimals:n.decimals,chainId:i};return Z(d)?{address:o,symbol:"USDG",decimals:k,chainId:i}:ee(d)?{address:y,symbol:"ETH",decimals:18,chainId:i}:te(d)?{address:o,symbol:"WETH",decimals:18,chainId:i}:t.officialStockTokens?z(d,t.officialStockTokens):d}let a=n.trim(),s=a.toUpperCase(),r=a.toLowerCase();if(s==="ETH"||D(a,{strict:!1})&&h(a)===y)return{...j,chainId:e};if(s==="WETH"||e===m&&r===_.toLowerCase()||e===f&&r===I.toLowerCase()){if(e!==m&&e!==f)throw new c(`No canonical WETH address configured for chain ${e}.`);return{address:e===f?I:_,symbol:"WETH",decimals:18,chainId:e}}if(s==="USDG"||e===m&&r===R.toLowerCase()||e===f&&r===K.toLowerCase()){if(e!==m&&e!==f)throw new c(`No canonical USDG address configured for chain ${e}.`);return{address:e===f?Q:J,symbol:"USDG",decimals:k,chainId:e}}if(e===m&&(s==="USDE"||r===O.address.toLowerCase()))return{...O,chainId:e};let u=t.oakTokenAddress??process.env.OAK_TOKEN_ADDRESS;if(s==="OAK"||u&&a.toLowerCase()===u.toLowerCase()){if(!u&&!D(a,{strict:!1}))throw new c("OAK token address is required to price OAK.");return{address:b(u??a),symbol:"OAK",decimals:W,chainId:e}}if(t.officialStockTokens){let i=t.officialStockTokens.find(o=>o.chainId===e&&o.symbol.toUpperCase()===s);if(i)return i;if(D(a,{strict:!1})){let o=b(a),d=t.officialStockTokens.find(l=>l.chainId===e&&l.address.toLowerCase()===o.toLowerCase());if(d)return d}}if(D(a,{strict:!1})){let i=b(a),o=t.client??g(t.rpcUrl,e),[d,l]=await Promise.all([P(o,e,i,"symbol",t.blockNumber),P(o,e,i,"decimals",t.blockNumber)]);return{address:i,symbol:d,decimals:Number(l),chainId:e}}throw new c(`Unknown token ${T(a)}.`)}async function N(n,e,t){if(e)return(await n.readContract({address:e,abi:Y,functionName:"ethUsdE18",blockNumber:t})).toString();let s=(await n.readContract({address:b(B),abi:ce,functionName:"observe",args:[[U,0]],blockNumber:t}))[0];if(!s||s.length<2)throw new c("ETH/USDG pool observation returned insufficient tick cumulatives.");let r=X(s[0],s[1],U),u=ue(r);return F(u)}async function x(n,e,t,a){if(n.timestamp!==void 0)return p(n.timestamp,t(),a);if(e&&typeof e.getBlock=="function"){let r=await v(e,n.blockNumber);return p(r.timestamp,t(),a)}let s=t();return p(s,s,a)}async function ve(n,e={}){let t=e.chainId??m,a=e.maxAgeSeconds??M,s=()=>e.now!==void 0?L(e.now,"current"):BigInt(Math.floor(Date.now()/1e3)),r=await me(n,t,e);if((H(r.symbol)||r.symbol.length>256)&&(r.symbol=T(r.symbol)),e.signedNote||e.priceNote){let i=e.signedNote?e.signedNote.note:e.priceNote,o=p(i.timestamp,s(),a);if(e.spotOakPerEthE18!==void 0&&!A(i.oakPerEthE18,e.spotOakPerEthE18))throw new c("Price note is outside the 50% spot guard band.");let d=e.signedNote?.signature??e.signature,l=e.signedNote?.consumer??e.consumer;if(d&&l){let G=await q({note:i,signature:d,consumer:l,signer:e.signer,now:s(),spotOakPerEthE18:e.spotOakPerEthE18,chainId:t});if(!G.valid)throw new c(G.error??"Price note verification failed.")}let E=e.ethUsdE18!==void 0?e.ethUsdE18.toString():await N(e.client??g(e.rpcUrl,t),e.oracleAddress);return{token:r,usdE18:C(E,i.oakPerEthE18),timestamp:o}}if(e.trades){let i=await x(e,e.client,s,a),o=V(e.trades,{now:s(),windowStart:e.windowStart,windowEnd:e.windowEnd});if(e.spotOakPerEthE18!==void 0&&!A(o,e.spotOakPerEthE18))throw new c("30-minute average is outside the 50% spot guard band.");let d=e.ethUsdE18!==void 0?e.ethUsdE18.toString():await N(e.client??g(e.rpcUrl,t),e.oracleAddress);return{token:r,usdE18:C(d,o),timestamp:i}}if(e.usdE18!==void 0){let i=await x(e,e.client,s,a),o=S(e.usdE18.toString());if(o<=0n)throw new c("USD price must be positive.");return{token:r,usdE18:o.toString(),timestamp:i}}if(e.resolver){let i=await e.resolver(r),o=p(i.timestamp,s(),a),d=S(i.usdE18);if(d<=0n)throw new c("USD price must be positive.");return{token:r,usdE18:d.toString(),timestamp:o}}let u=e.client??g(e.rpcUrl,t);if(Z(r)){let i=await x(e,u,s,a);return{token:r,usdE18:re,timestamp:i}}if(ae(r)){let i=await x(e,u,s,a),o=await N(u,e.oracleAddress,e.blockNumber);return{token:r,usdE18:o,timestamp:i}}if(r.chainId===m)try{let i=await v(u,e.blockNumber),o=p(i.timestamp,s(),a);if(i.number===null)throw new c("Pons reference requires a mined block.");let[d,l]=await Promise.all([$(r,u,i.number),N(u,e.oracleAddress,i.number)]),E=S(l)*d.numerator/d.denominator;if(E<=0n)throw new c("Pons USD reference price must be positive.");return{token:r,usdE18:E.toString(),timestamp:o}}catch{}throw new c(`No fresh on-chain price source available for token ${T(r.symbol)} (${r.address}).`)}export{M as a,re as b,Z as c,ee as d,te as e,ae as f,Pe as g,p as h,ue as i,ve as j};
|
|
1
|
+
import{f as U,l as C,p as X,r as F,t as V}from"./XKZOMGC3.js";import{m as A,n as q}from"./PQHU5A3U.js";import{a as $}from"./F3TOOLFQ.js";import{b as j,e as O,h as z}from"./SXBGOGYQ.js";import{a as y,b as h}from"./Z53DADZ4.js";import{a as v}from"./LIUXNOLP.js";import{a as P}from"./MEZH7RPA.js";import{h as g}from"./R5CBH2CR.js";import{a as m,b as f,c as W,d as k,i as w,j as R,k as K,p as B}from"./5BP72XOA.js";import{a as S}from"./7I6TXFXR.js";import{a as c}from"./Z3FZWNAJ.js";import{a as T,b as H}from"./XN4WDN3O.js";import{getAddress as b,isAddress as D,parseAbi as ie}from"viem";var Y=[{inputs:[],name:"available",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"ethUsdE18",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"liquidityUsdgE6",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"phase",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"priceSigner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"signer",type:"address"}],name:"setPriceSigner",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"spotOakPerEthE18",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"supplyNet",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"syncPhase",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"wallet",type:"address"},{internalType:"uint256",name:"oakPerEthE18",type:"uint256"},{internalType:"uint64",name:"timestamp",type:"uint64"},{internalType:"bytes32",name:"nonce",type:"bytes32"}],internalType:"struct PriceNote",name:"n",type:"tuple"},{internalType:"bytes",name:"sig",type:"bytes"},{internalType:"address",name:"boundWallet",type:"address"}],name:"verifyNote",outputs:[{internalType:"uint256",name:"oakPerEthE18",type:"uint256"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"signer",type:"address"}],name:"PriceSignerSet",type:"event"},{inputs:[],name:"NotReady",type:"error"},{inputs:[],name:"NoteBadSignature",type:"error"},{inputs:[],name:"NoteExpired",type:"error"},{inputs:[],name:"NoteNotYetValid",type:"error"},{inputs:[{internalType:"uint256",name:"spot",type:"uint256"},{internalType:"uint256",name:"note",type:"uint256"}],name:"NoteOutsideGuard",type:"error"},{inputs:[],name:"NoteWrongWallet",type:"error"},{inputs:[{internalType:"address",name:"source",type:"address"}],name:"OracleUnreadable",type:"error"}];var M=300,re="1000000000000000000",J=b(w[m].tokens.USDG.address),Q=b(w[f].deployments.test_USDG.address),_=b(w[m].tokens.WETH.address),I=b(w[f].deployments.test_WETH.address);function Z(n){let e=n.address.toLowerCase();return n.chainId===m?e===J.toLowerCase():n.chainId===f?e===Q.toLowerCase():!1}function ee(n){return n.chainId!==m&&n.chainId!==f?!1:h(n.address)===y}function te(n){let e=n.address.toLowerCase();return n.chainId===m?e===_.toLowerCase():n.chainId===f?e===I.toLowerCase():!1}function ae(n){return ee(n)||te(n)}var se=-887272,oe=887272,de=(1n<<256n)-1n,ce=ie(["function observe(uint32[] secondsAgos) view returns (int56[] tickCumulatives, uint160[] secondsPerLiquidityCumulativeX128s)","function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)"]);function L(n,e){if(typeof n=="bigint")return n;if(typeof n=="number"){if(!Number.isSafeInteger(n))throw new c(`Invalid ${e} timestamp.`);return BigInt(n)}if(typeof n=="string"&&/^-?\d+$/.test(n.trim()))return BigInt(n.trim());throw new c(`Invalid ${e} timestamp.`)}function Pe(n,e=BigInt(Math.floor(Date.now()/1e3)),t=M){try{return p(n,e,t),!0}catch{return!1}}function p(n,e=BigInt(Math.floor(Date.now()/1e3)),t=M){if(!Number.isInteger(t)||t<0)throw new c("Maximum price age must be a non-negative integer.");let a=L(n,"price"),s=L(e,"current");if(a<=0n)throw new c("Price timestamp must be positive.");if(a>s)throw new c("Price timestamp is in the future.");let r=s-a;if(r>BigInt(t))throw new c(`Price is stale: age ${r}s exceeds ${t}s.`);return a.toString()}function ue(n){if(!Number.isInteger(n)||n<se||n>oe)throw new c(`Tick ${n} is outside valid Uniswap bounds.`);let e=BigInt(n<0?-n:n),t=(e&0x1n)!==0n?0xfffcb933bd6fad37aa2d162d1a594001n:0x100000000000000000000000000000000n;return(e&0x2n)!==0n&&(t=t*0xfff97272373d413259a46990580e213an>>128n),(e&0x4n)!==0n&&(t=t*0xfff2e50f5f656932ef12357cf3c7fdccn>>128n),(e&0x8n)!==0n&&(t=t*0xffe5caca7e10e4e61c3624eaa0941cd0n>>128n),(e&0x10n)!==0n&&(t=t*0xffcb9843d60f6159c9db58835c926644n>>128n),(e&0x20n)!==0n&&(t=t*0xff973b41fa98c081472e6896dfb254c0n>>128n),(e&0x40n)!==0n&&(t=t*0xff2ea16466c96a3843ec78b326b52861n>>128n),(e&0x80n)!==0n&&(t=t*0xfe5dee046a99a2a811c461f1969c3053n>>128n),(e&0x100n)!==0n&&(t=t*0xfcbe86c7900a88aedcffc83b479aa3a4n>>128n),(e&0x200n)!==0n&&(t=t*0xf987a7253ac413176f2b074cf7815e54n>>128n),(e&0x400n)!==0n&&(t=t*0xf3392b0822b70005940c7a398e4b70f3n>>128n),(e&0x800n)!==0n&&(t=t*0xe7159475a2c29b7443b29c7fa6e889d9n>>128n),(e&0x1000n)!==0n&&(t=t*0xd097f3bdfd2022b8845ad8f792aa5825n>>128n),(e&0x2000n)!==0n&&(t=t*0xa9f746462d870fdf8a65dc1f90e061e5n>>128n),(e&0x4000n)!==0n&&(t=t*0x70d869a156d2a1b890bb3df62baf32f7n>>128n),(e&0x8000n)!==0n&&(t=t*0x31be135f97d08fd981231505542fcfa6n>>128n),(e&0x10000n)!==0n&&(t=t*0x9aa508b5b7a84e1c677de54f3e99bc9n>>128n),(e&0x20000n)!==0n&&(t=t*0x5d6af8dedb81196699c329225ee604n>>128n),(e&0x40000n)!==0n&&(t=t*0x2216e584f5fa1ea926041bedfe98n>>128n),(e&0x80000n)!==0n&&(t=t*0x48a170391f7dc42444e8fa2n>>128n),n>0&&(t=de/t),(t>>32n)+(t%(1n<<32n)===0n?0n:1n)}async function me(n,e,t){if(typeof n=="object"&&n!==null){let i=n.chainId??e,o=h(n.address)===y?y:b(n.address),d={address:o,symbol:n.symbol,decimals:n.decimals,chainId:i};return Z(d)?{address:o,symbol:"USDG",decimals:k,chainId:i}:ee(d)?{address:y,symbol:"ETH",decimals:18,chainId:i}:te(d)?{address:o,symbol:"WETH",decimals:18,chainId:i}:t.officialStockTokens?z(d,t.officialStockTokens):d}let a=n.trim(),s=a.toUpperCase(),r=a.toLowerCase();if(s==="ETH"||D(a,{strict:!1})&&h(a)===y)return{...j,chainId:e};if(s==="WETH"||e===m&&r===_.toLowerCase()||e===f&&r===I.toLowerCase()){if(e!==m&&e!==f)throw new c(`No canonical WETH address configured for chain ${e}.`);return{address:e===f?I:_,symbol:"WETH",decimals:18,chainId:e}}if(s==="USDG"||e===m&&r===R.toLowerCase()||e===f&&r===K.toLowerCase()){if(e!==m&&e!==f)throw new c(`No canonical USDG address configured for chain ${e}.`);return{address:e===f?Q:J,symbol:"USDG",decimals:k,chainId:e}}if(e===m&&(s==="USDE"||r===O.address.toLowerCase()))return{...O,chainId:e};let u=t.oakTokenAddress??process.env.OAK_TOKEN_ADDRESS;if(s==="OAK"||u&&a.toLowerCase()===u.toLowerCase()){if(!u&&!D(a,{strict:!1}))throw new c("OAK token address is required to price OAK.");return{address:b(u??a),symbol:"OAK",decimals:W,chainId:e}}if(t.officialStockTokens){let i=t.officialStockTokens.find(o=>o.chainId===e&&o.symbol.toUpperCase()===s);if(i)return i;if(D(a,{strict:!1})){let o=b(a),d=t.officialStockTokens.find(l=>l.chainId===e&&l.address.toLowerCase()===o.toLowerCase());if(d)return d}}if(D(a,{strict:!1})){let i=b(a),o=t.client??g(t.rpcUrl,e),[d,l]=await Promise.all([P(o,e,i,"symbol",t.blockNumber),P(o,e,i,"decimals",t.blockNumber)]);return{address:i,symbol:d,decimals:Number(l),chainId:e}}throw new c(`Unknown token ${T(a)}.`)}async function N(n,e,t){if(e)return(await n.readContract({address:e,abi:Y,functionName:"ethUsdE18",blockNumber:t})).toString();let s=(await n.readContract({address:b(B),abi:ce,functionName:"observe",args:[[U,0]],blockNumber:t}))[0];if(!s||s.length<2)throw new c("ETH/USDG pool observation returned insufficient tick cumulatives.");let r=X(s[0],s[1],U),u=ue(r);return F(u)}async function x(n,e,t,a){if(n.timestamp!==void 0)return p(n.timestamp,t(),a);if(e&&typeof e.getBlock=="function"){let r=await v(e,n.blockNumber);return p(r.timestamp,t(),a)}let s=t();return p(s,s,a)}async function ve(n,e={}){let t=e.chainId??m,a=e.maxAgeSeconds??M,s=()=>e.now!==void 0?L(e.now,"current"):BigInt(Math.floor(Date.now()/1e3)),r=await me(n,t,e);if((H(r.symbol)||r.symbol.length>256)&&(r.symbol=T(r.symbol)),e.signedNote||e.priceNote){let i=e.signedNote?e.signedNote.note:e.priceNote,o=p(i.timestamp,s(),a);if(e.spotOakPerEthE18!==void 0&&!A(i.oakPerEthE18,e.spotOakPerEthE18))throw new c("Price note is outside the 50% spot guard band.");let d=e.signedNote?.signature??e.signature,l=e.signedNote?.consumer??e.consumer;if(d&&l){let G=await q({note:i,signature:d,consumer:l,signer:e.signer,now:s(),spotOakPerEthE18:e.spotOakPerEthE18,chainId:t});if(!G.valid)throw new c(G.error??"Price note verification failed.")}let E=e.ethUsdE18!==void 0?e.ethUsdE18.toString():await N(e.client??g(e.rpcUrl,t),e.oracleAddress);return{token:r,usdE18:C(E,i.oakPerEthE18),timestamp:o}}if(e.trades){let i=await x(e,e.client,s,a),o=V(e.trades,{now:s(),windowStart:e.windowStart,windowEnd:e.windowEnd});if(e.spotOakPerEthE18!==void 0&&!A(o,e.spotOakPerEthE18))throw new c("30-minute average is outside the 50% spot guard band.");let d=e.ethUsdE18!==void 0?e.ethUsdE18.toString():await N(e.client??g(e.rpcUrl,t),e.oracleAddress);return{token:r,usdE18:C(d,o),timestamp:i}}if(e.usdE18!==void 0){let i=await x(e,e.client,s,a),o=S(e.usdE18.toString());if(o<=0n)throw new c("USD price must be positive.");return{token:r,usdE18:o.toString(),timestamp:i}}if(e.resolver){let i=await e.resolver(r),o=p(i.timestamp,s(),a),d=S(i.usdE18);if(d<=0n)throw new c("USD price must be positive.");return{token:r,usdE18:d.toString(),timestamp:o}}let u=e.client??g(e.rpcUrl,t);if(Z(r)){let i=await x(e,u,s,a);return{token:r,usdE18:re,timestamp:i}}if(ae(r)){let i=await x(e,u,s,a),o=await N(u,e.oracleAddress,e.blockNumber);return{token:r,usdE18:o,timestamp:i}}if(r.chainId===m)try{let i=await v(u,e.blockNumber),o=p(i.timestamp,s(),a);if(i.number===null)throw new c("Pons reference requires a mined block.");let[d,l]=await Promise.all([$(r,u,i.number),N(u,e.oracleAddress,i.number)]),E=S(l)*d.numerator/d.denominator;if(E<=0n)throw new c("Pons USD reference price must be positive.");return{token:r,usdE18:E.toString(),timestamp:o}}catch{}throw new c(`No fresh on-chain price source available for token ${T(r.symbol)} (${r.address}).`)}export{M as a,re as b,Z as c,ee as d,te as e,ae as f,Pe as g,p as h,ue as i,ve as j};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as me,b as K,o as X}from"./VBV366XQ.js";import{c as ce}from"./ZUAXW2ZD.js";import{a as ue}from"./VZWOWR6G.js";import{a as h,i as de}from"./25EOXUBI.js";import{a as i}from"./T5E4OJEU.js";import{a as ae}from"./XN4WDN3O.js";import{decodeFunctionData as ke,parseAbi as Ae}from"viem";var be="https://api.relay.link",D="0x0000000000000000000000000000000000000000",U=de[h].relay.depository.address.toLowerCase(),Re=Ae(["function depositNative(address depositor, bytes32 id) payable"]),le=30,qe=(1n<<256n)-1n;function Y(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function t(e){if(!Y(e))throw new i("Relay returned an unexpected response.");return e}function R(e){if(!Array.isArray(e))throw new i("Relay returned an unexpected list.");return e}function r(e){if(typeof e!="string")throw new i("Provide a valid wallet or token address.");return ue(e),e.toLowerCase()}function L(e){if(typeof e!="number"||!Number.isSafeInteger(e)||e<=0)throw new i("Provide a positive integer chain ID.");return e}function q(e){if(typeof e!="string"||!/^(0|[1-9]\d*)$/.test(e)||BigInt(e)>qe)throw new i("Amounts must be decimal base-unit strings within the uint256 range.");return e}function pe(e){if(typeof e!="number"||!Number.isSafeInteger(e)||e<=0)throw new i("Relay returned an invalid order or refund deadline. Request a fresh quote.");return e}function B(e){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new i("Provide a valid Relay request or order ID.");return e}function Ce(e){let s=t(e);if(typeof s.symbol!="string"||!s.symbol.trim()||typeof s.decimals!="number"||!Number.isInteger(s.decimals)||s.decimals<0||s.decimals>255)throw new i("Relay returned invalid token metadata.");return{address:r(s.address),chainId:L(s.chainId),decimals:s.decimals,symbol:s.symbol}}function _(e){let s=t(e);return{token:Ce(s.currency),amount:q(s.amount)}}function y(e){if(!e)throw new i("Relay quote does not match the requested amount, chain, recipient, minimum or transaction.")}function fe(e){return e===void 0?[]:R(e).map(B)}function he(e){if(!(e==null||e==="N/A")){if(typeof e!="string")throw new i("Relay returned an invalid failure reason.");return ae(e)}}var Oe=e=>{async function s(o,n){let a=process.env.OAK_RELAY_API_KEY?.trim();if(!a)throw new i("Configure the Relay API key on the server before using Relay.");try{return await ce(e.http,`${be}${o}`,{method:n===void 0?"GET":"POST",headers:{"x-api-key":a,"Content-Type":"application/json","User-Agent":"oak-relay/1.0"},...n===void 0?{}:{body:JSON.stringify(n)}},Y)}catch(m){throw new i(e.plainError(m))}}async function Q(o){let n;try{n=await s(`/intents/status/v3?requestId=${encodeURIComponent(o)}`)}catch(w){if(e.plainError(w)!=="The request timed out. Please try again.")throw w;return{requestId:o,status:"unknown",timedOut:!0,fulfilled:!1,settled:!1,pollAgain:!0,needsAttention:!1,inTxHashes:[],txHashes:[],originChainId:void 0,destinationChainId:void 0,summary:"The status request timed out. Bridge settlement is unknown; poll again."}}if(typeof n.status!="string")throw new i("Relay returned an invalid bridge status.");let a=fe(n.inTxHashes),m=fe(n.txHashes),d=n.originChainId===void 0?void 0:L(n.originChainId),I=n.destinationChainId===void 0?void 0:L(n.destinationChainId),l=he(n.failReason),u=he(n.refundFailReason),b=n.status==="success"&&m.length>0&&I!==void 0,g=n.status==="refund"&&m.length>0&&d!==void 0,p=n.status==="failure"&&u!==void 0,k=["waiting","depositing","pending","submitted","failure","refund","success"].includes(n.status)?n.status==="failure"&&/TIMEOUT|EXPIRED/.test(typeof n.failReason=="string"?n.failReason:"")?"timeout":n.status:"unknown",A=b?"Relay reports destination fulfillment.":g?"Relay reports a refund on the origin chain; the destination was not fulfilled.":p?"The bridge failed and automatic refund is unavailable. Review the request with Relay.":"Bridge settlement is not confirmed. Poll Relay again; an origin receipt alone does not prove destination fulfillment.";return{requestId:o,status:k,relayStatus:n.status,fulfilled:b,settled:b||g,pollAgain:!b&&!g&&!p,needsAttention:p,timedOut:!1,inTxHashes:a,txHashes:m,originChainId:d,destinationChainId:I,failReason:l,refundFailReason:u,...n.updatedAt===void 0?{}:{updatedAt:q(String(n.updatedAt))},summary:A}}async function ye(o,n){let a=r(n),m=r(o.recipient??a),d=L(o.destinationChainId);if(d===h)throw new i("Choose a destination chain other than 4663.");let I=r(o.originCurrency??D);if(I!==D)throw new i("This outbound part supports native ETH deposits. ERC20 deposits require recorded approval evidence.");let l=r(o.destinationCurrency??D),u=q(o.amount);if(u==="0")throw new i("Provide a positive bridge amount.");let b=o.minAmountOut===void 0?void 0:q(o.minAmountOut),g=o.slippageBps??K;if(typeof g!="number")throw new i("Slippage must be an integer from 0 to 9999 bps.");X("0",g);let p=R((await s("/chains")).chains).map(t),C=p.find(c=>c.id===h),k=p.find(c=>c.id===d);if(!C||!k||C.disabled!==!1||k.disabled!==!1||C.depositEnabled!==!0||C.vmType!=="evm"||k.vmType!=="evm")throw new i("Relay does not currently support this outbound chain route.");let A=Math.floor(Date.now()/1e3)+me,w=await s("/quote/v2",{user:a,recipient:m,originChainId:h,destinationChainId:d,originCurrency:I,destinationCurrency:l,amount:u,tradeType:"EXACT_INPUT"}),T=B(w.requestId),x=t(w.details),P=_(x.currencyIn),f=_(x.currencyOut),S={token:f.token,amount:q(t(x.currencyOut).minimumAmount)};if(y(r(x.sender)===a&&r(x.recipient)===m&&P.token.chainId===h&&P.token.address===I&&P.token.decimals===18&&P.amount===u&&f.token.chainId===d&&f.token.address===l&&BigInt(S.amount)>0n&&BigInt(S.amount)<=BigInt(f.amount)),l===D&&y(f.token.decimals===t(k.currency).decimals),b!==void 0){if(S.amount!==b)throw new i("Relay order minimum must exactly match minAmountOut. Request a new quote.")}else if(BigInt(S.amount)<BigInt(X(f.amount,g)))throw new i("Relay order minimum is below the allowed slippage minimum. Request a new quote.");let j=t(t(w.protocol).v2),W=B(j.orderId),z=t(j.orderData),N=t(z.output),F=pe(N.deadline),Z=R(z.inputs).map(t);y(Z.length>0);let V=Z.flatMap(c=>{let E=R(c.refunds).map(t);return y(E.length>0),E.map(re=>{if(r(re.recipient)!==a)throw new i("Relay refund recipient does not match the agent wallet. Request a new quote.");return pe(re.deadline)})}),we=V.reduce((c,E)=>Math.min(c,E),F),G=Math.min(A,we-le),ee=()=>{if(Date.now()/1e3>=G)throw new i("The Relay quote expired or its order/refund deadline leaves too little time to sign and send. Request a fresh bridge quote.")};ee();let v=R(N.payments).map(t),ne=t(t(C.protocol).v2),ge=t(t(k.protocol).v2),H=t(j.paymentDetails);y(N.chainId===ge.chainId&&v.length===1&&R(N.calls).length===0&&r(v[0].recipient)===m&&r(v[0].currency)===l&&q(v[0].minimumAmount)===S.amount&&q(v[0].expectedAmount)===f.amount&&H.chainId===ne.chainId&&r(H.currency)===I&&q(H.amount)===u),y(r(H.depository)===U&&r(ne.depository)===U);let O=R(w.steps).map(t);y(O.length===1&&O[0].kind==="transaction"&&O[0].id==="deposit"&&O[0].requestId===T);let M=R(O[0].items).map(t);y(M.length===1&&M[0].status==="incomplete");let $=t(M[0].data),te=t(M[0].check);if(y(te.method==="GET"&&te.endpoint===`/intents/status/v3?requestId=${T}`&&$.chainId===h&&r($.from)===a&&r($.to)===U&&q($.value)===u),typeof $.data!="string"||!/^0x[0-9a-fA-F]{136}$/.test($.data))throw new i("Relay returned unexpected native deposit calldata.");let ie=ke({abi:Re,data:$.data});y(r(ie.args[0])===a&&ie.args[1].toLowerCase()===W.toLowerCase());let oe=[e.unsignedTx({to:U,data:$.data,value:u,chainId:h,description:`Deposit native ETH for Relay request ${T}.`})],se=t(w.fees);for(let c of Object.values(se))_(c);let J=await e.preview(oe,a);ee();let Ie=J.changes.map(c=>{let E=c.amount.startsWith("-");return`${E?"-":""}${e.formatAmount(E?c.amount.slice(1):c.amount,c.token.decimals)} ${c.token.symbol}`}).join(", ");return{txs:oe,requestId:T,orderId:W,recipient:m,originChainId:h,destinationChainId:d,expiresAt:String(G),orderDeadline:String(F),refundDeadlines:V.map(String),amountIn:P,amountOut:f,minAmountOut:S,fees:se,expandedPriceImpact:x.expandedPriceImpact,timeEstimate:x.timeEstimate,preview:J,summary:`Bridge to ${m} on chain ${d}; asset ${f.token.address} on chain ${f.token.chainId} (${f.token.symbol}); expected ${f.amount}, minimum ${S.amount} base units (${f.token.decimals} decimals). Order deadline ${F} Unix seconds; refund deadlines ${V.join(", ")} Unix seconds; accept before ${G} Unix seconds to reserve ${le}s to sign and send. Origin preview: ${Ie||J.summary}. Relay route fees are included in the quote; origin gas is separate. Poll relay_status with requestId ${T} after local submission; destination fulfillment is not yet confirmed.`}}return{tools:[{name:"relay_bridge_out",inputSchema:{type:"object",required:["destinationChainId","amount"],additionalProperties:!1,properties:{destinationChainId:{type:"integer",minimum:1},amount:{type:"string",pattern:"^[1-9][0-9]*$"},recipient:{type:"string"},originCurrency:{type:"string",const:D},slippageBps:{type:"integer",minimum:0,maximum:9999,default:K},destinationCurrency:{type:"string"},minAmountOut:{type:"string",pattern:"^[0-9]+$"}}},execute:async(o,n)=>{try{return await ye(o,n)}catch(a){throw new i(e.plainError(a))}}},{name:"relay_status",inputSchema:{type:"object",required:["requestId"],additionalProperties:!1,properties:{requestId:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"}}},execute:async o=>Q(B(o.requestId))}],positions:async o=>{let n=r(o),a=new Map,m=new Set,d;do{let I=new URLSearchParams({user:n,originChainId:String(h),limit:"100"});d&&I.set("continuation",d);let l=await s(`/requests/v3?${I}`);for(let u of R(l.requests).map(t)){let b=Y(u.depositAddress)?u.depositAddress.depositor:void 0;if(![u.user,u.sender,b].some(T=>typeof T=="string"&&T.toLowerCase()===n))throw new i("Relay returned a request for another wallet.");let g=B(u.id),p=await Q(g);if(p.settled)continue;let C=t(u.data),k=t(t(C.route).quoted),A=_(t(k.origin).inputCurrency),w=_(t(k.destination).outputCurrency);y(A.token.chainId===h&&w.token.chainId!==h),p.originChainId!==void 0&&y(p.originChainId===A.token.chainId),p.destinationChainId!==void 0&&y(p.destinationChainId===w.token.chainId),a.set(g,{module:"relay",id:g,chainId:h,assets:[A],description:`Relay ${p.status}: ${A.amount} ${A.token.symbol} base units (${A.token.decimals} decimals) toward ${r(u.recipient)} on chain ${w.token.chainId}. ${p.summary}`})}if(l.continuation!==void 0&&l.continuation!==null&&typeof l.continuation!="string")throw new i("Relay returned invalid pagination.");if(d=typeof l.continuation=="string"&&l.continuation?l.continuation:void 0,d){if(m.has(d))throw new i("Relay repeated its pagination cursor. Pending positions are incomplete.");m.add(d)}}while(d);return[...a.values()]}}};export{Oe as a};
|
|
1
|
+
import{a as me,b as K,o as X}from"./XEN45QST.js";import{c as ce}from"./TU3KHOZK.js";import{a as ue}from"./VBWJOG3N.js";import{a as h,i as de}from"./5BP72XOA.js";import{a as i}from"./Z3FZWNAJ.js";import{a as ae}from"./XN4WDN3O.js";import{decodeFunctionData as ke,parseAbi as Ae}from"viem";var be="https://api.relay.link",D="0x0000000000000000000000000000000000000000",U=de[h].relay.depository.address.toLowerCase(),Re=Ae(["function depositNative(address depositor, bytes32 id) payable"]),le=30,qe=(1n<<256n)-1n;function Y(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function t(e){if(!Y(e))throw new i("Relay returned an unexpected response.");return e}function R(e){if(!Array.isArray(e))throw new i("Relay returned an unexpected list.");return e}function r(e){if(typeof e!="string")throw new i("Provide a valid wallet or token address.");return ue(e),e.toLowerCase()}function L(e){if(typeof e!="number"||!Number.isSafeInteger(e)||e<=0)throw new i("Provide a positive integer chain ID.");return e}function q(e){if(typeof e!="string"||!/^(0|[1-9]\d*)$/.test(e)||BigInt(e)>qe)throw new i("Amounts must be decimal base-unit strings within the uint256 range.");return e}function pe(e){if(typeof e!="number"||!Number.isSafeInteger(e)||e<=0)throw new i("Relay returned an invalid order or refund deadline. Request a fresh quote.");return e}function B(e){if(typeof e!="string"||!/^0x[0-9a-fA-F]{64}$/.test(e))throw new i("Provide a valid Relay request or order ID.");return e}function Ce(e){let s=t(e);if(typeof s.symbol!="string"||!s.symbol.trim()||typeof s.decimals!="number"||!Number.isInteger(s.decimals)||s.decimals<0||s.decimals>255)throw new i("Relay returned invalid token metadata.");return{address:r(s.address),chainId:L(s.chainId),decimals:s.decimals,symbol:s.symbol}}function _(e){let s=t(e);return{token:Ce(s.currency),amount:q(s.amount)}}function y(e){if(!e)throw new i("Relay quote does not match the requested amount, chain, recipient, minimum or transaction.")}function fe(e){return e===void 0?[]:R(e).map(B)}function he(e){if(!(e==null||e==="N/A")){if(typeof e!="string")throw new i("Relay returned an invalid failure reason.");return ae(e)}}var Oe=e=>{async function s(o,n){let a=process.env.OAK_RELAY_API_KEY?.trim();if(!a)throw new i("Configure the Relay API key on the server before using Relay.");try{return await ce(e.http,`${be}${o}`,{method:n===void 0?"GET":"POST",headers:{"x-api-key":a,"Content-Type":"application/json","User-Agent":"oak-relay/1.0"},...n===void 0?{}:{body:JSON.stringify(n)}},Y)}catch(m){throw new i(e.plainError(m))}}async function Q(o){let n;try{n=await s(`/intents/status/v3?requestId=${encodeURIComponent(o)}`)}catch(w){if(e.plainError(w)!=="The request timed out. Please try again.")throw w;return{requestId:o,status:"unknown",timedOut:!0,fulfilled:!1,settled:!1,pollAgain:!0,needsAttention:!1,inTxHashes:[],txHashes:[],originChainId:void 0,destinationChainId:void 0,summary:"The status request timed out. Bridge settlement is unknown; poll again."}}if(typeof n.status!="string")throw new i("Relay returned an invalid bridge status.");let a=fe(n.inTxHashes),m=fe(n.txHashes),d=n.originChainId===void 0?void 0:L(n.originChainId),I=n.destinationChainId===void 0?void 0:L(n.destinationChainId),l=he(n.failReason),u=he(n.refundFailReason),b=n.status==="success"&&m.length>0&&I!==void 0,g=n.status==="refund"&&m.length>0&&d!==void 0,p=n.status==="failure"&&u!==void 0,k=["waiting","depositing","pending","submitted","failure","refund","success"].includes(n.status)?n.status==="failure"&&/TIMEOUT|EXPIRED/.test(typeof n.failReason=="string"?n.failReason:"")?"timeout":n.status:"unknown",A=b?"Relay reports destination fulfillment.":g?"Relay reports a refund on the origin chain; the destination was not fulfilled.":p?"The bridge failed and automatic refund is unavailable. Review the request with Relay.":"Bridge settlement is not confirmed. Poll Relay again; an origin receipt alone does not prove destination fulfillment.";return{requestId:o,status:k,relayStatus:n.status,fulfilled:b,settled:b||g,pollAgain:!b&&!g&&!p,needsAttention:p,timedOut:!1,inTxHashes:a,txHashes:m,originChainId:d,destinationChainId:I,failReason:l,refundFailReason:u,...n.updatedAt===void 0?{}:{updatedAt:q(String(n.updatedAt))},summary:A}}async function ye(o,n){let a=r(n),m=r(o.recipient??a),d=L(o.destinationChainId);if(d===h)throw new i("Choose a destination chain other than 4663.");let I=r(o.originCurrency??D);if(I!==D)throw new i("This outbound part supports native ETH deposits. ERC20 deposits require recorded approval evidence.");let l=r(o.destinationCurrency??D),u=q(o.amount);if(u==="0")throw new i("Provide a positive bridge amount.");let b=o.minAmountOut===void 0?void 0:q(o.minAmountOut),g=o.slippageBps??K;if(typeof g!="number")throw new i("Slippage must be an integer from 0 to 9999 bps.");X("0",g);let p=R((await s("/chains")).chains).map(t),C=p.find(c=>c.id===h),k=p.find(c=>c.id===d);if(!C||!k||C.disabled!==!1||k.disabled!==!1||C.depositEnabled!==!0||C.vmType!=="evm"||k.vmType!=="evm")throw new i("Relay does not currently support this outbound chain route.");let A=Math.floor(Date.now()/1e3)+me,w=await s("/quote/v2",{user:a,recipient:m,originChainId:h,destinationChainId:d,originCurrency:I,destinationCurrency:l,amount:u,tradeType:"EXACT_INPUT"}),T=B(w.requestId),x=t(w.details),P=_(x.currencyIn),f=_(x.currencyOut),S={token:f.token,amount:q(t(x.currencyOut).minimumAmount)};if(y(r(x.sender)===a&&r(x.recipient)===m&&P.token.chainId===h&&P.token.address===I&&P.token.decimals===18&&P.amount===u&&f.token.chainId===d&&f.token.address===l&&BigInt(S.amount)>0n&&BigInt(S.amount)<=BigInt(f.amount)),l===D&&y(f.token.decimals===t(k.currency).decimals),b!==void 0){if(S.amount!==b)throw new i("Relay order minimum must exactly match minAmountOut. Request a new quote.")}else if(BigInt(S.amount)<BigInt(X(f.amount,g)))throw new i("Relay order minimum is below the allowed slippage minimum. Request a new quote.");let j=t(t(w.protocol).v2),W=B(j.orderId),z=t(j.orderData),N=t(z.output),F=pe(N.deadline),Z=R(z.inputs).map(t);y(Z.length>0);let V=Z.flatMap(c=>{let E=R(c.refunds).map(t);return y(E.length>0),E.map(re=>{if(r(re.recipient)!==a)throw new i("Relay refund recipient does not match the agent wallet. Request a new quote.");return pe(re.deadline)})}),we=V.reduce((c,E)=>Math.min(c,E),F),G=Math.min(A,we-le),ee=()=>{if(Date.now()/1e3>=G)throw new i("The Relay quote expired or its order/refund deadline leaves too little time to sign and send. Request a fresh bridge quote.")};ee();let v=R(N.payments).map(t),ne=t(t(C.protocol).v2),ge=t(t(k.protocol).v2),H=t(j.paymentDetails);y(N.chainId===ge.chainId&&v.length===1&&R(N.calls).length===0&&r(v[0].recipient)===m&&r(v[0].currency)===l&&q(v[0].minimumAmount)===S.amount&&q(v[0].expectedAmount)===f.amount&&H.chainId===ne.chainId&&r(H.currency)===I&&q(H.amount)===u),y(r(H.depository)===U&&r(ne.depository)===U);let O=R(w.steps).map(t);y(O.length===1&&O[0].kind==="transaction"&&O[0].id==="deposit"&&O[0].requestId===T);let M=R(O[0].items).map(t);y(M.length===1&&M[0].status==="incomplete");let $=t(M[0].data),te=t(M[0].check);if(y(te.method==="GET"&&te.endpoint===`/intents/status/v3?requestId=${T}`&&$.chainId===h&&r($.from)===a&&r($.to)===U&&q($.value)===u),typeof $.data!="string"||!/^0x[0-9a-fA-F]{136}$/.test($.data))throw new i("Relay returned unexpected native deposit calldata.");let ie=ke({abi:Re,data:$.data});y(r(ie.args[0])===a&&ie.args[1].toLowerCase()===W.toLowerCase());let oe=[e.unsignedTx({to:U,data:$.data,value:u,chainId:h,description:`Deposit native ETH for Relay request ${T}.`})],se=t(w.fees);for(let c of Object.values(se))_(c);let J=await e.preview(oe,a);ee();let Ie=J.changes.map(c=>{let E=c.amount.startsWith("-");return`${E?"-":""}${e.formatAmount(E?c.amount.slice(1):c.amount,c.token.decimals)} ${c.token.symbol}`}).join(", ");return{txs:oe,requestId:T,orderId:W,recipient:m,originChainId:h,destinationChainId:d,expiresAt:String(G),orderDeadline:String(F),refundDeadlines:V.map(String),amountIn:P,amountOut:f,minAmountOut:S,fees:se,expandedPriceImpact:x.expandedPriceImpact,timeEstimate:x.timeEstimate,preview:J,summary:`Bridge to ${m} on chain ${d}; asset ${f.token.address} on chain ${f.token.chainId} (${f.token.symbol}); expected ${f.amount}, minimum ${S.amount} base units (${f.token.decimals} decimals). Order deadline ${F} Unix seconds; refund deadlines ${V.join(", ")} Unix seconds; accept before ${G} Unix seconds to reserve ${le}s to sign and send. Origin preview: ${Ie||J.summary}. Relay route fees are included in the quote; origin gas is separate. Poll relay_status with requestId ${T} after local submission; destination fulfillment is not yet confirmed.`}}return{tools:[{name:"relay_bridge_out",inputSchema:{type:"object",required:["destinationChainId","amount"],additionalProperties:!1,properties:{destinationChainId:{type:"integer",minimum:1},amount:{type:"string",pattern:"^[1-9][0-9]*$"},recipient:{type:"string"},originCurrency:{type:"string",const:D},slippageBps:{type:"integer",minimum:0,maximum:9999,default:K},destinationCurrency:{type:"string"},minAmountOut:{type:"string",pattern:"^[0-9]+$"}}},execute:async(o,n)=>{try{return await ye(o,n)}catch(a){throw new i(e.plainError(a))}}},{name:"relay_status",inputSchema:{type:"object",required:["requestId"],additionalProperties:!1,properties:{requestId:{type:"string",pattern:"^0x[0-9a-fA-F]{64}$"}}},execute:async o=>Q(B(o.requestId))}],positions:async o=>{let n=r(o),a=new Map,m=new Set,d;do{let I=new URLSearchParams({user:n,originChainId:String(h),limit:"100"});d&&I.set("continuation",d);let l=await s(`/requests/v3?${I}`);for(let u of R(l.requests).map(t)){let b=Y(u.depositAddress)?u.depositAddress.depositor:void 0;if(![u.user,u.sender,b].some(T=>typeof T=="string"&&T.toLowerCase()===n))throw new i("Relay returned a request for another wallet.");let g=B(u.id),p=await Q(g);if(p.settled)continue;let C=t(u.data),k=t(t(C.route).quoted),A=_(t(k.origin).inputCurrency),w=_(t(k.destination).outputCurrency);y(A.token.chainId===h&&w.token.chainId!==h),p.originChainId!==void 0&&y(p.originChainId===A.token.chainId),p.destinationChainId!==void 0&&y(p.destinationChainId===w.token.chainId),a.set(g,{module:"relay",id:g,chainId:h,assets:[A],description:`Relay ${p.status}: ${A.amount} ${A.token.symbol} base units (${A.token.decimals} decimals) toward ${r(u.recipient)} on chain ${w.token.chainId}. ${p.summary}`})}if(l.continuation!==void 0&&l.continuation!==null&&typeof l.continuation!="string")throw new i("Relay returned invalid pagination.");if(d=typeof l.continuation=="string"&&l.continuation?l.continuation:void 0,d){if(m.has(d))throw new i("Relay repeated its pagination cursor. Pending positions are incomplete.");m.add(d)}}while(d);return[...a.values()]}}};export{Oe as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as ce}from"./6YU3JLQQ.js";import{a as ie}from"./D45AODDL.js";import{a as j}from"./24JYIH53.js";import{a as U,b as P}from"./S3YSJ7XH.js";import{a as F}from"./P7Q6MJZH.js";import{b as ae,c as re}from"./ZUAXW2ZD.js";import{a as H}from"./VZWOWR6G.js";import{a as ne,b as B,c as te}from"./5HCXZWUH.js";import{e as se,g as N,h as oe}from"./UL2L7NHO.js";import{a as T,b as _,c as L,d as Y,i as I,j as ee,t as D}from"./25EOXUBI.js";import{a as h}from"./T5E4OJEU.js";import{a as b,b as K,c as V}from"./XN4WDN3O.js";import{decodeFunctionResult as Se,encodeFunctionData as xe,erc20Abi as W,getAddress as w,isAddress as M,parseAbi as J}from"viem";var he="https://api.robinhood.com/rhj/assets",Oe={address:U,symbol:"ETH",decimals:18,chainId:T},G={address:w(ee),symbol:"USDG",decimals:Y,chainId:T},Z={address:w(I[4663].tokens.WETH.address),symbol:"WETH",decimals:18,chainId:T},pe={address:w(I[4663].meridian.CollateralToken_USDe.address),symbol:"USDe",decimals:18,chainId:T};function $(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function z(e,t=T,s={}){let n=Array.isArray(e)?e:$(e)&&Array.isArray(e.assets)?e.assets:void 0;if(!n)throw new h("Official stock asset list response is malformed.");let a=new Map,r=new Map;if(n.length>1e4)throw new h("Official stock asset list exceeds the lookup limit.");for(let i of n){if(!$(i))continue;let o=i;if(typeof o.tokenSymbol!="string"||!o.tokenSymbol.trim()||!Array.isArray(o.deployments))continue;if(o.deployments.length>100)throw new h("Official stock deployment list exceeds the lookup limit.");let d=o.tokenSymbol.trim();if(!/^[A-Za-z0-9.$_-]{1,32}$/.test(d))throw new h(`Invalid official stock ticker ${b(d)}.`);let k=typeof o.tokenDecimals=="number"&&Number.isInteger(o.tokenDecimals)&&o.tokenDecimals>=0&&o.tokenDecimals<=255?o.tokenDecimals:18;for(let m of o.deployments){if(!$(m))continue;let u=m;if(u.chainId!==t||typeof u.contractAddress!="string"||!M(u.contractAddress,{strict:!1}))continue;let p=w(u.contractAddress),f=p.toLowerCase(),y=d.toUpperCase(),c=r.get(y);if(!s.allowAmbiguousSymbols&&c&&c!==f)throw new h(`Ambiguous official stock ticker ${b(d)} across multiple addresses.`);r.set(y,f),a.set(f,{address:p,symbol:d,decimals:k,chainId:t,...s.includeNames&&typeof o.tokenName=="string"&&o.tokenName.trim()?{name:o.tokenName.trim()}:{}})}}return[...a.values()]}function Ce(e,t){if(typeof e.address!="string"||!M(e.address,{strict:!1}))return!1;let s=e.chainId??T,n=e.address.toLowerCase();return t.some(a=>a.chainId===s&&a.address.toLowerCase()===n&&a.symbol===e.symbol)}function de(e,t){H(e.address);let s=e.chainId??T,n=w(e.address),a=n.toLowerCase(),r=e.symbol.trim().toUpperCase(),i=t.find(d=>d.chainId===s&&d.address.toLowerCase()===a),o=t.find(d=>d.chainId===s&&d.symbol.toUpperCase()===r);if(i){if(e.symbol!==i.symbol)throw new h(`Token at ${n} does not match official stock ticker ${b(i.symbol)} (received ${b(e.symbol)}).`);if(e.decimals!==void 0&&e.decimals!==i.decimals)throw new h(`Token ${b(i.symbol)} at ${n} does not match official decimals ${i.decimals}.`);return i}if(o)throw new h(`Token symbol ${b(e.symbol)} at ${n} does not match the official stock contract address ${o.address}.`);return{address:n,symbol:e.symbol.trim(),decimals:e.decimals??18,chainId:s}}var le=new WeakMap,q=new WeakMap;function R(e,t){return(q.get(e)??N)(t)}async function ye(e){let t=e?.http??ae(),s=e?.url??he,n=e?.chainId??T,a=te(t),r=le.get(a);r||(r=new ne(3e4),le.set(a,r));let{value:i}=await R(t,()=>r.read(`${n}:${s}`,async()=>{let o=await N(d=>re(a,s,{method:"GET",signal:d},k=>$(k)||Array.isArray(k)));return z(o,n,{allowAmbiguousSymbols:!0}),o}));return z(i,n,e)}var ve=J(["function aggregate3((address target, bool allowFailure, bytes callData)[] calls) payable returns ((bool success, bytes returnData)[] returnData)"]);function ue(e){let t=e,s=new Set;for(;t&&typeof t=="object"&&!s.has(t)&&s.size<10;){s.add(t);let n=t;if(n.name==="ContractFunctionZeroDataError"||n.name==="AbiDecodingZeroDataError")return!0;let a=`${typeof n.shortMessage=="string"?n.shortMessage:""} ${typeof n.message=="string"?n.message:""}`;if(/returned no data \("0x"\)|Cannot decode zero data/i.test(a))return!0;t=n.cause}return!1}function De(e){return e instanceof h?/RPC endpoint|too many requests|malformed JSON/i.test(e.message):e instanceof Error?/fetch failed|network|ECONNREFUSED|ETIMEDOUT|HTTP \d{3}|rate limit|too many requests/i.test(e.message):!1}async function Ie(e,t,s){if(typeof e.getCode=="function")try{let n=await e.getCode({address:t});return!n||n==="0x"}catch{return ue(s)}return ue(s)}async function me(e,t,s){if(t.length===0)return[];let n=await Promise.allSettled(t.map(a=>e.readContract({address:a.address,abi:W,functionName:"balanceOf",args:[s]})));if(n.every(a=>a.status==="rejected")&&n[0]?.status==="rejected"&&De(n[0].reason))throw n[0].reason;return n.map(a=>{if(a.status!=="fulfilled"||a.value===void 0||a.value===null)return{ok:!1};try{let r=typeof a.value=="bigint"?a.value:BigInt(a.value);return r>=0n?{ok:!0,amount:r}:{ok:!1}}catch{return{ok:!1}}})}async function Pe(e,t,s,n){if(s.length===0)return[];let a=se(t,e);if(!a)return me(e,s,n);let r=s.map(o=>({target:o.address,allowFailure:!0,callData:xe({abi:W,functionName:"balanceOf",args:[n]})})),i;try{i=await e.readContract({address:a,abi:ve,functionName:"aggregate3",args:[r]})}catch(o){if(await Ie(e,a,o))return me(e,s,n);throw o}if(!Array.isArray(i)||i.length!==s.length)throw new h("Multicall3 aggregate3 returned an invalid result list.");return i.map(o=>{let d=o,k=Array.isArray(d)?d[0]:d?.success,m=Array.isArray(d)?d[1]:d?.returnData;if(!k||typeof m!="string"||m==="0x")return{ok:!1};try{let u=Se({abi:W,functionName:"balanceOf",data:m}),p=typeof u=="bigint"?u:BigInt(u);return p>=0n?{ok:!0,amount:p}:{ok:!1}}catch{return{ok:!1}}})}async function qe(e,t={}){H(e);let s=w(e),n=t.chainId??T,a=t.client??oe(t.rpcUrl,n),r=[];if(t.stockTokens?r=[...t.stockTokens]:t.stockAssetsPayload!==void 0?r=z(t.stockAssetsPayload,n):t.includeStockTokens!==!1&&n!==_&&(r=await ye({http:t.http,url:t.stockAssetsUrl,chainId:n})),t.tokens)for(let f of t.tokens)de(f,r);let i=n===T?[G,Z,pe,...t.oakTokenAddress||process.env.OAK_TOKEN_ADDRESS?[{address:w(t.oakTokenAddress??process.env.OAK_TOKEN_ADDRESS),symbol:"OAK",decimals:L,chainId:n}]:[]]:n===_?[{...G,address:w(D.testnet.usdg),chainId:n},{...Z,address:w(D.testnet.weth),chainId:n},...t.oakTokenAddress?[{address:w(t.oakTokenAddress),symbol:"OAK",decimals:L,chainId:n}]:[]]:[],o=[],d=new Set;for(let f of[...i,...r,...t.tokens??[]]){if(f.chainId!==n||P(f.address)===U)continue;let y=de(f,r),c=y.address.toLowerCase();d.has(c)||(d.add(c),o.push(y))}let[k,m]=await Promise.all([a.getBalance({address:s}),Pe(a,n,o,s)]),u=[],p={address:U,symbol:"ETH",decimals:18,chainId:n};(k>0n||t.includeZero)&&u.push({token:p,amount:k.toString()});for(let f=0;f<o.length;f++){let y=o[f],c=i.some(S=>A(S.address,y.address))||r.some(S=>A(S.address,y.address))?y.symbol:b(y.symbol),l=m[f]??{ok:!1};if(!l.ok){u.push({token:{address:y.address,symbol:c,decimals:y.decimals,chainId:y.chainId},amount:"unavailable"});continue}let g=l.amount;(g>0n||t.includeZero)&&u.push({token:{address:y.address,symbol:c,decimals:y.decimals,chainId:y.chainId},amount:g.toString()})}return u}var A=(e,t)=>e.toLowerCase()===t.toLowerCase(),C=e=>V(e.normalize("NFKC")).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"");function ge(e){let t=e.context.network??"mainnet",{chainId:s,usdg:n,weth:a}=D[t],r=(i,o,d)=>({...i,address:P(w(i.address)),name:o,kind:d,verified:!0,source:"Oak fixed addresses",warnings:[]});return[r({...Oe,chainId:s},"Ether","native"),r({...G,address:n,chainId:s},"Global Dollar","stablecoin"),r({...Z,address:a,chainId:s},"Wrapped Ether","wrapped"),...t==="mainnet"?[r(pe,"USDe","stablecoin")]:[],...e.oakTokenAddress?[r({address:e.oakTokenAddress,symbol:"OAK",decimals:L,chainId:s},"Oak","oak")]:[]]}async function we(e){if(e.context.network==="testnet")return[];let t=await ye({http:e.context.http,includeNames:!0,allowAmbiguousSymbols:!0});return t.filter(s=>Ce(s,t)).map(s=>({...s,name:s.name??s.symbol,kind:"official_stock",verified:!0,source:he,warnings:[]}))}async function X(e,t,s=!0){let{chainId:n}=D[t.context.network??"mainnet"],a=t.context.clientFor(n);if(await a.getChainId()!==n)throw new h(`Token lookup requires Robinhood Chain ${n}.`);let[r,i,o]=await Promise.all([R(a,()=>F(a,n,e,"name")).catch(d=>{if(s)throw d;return""}),R(a,()=>F(a,n,e,"symbol")),R(a,()=>F(a,n,e,"decimals"))]);if(typeof r!="string"||s&&!r.trim()||typeof i!="string"||!i.trim()||!Number.isInteger(o)||o<0||o>255)throw new h("The contract returned invalid token metadata.");return{address:w(e),name:r||i,symbol:i,decimals:o,chainId:n}}async function fe(e,t){let s=await t.context.clientFor(T).readContract({address:I[T].clanker.factory.address,abi:J(["function tokenDeploymentInfo(address) view returns ((address,address,address,address[]))"]),functionName:"tokenDeploymentInfo",args:[e]});return Array.isArray(s)&&s.length===4&&typeof s[0]=="string"&&A(s[0],e)}async function Ee(e,t){let s=t.context.clientFor(T),n=I[T].poolsTrade,a=[n.instantLaunchStrategyFeesOn.address,n.instantLaunchStrategyFeesOff.address],r=J(["event TokenLaunched(bytes32 indexed poolId,address indexed token,address indexed feeSplitter,(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey)"])[0],i=await s.getBlockNumber(),o=new Set,d=0,k=0;for(let m=63127652n;m<=i;m+=10000000n){if(++d>be)throw new h("Token origin scan limit reached.");let u=m+9999999n>i?i:m+9999999n,p=await s.getLogs({address:a,event:r,args:{token:e},fromBlock:m,toBlock:u,strict:!0});for(let f of p){if(f.removed||!a.some(c=>A(c,f.address))||!f.args.token||!A(f.args.token,e)||!f.transactionHash||o.has(f.transactionHash))continue;if(o.add(f.transactionHash),++k>20)throw new h("Token origin receipt limit reached.");let y=await s.getTransactionReceipt({hash:f.transactionHash});if(ce(y).some(c=>A(c.token,e)))return w(y.from)}}}var be=5,_e=100,Le=500,Ne=3e4;function Te(e){let t=Date.now()+Ne,s=0,n=new Map,a=i=>{let o=t-Date.now();if(o<=0)throw new h("Token lookup time budget reached; results are partial.");return N(i,Math.min(1e4,o))},r=B((i,o)=>a(async d=>{let k=await e.context.http(i,{...o,signal:d});return new Proxy(k,{get(m,u){if(u==="json")return()=>a(()=>m.json());let p=Reflect.get(m,u,m);return typeof p=="function"?p.bind(m):p}})}),e.context.http);return q.set(r,a),{...e,context:{...e.context,http:r,clientFor:i=>{if(!n.has(i)){let o=e.context.clientFor(i),d=k=>{if(++s>Le)throw new h("Token lookup RPC budget reached; results are partial.");return a(k)};n.set(i,B(new Proxy(o,{get(k,m){let u=Reflect.get(k,m);return typeof u!="function"?u:(...p)=>d(()=>u.apply(k,p))}}),o)),q.set(n.get(i),d)}return n.get(i)}}}}function ke(e){return e.source==="Oak fixed addresses"?e:{...e,symbol:b(e.symbol),name:b(e.name)}}async function Xe(e,t){if(t=Te(t),typeof e!="string"||e.length>256||!C(e))throw new h("Provide a token name, symbol or address to find_token.");let s=C(e),n=M(e.trim(),{strict:!1})?P(w(e.trim())):void 0,{chainId:a}=D[t.context.network??"mainnet"],r=[],i=ge(t),o=!1;try{i.push(...await we(t))}catch{o=!0,r.push("The official stock list is unavailable; results are partial and stock identities and lookalikes could not be checked.")}let d=c=>n?A(c.address,n):C(c.symbol).includes(s)||C(c.name).includes(s),k=i.filter(d),m=[],u=(c,l)=>[c.symbol,c.name??""].some(g=>[l.symbol,l.name].some(S=>{let x=C(g),O=C(S);return!!x&&!!O&&(x.includes(O)||O.includes(x))})),p=(c,l={})=>{if(m.some(x=>A(x.address,c.address)))return;let g=[`Token ${b(c.symbol)} at ${c.address} is an unverified ${l.launchpad?"launchpad token":"token"}. Use its address, not its name or symbol.`];(K(c.symbol)||K(c.name)||i.some(x=>!A(x.address,c.address)&&u(c,x)))&&g.push(`Lookalike warning: ${b(c.symbol)} at ${c.address} resembles a verified token's name or symbol.`);let S={...c,...l,kind:l.launchpad?"launchpad":"erc20",verified:!1,source:l.launchpad?`${l.launchpad} origin and on-chain metadata; not a verified token`:"On-chain metadata only",warnings:g};m.push(S),r.push(...g)};if(n&&!k.length){let c=await X(n,t),l={};if(a===T){try{await fe(n,t)&&(l.launchpad="clanker")}catch{r.push("Clanker origin lookup was unavailable for this address.")}if(l.launchpad==="clanker")try{let S=(await j(t.context,{q:n,limit:20})).tokens.find(x=>A(x.contract_address,n));S&&(l.creator=w(S.msg_sender),l.creatorSource="Clanker indexer msg_sender")}catch{r.push("Clanker creator lookup is unavailable.")}else try{let g=await ie(t.context,n);l.launchpad="pons",l.creator=w(g.creator),l.creatorSource="Pons factory deployer"}catch{r.push("Pons launch origin could not be confirmed for this address.")}if(!l.launchpad)try{let g=await Ee(n,t);g&&(l.launchpad="pools.trade",l.creator=g,l.creatorSource="Launch transaction sender; may be a relayer")}catch{o=!0,r.push("pools.trade launch receipt lookup is unavailable; origin results are partial.")}}p(c,l)}else if(!n&&a===T){let c=new Set,l=new Set,g,S=0,x=0;try{do{if(++S>be)throw new h("Token search page limit reached.");let O=await j(t.context,{q:e.trim(),limit:20,...g?{cursor:g}:{}});for(let Q of O.tokens){if(++x>_e)throw new h("Token candidate limit reached.");let v=w(Q.contract_address);if(!(l.has(v)||i.some(E=>A(E.address,v)))){l.add(v);try{let E=await X(v,t);if(!d(E))continue;let Ae=await fe(v,t)?{launchpad:"clanker",creator:w(Q.msg_sender),creatorSource:"Clanker indexer msg_sender"}:{};p(E,Ae)}catch{o=!0,r.push(`Could not read Clanker candidate ${v}; it was omitted from these partial results.`)}}}if(O.cursor&&c.has(O.cursor))throw new h("The Clanker indexer repeated a pagination cursor.");O.cursor&&c.add(O.cursor),g=O.cursor??void 0}while(g)}catch{o=!0,r.push("Clanker name search is unavailable, incomplete or reached its scan limit; results are partial.")}r.push("Pons and pools.trade require a token address; name search does not cover those launchpads.")}a===_&&r.push("Testnet lookup covers pinned tokens and explicit token addresses; stock and launchpad discovery are unavailable.");let f=c=>[...new Map(c.map(l=>[l.address.toLowerCase(),l])).values()],y=f([...k,...m]);for(let c of y)if(y.some(l=>!A(l.address,c.address)&&(C(c.symbol)===C(l.symbol)||C(c.name)===C(l.name)))){let l=`Duplicate warning: several tokens share the symbol or name of ${c.address}. Choose the intended address; do not guess from the name.`;c.warnings.push(l),r.push(l)}return k.length>1&&r.push("Several verified tokens match this search, including possible substring matches. Choose an exact address; the search does not select a quote token."),{query:b(e.trim()),chainId:a,partial:o,matches:f(k).map(ke),unverified:f(m).map(ke),warnings:r}}async function Je(e,t){if(typeof e!="string"||!e.trim())throw new h("Provide a token address or verified symbol; use find_token to look it up.");let s=e.trim(),n=M(s,{strict:!1})?P(w(s)):void 0,a=ge(t),r=n&&a.find(u=>A(u.address,n));if(r)return r;let i=[],o=[];try{i=await we(t)}catch{if(!n)throw new h("The official stock list is unavailable; stock identities and symbol ambiguity cannot be checked. Use find_token and retry, or quote an explicit address.");o.push("The official stock list is unavailable; this address is unverified.")}if(n){let u=i.find(f=>A(f.address,n));if(u)return{...u,name:b(u.name)};let p=await X(n,Te(t),!1);return{...p,symbol:b(p.symbol),name:b(p.name),kind:"erc20",verified:!1,source:"On-chain metadata only",warnings:[...o,"This token address is unverified. On-chain names and symbols do not prove identity."]}}let d=s.toUpperCase()==="$OAK"?"OAK":s.toUpperCase(),k=[...a,...i].filter(u=>u.symbol.toUpperCase()===d);if(k.length!==1)throw new h(`Token symbol ${b(s)} is ${k.length?"ambiguous":"unverified"}; use find_token and choose an explicit address.`);let m=k[0];return m.source==="Oak fixed addresses"?m:{...m,name:b(m.name)}}export{he as a,Oe as b,G as c,Z as d,pe as e,z as f,Ce as g,de as h,ye as i,ve as j,qe as k,Xe as l,Je as m};
|
|
1
|
+
import{a as ce}from"./UIJWIFGV.js";import{a as ie}from"./B2LA6VVF.js";import{a as j}from"./NNJLMS7F.js";import{a as U,b as P}from"./Z53DADZ4.js";import{a as F}from"./MEZH7RPA.js";import{b as ae,c as re}from"./TU3KHOZK.js";import{a as H}from"./VBWJOG3N.js";import{a as ne,b as B,c as te}from"./5HCXZWUH.js";import{e as se,g as N,h as oe}from"./R5CBH2CR.js";import{a as T,b as _,c as L,d as Y,i as I,j as ee,t as D}from"./5BP72XOA.js";import{a as h}from"./Z3FZWNAJ.js";import{a as b,b as K,c as V}from"./XN4WDN3O.js";import{decodeFunctionResult as Se,encodeFunctionData as xe,erc20Abi as W,getAddress as w,isAddress as M,parseAbi as J}from"viem";var he="https://api.robinhood.com/rhj/assets",Oe={address:U,symbol:"ETH",decimals:18,chainId:T},G={address:w(ee),symbol:"USDG",decimals:Y,chainId:T},Z={address:w(I[4663].tokens.WETH.address),symbol:"WETH",decimals:18,chainId:T},pe={address:w(I[4663].meridian.CollateralToken_USDe.address),symbol:"USDe",decimals:18,chainId:T};function $(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function z(e,t=T,s={}){let n=Array.isArray(e)?e:$(e)&&Array.isArray(e.assets)?e.assets:void 0;if(!n)throw new h("Official stock asset list response is malformed.");let a=new Map,r=new Map;if(n.length>1e4)throw new h("Official stock asset list exceeds the lookup limit.");for(let i of n){if(!$(i))continue;let o=i;if(typeof o.tokenSymbol!="string"||!o.tokenSymbol.trim()||!Array.isArray(o.deployments))continue;if(o.deployments.length>100)throw new h("Official stock deployment list exceeds the lookup limit.");let d=o.tokenSymbol.trim();if(!/^[A-Za-z0-9.$_-]{1,32}$/.test(d))throw new h(`Invalid official stock ticker ${b(d)}.`);let k=typeof o.tokenDecimals=="number"&&Number.isInteger(o.tokenDecimals)&&o.tokenDecimals>=0&&o.tokenDecimals<=255?o.tokenDecimals:18;for(let m of o.deployments){if(!$(m))continue;let u=m;if(u.chainId!==t||typeof u.contractAddress!="string"||!M(u.contractAddress,{strict:!1}))continue;let p=w(u.contractAddress),f=p.toLowerCase(),y=d.toUpperCase(),c=r.get(y);if(!s.allowAmbiguousSymbols&&c&&c!==f)throw new h(`Ambiguous official stock ticker ${b(d)} across multiple addresses.`);r.set(y,f),a.set(f,{address:p,symbol:d,decimals:k,chainId:t,...s.includeNames&&typeof o.tokenName=="string"&&o.tokenName.trim()?{name:o.tokenName.trim()}:{}})}}return[...a.values()]}function Ce(e,t){if(typeof e.address!="string"||!M(e.address,{strict:!1}))return!1;let s=e.chainId??T,n=e.address.toLowerCase();return t.some(a=>a.chainId===s&&a.address.toLowerCase()===n&&a.symbol===e.symbol)}function de(e,t){H(e.address);let s=e.chainId??T,n=w(e.address),a=n.toLowerCase(),r=e.symbol.trim().toUpperCase(),i=t.find(d=>d.chainId===s&&d.address.toLowerCase()===a),o=t.find(d=>d.chainId===s&&d.symbol.toUpperCase()===r);if(i){if(e.symbol!==i.symbol)throw new h(`Token at ${n} does not match official stock ticker ${b(i.symbol)} (received ${b(e.symbol)}).`);if(e.decimals!==void 0&&e.decimals!==i.decimals)throw new h(`Token ${b(i.symbol)} at ${n} does not match official decimals ${i.decimals}.`);return i}if(o)throw new h(`Token symbol ${b(e.symbol)} at ${n} does not match the official stock contract address ${o.address}.`);return{address:n,symbol:e.symbol.trim(),decimals:e.decimals??18,chainId:s}}var le=new WeakMap,q=new WeakMap;function R(e,t){return(q.get(e)??N)(t)}async function ye(e){let t=e?.http??ae(),s=e?.url??he,n=e?.chainId??T,a=te(t),r=le.get(a);r||(r=new ne(3e4),le.set(a,r));let{value:i}=await R(t,()=>r.read(`${n}:${s}`,async()=>{let o=await N(d=>re(a,s,{method:"GET",signal:d},k=>$(k)||Array.isArray(k)));return z(o,n,{allowAmbiguousSymbols:!0}),o}));return z(i,n,e)}var ve=J(["function aggregate3((address target, bool allowFailure, bytes callData)[] calls) payable returns ((bool success, bytes returnData)[] returnData)"]);function ue(e){let t=e,s=new Set;for(;t&&typeof t=="object"&&!s.has(t)&&s.size<10;){s.add(t);let n=t;if(n.name==="ContractFunctionZeroDataError"||n.name==="AbiDecodingZeroDataError")return!0;let a=`${typeof n.shortMessage=="string"?n.shortMessage:""} ${typeof n.message=="string"?n.message:""}`;if(/returned no data \("0x"\)|Cannot decode zero data/i.test(a))return!0;t=n.cause}return!1}function De(e){return e instanceof h?/RPC endpoint|too many requests|malformed JSON/i.test(e.message):e instanceof Error?/fetch failed|network|ECONNREFUSED|ETIMEDOUT|HTTP \d{3}|rate limit|too many requests/i.test(e.message):!1}async function Ie(e,t,s){if(typeof e.getCode=="function")try{let n=await e.getCode({address:t});return!n||n==="0x"}catch{return ue(s)}return ue(s)}async function me(e,t,s){if(t.length===0)return[];let n=await Promise.allSettled(t.map(a=>e.readContract({address:a.address,abi:W,functionName:"balanceOf",args:[s]})));if(n.every(a=>a.status==="rejected")&&n[0]?.status==="rejected"&&De(n[0].reason))throw n[0].reason;return n.map(a=>{if(a.status!=="fulfilled"||a.value===void 0||a.value===null)return{ok:!1};try{let r=typeof a.value=="bigint"?a.value:BigInt(a.value);return r>=0n?{ok:!0,amount:r}:{ok:!1}}catch{return{ok:!1}}})}async function Pe(e,t,s,n){if(s.length===0)return[];let a=se(t,e);if(!a)return me(e,s,n);let r=s.map(o=>({target:o.address,allowFailure:!0,callData:xe({abi:W,functionName:"balanceOf",args:[n]})})),i;try{i=await e.readContract({address:a,abi:ve,functionName:"aggregate3",args:[r]})}catch(o){if(await Ie(e,a,o))return me(e,s,n);throw o}if(!Array.isArray(i)||i.length!==s.length)throw new h("Multicall3 aggregate3 returned an invalid result list.");return i.map(o=>{let d=o,k=Array.isArray(d)?d[0]:d?.success,m=Array.isArray(d)?d[1]:d?.returnData;if(!k||typeof m!="string"||m==="0x")return{ok:!1};try{let u=Se({abi:W,functionName:"balanceOf",data:m}),p=typeof u=="bigint"?u:BigInt(u);return p>=0n?{ok:!0,amount:p}:{ok:!1}}catch{return{ok:!1}}})}async function qe(e,t={}){H(e);let s=w(e),n=t.chainId??T,a=t.client??oe(t.rpcUrl,n),r=[];if(t.stockTokens?r=[...t.stockTokens]:t.stockAssetsPayload!==void 0?r=z(t.stockAssetsPayload,n):t.includeStockTokens!==!1&&n!==_&&(r=await ye({http:t.http,url:t.stockAssetsUrl,chainId:n})),t.tokens)for(let f of t.tokens)de(f,r);let i=n===T?[G,Z,pe,...t.oakTokenAddress||process.env.OAK_TOKEN_ADDRESS?[{address:w(t.oakTokenAddress??process.env.OAK_TOKEN_ADDRESS),symbol:"OAK",decimals:L,chainId:n}]:[]]:n===_?[{...G,address:w(D.testnet.usdg),chainId:n},{...Z,address:w(D.testnet.weth),chainId:n},...t.oakTokenAddress?[{address:w(t.oakTokenAddress),symbol:"OAK",decimals:L,chainId:n}]:[]]:[],o=[],d=new Set;for(let f of[...i,...r,...t.tokens??[]]){if(f.chainId!==n||P(f.address)===U)continue;let y=de(f,r),c=y.address.toLowerCase();d.has(c)||(d.add(c),o.push(y))}let[k,m]=await Promise.all([a.getBalance({address:s}),Pe(a,n,o,s)]),u=[],p={address:U,symbol:"ETH",decimals:18,chainId:n};(k>0n||t.includeZero)&&u.push({token:p,amount:k.toString()});for(let f=0;f<o.length;f++){let y=o[f],c=i.some(S=>A(S.address,y.address))||r.some(S=>A(S.address,y.address))?y.symbol:b(y.symbol),l=m[f]??{ok:!1};if(!l.ok){u.push({token:{address:y.address,symbol:c,decimals:y.decimals,chainId:y.chainId},amount:"unavailable"});continue}let g=l.amount;(g>0n||t.includeZero)&&u.push({token:{address:y.address,symbol:c,decimals:y.decimals,chainId:y.chainId},amount:g.toString()})}return u}var A=(e,t)=>e.toLowerCase()===t.toLowerCase(),C=e=>V(e.normalize("NFKC")).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"");function ge(e){let t=e.context.network??"mainnet",{chainId:s,usdg:n,weth:a}=D[t],r=(i,o,d)=>({...i,address:P(w(i.address)),name:o,kind:d,verified:!0,source:"Oak fixed addresses",warnings:[]});return[r({...Oe,chainId:s},"Ether","native"),r({...G,address:n,chainId:s},"Global Dollar","stablecoin"),r({...Z,address:a,chainId:s},"Wrapped Ether","wrapped"),...t==="mainnet"?[r(pe,"USDe","stablecoin")]:[],...e.oakTokenAddress?[r({address:e.oakTokenAddress,symbol:"OAK",decimals:L,chainId:s},"Oak","oak")]:[]]}async function we(e){if(e.context.network==="testnet")return[];let t=await ye({http:e.context.http,includeNames:!0,allowAmbiguousSymbols:!0});return t.filter(s=>Ce(s,t)).map(s=>({...s,name:s.name??s.symbol,kind:"official_stock",verified:!0,source:he,warnings:[]}))}async function X(e,t,s=!0){let{chainId:n}=D[t.context.network??"mainnet"],a=t.context.clientFor(n);if(await a.getChainId()!==n)throw new h(`Token lookup requires Robinhood Chain ${n}.`);let[r,i,o]=await Promise.all([R(a,()=>F(a,n,e,"name")).catch(d=>{if(s)throw d;return""}),R(a,()=>F(a,n,e,"symbol")),R(a,()=>F(a,n,e,"decimals"))]);if(typeof r!="string"||s&&!r.trim()||typeof i!="string"||!i.trim()||!Number.isInteger(o)||o<0||o>255)throw new h("The contract returned invalid token metadata.");return{address:w(e),name:r||i,symbol:i,decimals:o,chainId:n}}async function fe(e,t){let s=await t.context.clientFor(T).readContract({address:I[T].clanker.factory.address,abi:J(["function tokenDeploymentInfo(address) view returns ((address,address,address,address[]))"]),functionName:"tokenDeploymentInfo",args:[e]});return Array.isArray(s)&&s.length===4&&typeof s[0]=="string"&&A(s[0],e)}async function Ee(e,t){let s=t.context.clientFor(T),n=I[T].poolsTrade,a=[n.instantLaunchStrategyFeesOn.address,n.instantLaunchStrategyFeesOff.address],r=J(["event TokenLaunched(bytes32 indexed poolId,address indexed token,address indexed feeSplitter,(address currency0,address currency1,uint24 fee,int24 tickSpacing,address hooks) poolKey)"])[0],i=await s.getBlockNumber(),o=new Set,d=0,k=0;for(let m=63127652n;m<=i;m+=10000000n){if(++d>be)throw new h("Token origin scan limit reached.");let u=m+9999999n>i?i:m+9999999n,p=await s.getLogs({address:a,event:r,args:{token:e},fromBlock:m,toBlock:u,strict:!0});for(let f of p){if(f.removed||!a.some(c=>A(c,f.address))||!f.args.token||!A(f.args.token,e)||!f.transactionHash||o.has(f.transactionHash))continue;if(o.add(f.transactionHash),++k>20)throw new h("Token origin receipt limit reached.");let y=await s.getTransactionReceipt({hash:f.transactionHash});if(ce(y).some(c=>A(c.token,e)))return w(y.from)}}}var be=5,_e=100,Le=500,Ne=3e4;function Te(e){let t=Date.now()+Ne,s=0,n=new Map,a=i=>{let o=t-Date.now();if(o<=0)throw new h("Token lookup time budget reached; results are partial.");return N(i,Math.min(1e4,o))},r=B((i,o)=>a(async d=>{let k=await e.context.http(i,{...o,signal:d});return new Proxy(k,{get(m,u){if(u==="json")return()=>a(()=>m.json());let p=Reflect.get(m,u,m);return typeof p=="function"?p.bind(m):p}})}),e.context.http);return q.set(r,a),{...e,context:{...e.context,http:r,clientFor:i=>{if(!n.has(i)){let o=e.context.clientFor(i),d=k=>{if(++s>Le)throw new h("Token lookup RPC budget reached; results are partial.");return a(k)};n.set(i,B(new Proxy(o,{get(k,m){let u=Reflect.get(k,m);return typeof u!="function"?u:(...p)=>d(()=>u.apply(k,p))}}),o)),q.set(n.get(i),d)}return n.get(i)}}}}function ke(e){return e.source==="Oak fixed addresses"?e:{...e,symbol:b(e.symbol),name:b(e.name)}}async function Xe(e,t){if(t=Te(t),typeof e!="string"||e.length>256||!C(e))throw new h("Provide a token name, symbol or address to find_token.");let s=C(e),n=M(e.trim(),{strict:!1})?P(w(e.trim())):void 0,{chainId:a}=D[t.context.network??"mainnet"],r=[],i=ge(t),o=!1;try{i.push(...await we(t))}catch{o=!0,r.push("The official stock list is unavailable; results are partial and stock identities and lookalikes could not be checked.")}let d=c=>n?A(c.address,n):C(c.symbol).includes(s)||C(c.name).includes(s),k=i.filter(d),m=[],u=(c,l)=>[c.symbol,c.name??""].some(g=>[l.symbol,l.name].some(S=>{let x=C(g),O=C(S);return!!x&&!!O&&(x.includes(O)||O.includes(x))})),p=(c,l={})=>{if(m.some(x=>A(x.address,c.address)))return;let g=[`Token ${b(c.symbol)} at ${c.address} is an unverified ${l.launchpad?"launchpad token":"token"}. Use its address, not its name or symbol.`];(K(c.symbol)||K(c.name)||i.some(x=>!A(x.address,c.address)&&u(c,x)))&&g.push(`Lookalike warning: ${b(c.symbol)} at ${c.address} resembles a verified token's name or symbol.`);let S={...c,...l,kind:l.launchpad?"launchpad":"erc20",verified:!1,source:l.launchpad?`${l.launchpad} origin and on-chain metadata; not a verified token`:"On-chain metadata only",warnings:g};m.push(S),r.push(...g)};if(n&&!k.length){let c=await X(n,t),l={};if(a===T){try{await fe(n,t)&&(l.launchpad="clanker")}catch{r.push("Clanker origin lookup was unavailable for this address.")}if(l.launchpad==="clanker")try{let S=(await j(t.context,{q:n,limit:20})).tokens.find(x=>A(x.contract_address,n));S&&(l.creator=w(S.msg_sender),l.creatorSource="Clanker indexer msg_sender")}catch{r.push("Clanker creator lookup is unavailable.")}else try{let g=await ie(t.context,n);l.launchpad="pons",l.creator=w(g.creator),l.creatorSource="Pons factory deployer"}catch{r.push("Pons launch origin could not be confirmed for this address.")}if(!l.launchpad)try{let g=await Ee(n,t);g&&(l.launchpad="pools.trade",l.creator=g,l.creatorSource="Launch transaction sender; may be a relayer")}catch{o=!0,r.push("pools.trade launch receipt lookup is unavailable; origin results are partial.")}}p(c,l)}else if(!n&&a===T){let c=new Set,l=new Set,g,S=0,x=0;try{do{if(++S>be)throw new h("Token search page limit reached.");let O=await j(t.context,{q:e.trim(),limit:20,...g?{cursor:g}:{}});for(let Q of O.tokens){if(++x>_e)throw new h("Token candidate limit reached.");let v=w(Q.contract_address);if(!(l.has(v)||i.some(E=>A(E.address,v)))){l.add(v);try{let E=await X(v,t);if(!d(E))continue;let Ae=await fe(v,t)?{launchpad:"clanker",creator:w(Q.msg_sender),creatorSource:"Clanker indexer msg_sender"}:{};p(E,Ae)}catch{o=!0,r.push(`Could not read Clanker candidate ${v}; it was omitted from these partial results.`)}}}if(O.cursor&&c.has(O.cursor))throw new h("The Clanker indexer repeated a pagination cursor.");O.cursor&&c.add(O.cursor),g=O.cursor??void 0}while(g)}catch{o=!0,r.push("Clanker name search is unavailable, incomplete or reached its scan limit; results are partial.")}r.push("Pons and pools.trade require a token address; name search does not cover those launchpads.")}a===_&&r.push("Testnet lookup covers pinned tokens and explicit token addresses; stock and launchpad discovery are unavailable.");let f=c=>[...new Map(c.map(l=>[l.address.toLowerCase(),l])).values()],y=f([...k,...m]);for(let c of y)if(y.some(l=>!A(l.address,c.address)&&(C(c.symbol)===C(l.symbol)||C(c.name)===C(l.name)))){let l=`Duplicate warning: several tokens share the symbol or name of ${c.address}. Choose the intended address; do not guess from the name.`;c.warnings.push(l),r.push(l)}return k.length>1&&r.push("Several verified tokens match this search, including possible substring matches. Choose an exact address; the search does not select a quote token."),{query:b(e.trim()),chainId:a,partial:o,matches:f(k).map(ke),unverified:f(m).map(ke),warnings:r}}async function Je(e,t){if(typeof e!="string"||!e.trim())throw new h("Provide a token address or verified symbol; use find_token to look it up.");let s=e.trim(),n=M(s,{strict:!1})?P(w(s)):void 0,a=ge(t),r=n&&a.find(u=>A(u.address,n));if(r)return r;let i=[],o=[];try{i=await we(t)}catch{if(!n)throw new h("The official stock list is unavailable; stock identities and symbol ambiguity cannot be checked. Use find_token and retry, or quote an explicit address.");o.push("The official stock list is unavailable; this address is unverified.")}if(n){let u=i.find(f=>A(f.address,n));if(u)return{...u,name:b(u.name)};let p=await X(n,Te(t),!1);return{...p,symbol:b(p.symbol),name:b(p.name),kind:"erc20",verified:!1,source:"On-chain metadata only",warnings:[...o,"This token address is unverified. On-chain names and symbols do not prove identity."]}}let d=s.toUpperCase()==="$OAK"?"OAK":s.toUpperCase(),k=[...a,...i].filter(u=>u.symbol.toUpperCase()===d);if(k.length!==1)throw new h(`Token symbol ${b(s)} is ${k.length?"ambiguous":"unverified"}; use find_token and choose an explicit address.`);let m=k[0];return m.source==="Oak fixed addresses"?m:{...m,name:b(m.name)}}export{he as a,Oe as b,G as c,Z as d,pe as e,z as f,Ce as g,de as h,ye as i,ve as j,qe as k,Xe as l,Je as m};
|