@oracle-agent/oracle 0.35.36 → 0.35.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +3 -2
  2. package/dist/agent-sessions.mjs +71 -8
  3. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  4. package/dist/assets/skills/venue-capability-boundaries/SKILL.md +4 -0
  5. package/dist/bin/desk-server.mjs +36 -36
  6. package/dist/bin/oracle-data-mcp.mjs +17 -17
  7. package/dist/bin/oracle-gateway.mjs +53 -42
  8. package/dist/bin/oracle-public-server.mjs +5 -5
  9. package/dist/bin/oracle-route.mjs +11 -11
  10. package/dist/bin/oracle-telegram-mcp.mjs +4 -4
  11. package/dist/cli/commands/agent-session.mjs +73 -10
  12. package/dist/cli/commands/chat.mjs +238 -231
  13. package/dist/cli/commands/doctor.mjs +2 -2
  14. package/dist/cli/commands/eval.mjs +164 -158
  15. package/dist/cli/commands/farm.mjs +1 -1
  16. package/dist/cli/commands/model.mjs +242 -235
  17. package/dist/cli/commands/quickstart.mjs +1 -1
  18. package/dist/cli/commands/sign.mjs +1 -1
  19. package/dist/cli/commands/signer.mjs +1 -1
  20. package/dist/cli/commands/swap.mjs +24 -24
  21. package/dist/cli/commands/telegram.mjs +3 -3
  22. package/dist/cli/commands/venues.mjs +1 -1
  23. package/dist/data/desk-data.mjs +34 -34
  24. package/dist/data/providers/farming.mjs +1 -1
  25. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  26. package/dist/index.mjs +53 -52
  27. package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
  28. package/dist/local-signer/index.mjs +1 -1
  29. package/dist/local-signer/runtime.mjs +1 -1
  30. package/dist/nft/universal-mint-router.mjs +4 -4
  31. package/dist/notifications/index.mjs +9 -3
  32. package/dist/router/index.mjs +3 -3
  33. package/dist/router/prepare-bridge.mjs +2 -2
  34. package/dist/router/prepare-route.mjs +4 -0
  35. package/dist/teams/index.mjs +5 -3
  36. package/dist/tui/standalone-client.mjs +107 -101
  37. package/package.json +2 -1
  38. package/public/agent-connect/index.html +2 -2
  39. package/public/eval-report.json +95 -95
  40. package/public/oracle-console/index.html +3 -2
  41. package/public/oracle-splash/_variants/ice.html +4 -4
  42. package/public/oracle-splash/_variants/ivory.html +4 -4
  43. package/public/oracle-splash/assets/vendor/gsap-3.13.0.min.js +10 -0
  44. package/public/oracle-splash/assets/vendor/gsap-scrolltrigger-3.13.0.min.js +10 -0
  45. package/public/oracle-splash/assets/vendor/lenis-1.3.11.min.js +1 -0
  46. package/public/oracle-splash/index.html +558 -71
  47. package/server.json +2 -2
@@ -1,2 +1,2 @@
1
1
  import{createHash as lt}from"node:crypto";import{types as M}from"node:util";import V from"node:net";import it from"node:dns";var st=new Set(["localhost","metadata.google.internal","metadata.goog"]);function ee(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let u=c.split(":"),p=u.at(-1);if(p?.includes(".")){let f=p.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;u.splice(u.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return u.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:u.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),s=r(n),l=r(o);if(!s||!l)return null;let d=t.includes("::"),i=8-s.length-l.length;if(!d&&i!==0||d&&i<1)return null;let a=[...s,...Array(Math.max(0,i)).fill(0),...l];return a.length!==8?null:Uint8Array.from(a.flatMap(c=>[c>>8,c&255]))}function ue(e,t,r){let n=Math.floor(r/8),o=r%8;for(let l=0;l<n;l+=1)if(e[l]!==t[l])return!1;if(!o)return!0;let s=255<<8-o;return(e[n]&s)===(t[n]&s)}function de(e){if(V.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(V.isIPv6(e)){let t=ee(e);if(!t)return!1;let r=ee("::ffff:0:0");return ue(t,r,96)?de([...t.slice(12)].join(".")):ue(t,ee("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>ue(t,ee(o),s)):!1}return!1}function at(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(st.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=V.isIP(r);return n!==0&&!de(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function pe(e,{lookupFn:t=it.promises.lookup}={}){let r=at(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:V.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!de(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function fe({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let u=await t();r=u.Agent,n=u.fetch}catch(u){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${u?.message||u}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=u=>String(u).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,l=u=>(Array.isArray(u)?u:[u]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(V.isIPv6(p.address)?6:4)})),d=(u,p,f)=>{s.set(o(u),l(typeof p=="string"?[{address:p,family:f}]:p))},i=u=>{let p=o(u);if(V.isIP(p))return[{address:p,family:V.isIPv6(p)?6:4}];let f=s.get(p);if(!f||!f.length)throw new Error(`refused: unpinned host ${u} during pinned fetch`);return f},a=new r({connect:{lookup(u,p,f){let m;try{m=i(u)}catch(E){return f(E)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),c=ct((u,p={})=>n(u,{...p,dispatcher:a}),d);return{dispatcher:a,fetch:c,pin:d,resolve:i,async close(){try{await a.destroy()}catch{}}}}var me=Symbol.for("oracle.egressGuard.pinCapableFetch");function ct(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[me]=Object.freeze({pin:t}),e}function he(e){return typeof e=="function"&&typeof e[me]?.pin=="function"}function ve(e,t,r){if(!he(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[me].pin(t,r)}var ut=new Set([408,425,429,500,502,503,504]),Pe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),dt=2,Te=4e3,pt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ft=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,mt=AbortSignal.prototype.throwIfAborted,ht=EventTarget.prototype.addEventListener,Oe=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,ye=e=>e?pt.call(e):!1,gt=e=>e?ft.call(e):void 0,wt=new Set([301,302,303,307,308]),re=3,Or=64*1024,$=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function x(e){return U(`HTTP JSON body refused: ${e}`)}function yt(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof M[t]=="function"&&M[t](e))}function bt(e){let t=[],r=0,n=0,o=0,s=0,l=new WeakSet,d=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>$.bytes)throw x("serialized byte limit exceeded");t.push(c)},i=c=>{if(Buffer.byteLength(c,"utf8")>$.bytes)throw x("serialized byte limit exceeded");return JSON.stringify(c)},a=(c,u)=>{if(n+=1,n>$.nodes)throw x("node limit exceeded");if(u>$.depth)throw x("depth limit exceeded");if(c===null){d("null");return}if(typeof c=="string"){d(i(c));return}if(typeof c=="boolean"){d(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw x("non-finite number");d(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw x("unsupported non-JSON value");if(M.isProxy(c))throw x("proxy value");if(yt(c))throw x("unsupported exotic object");if(l.has(c))throw x("cyclic value");l.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw x("symbol-keyed fields are unsupported");if(Array.isArray(c)){let m=Object.getPrototypeOf(c),E=0;for(;m!==null;){if(M.isProxy(m))throw x("proxy array prototype");if(E+=1,E>$.depth)throw x("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(c.length>$.arrayLength)throw x("array length limit exceeded");for(let v=0;v<c.length;v+=1){let R=Object.getOwnPropertyDescriptor(c,String(v));if(!R||!Object.hasOwn(R,"value")||R.enumerable!==!0)throw x("array entries must be dense enumerable own data")}let k=0;for(let v in c){if(s+=1,s>$.fields)throw x("enumeration limit exceeded");if(Object.hasOwn(c,v)&&(k+=1,k>c.length))throw x("named array fields are unsupported")}if(k!==c.length)throw x("array entries must be dense enumerable own data");d("[");for(let v=0;v<c.length;v+=1)v&&d(","),a(Object.getOwnPropertyDescriptor(c,String(v)).value,u+1);d("]");return}let p=Object.getPrototypeOf(c);if(p!==Object.prototype&&p!==null)throw x("non-plain object");let f=[];for(let m in c){if(s+=1,s>$.fields)throw x("enumeration limit exceeded");if(!Object.hasOwn(c,m))continue;if(o+=1,o>$.fields)throw x("field limit exceeded");let E=Object.getOwnPropertyDescriptor(c,m);if(!E||!Object.hasOwn(E,"value")||E.enumerable!==!0)throw x("object fields must be enumerable own data");f.push([m,E.value])}d("{");for(let m=0;m<f.length;m+=1)m&&d(","),d(i(f[m][0])),d(":"),a(f[m][1],u+1);d("}")}finally{l.delete(c)}};return a(e,0),t.join("")}function xt(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(M.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let o=n.toLowerCase();if(r.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(o);let s=Object.getOwnPropertyDescriptor(e,n);if(!s||!Object.hasOwn(s,"value"))throw new TypeError("HTTP headers must contain own data properties");let l=s.value;if(l==null||["object","function","symbol"].includes(typeof l))throw new TypeError("HTTP header values must be scalar");t[n]=String(l)}return t}function Et(){return Object.assign(Object.create(null),{Accept:"application/json"})}function It(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function kt(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var ge=new Map,_e=new WeakMap,Ne=1;function te(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=_e.get(e);return t||(t=Ne,Ne+=1,_e.set(e,t)),`reference:${t}`}var St=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),At=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Re(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?St.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Le(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Re);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Re(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&At.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function vt(e,t,r,n={},o=null){let s=lt("sha256"),l=(i,a)=>{let c=String(a);s.update(String(Buffer.byteLength(i,"utf8"))).update(":").update(i),s.update("=").update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c).update(`
2
- `)};l("method",e),l("url",t),Object.keys(r||{}).map((i,a)=>({name:i.toLowerCase(),order:a,value:String(r[i])})).sort((i,a)=>i.name.localeCompare(a.name)||i.order-a.order).forEach((i,a)=>{l(`header-name-${a}`,i.name),l(`header-value-${a}`,i.value)}),l("body",o??"-");for(let i of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])l(`context-${i}`,n[i]??"-");return s.digest("hex")}function Pt(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Te):Math.min(250*2**e,Te)+Math.floor(Math.random()*100)}var Tt=e=>new Promise(t=>setTimeout(t,e));function U(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function we(e,t,r){return U(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function G(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Ot(e){return e?e.byteLength??e.length??0:0}async function _t(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(G(e),!n))throw we(r,`content-length ${s}`,t);let l=e.body?.getReader?.();if(!l){let u=await e.text(),p=Buffer.byteLength(u,"utf8");if(p>t){if(!n)throw we(r,`body ${p} bytes`,t);return Buffer.from(u,"utf8").subarray(0,t).toString("utf8")}return u}let d=[],i=0,a=!1;try{for(;;){let{value:u,done:p}=await l.read();if(p)break;if(u&&(d.push(Buffer.from(u)),i+=Ot(u),i>t)){a=!0;break}}}finally{if(a)try{await l.cancel()}catch{}try{l.releaseLock?.()}catch{}}if(a&&(typeof o=="function"&&o(),!n))throw we(r,`streamed ${i} bytes`,t);let c=Buffer.concat(d);return(a?c.subarray(0,t):c).toString("utf8")}function Nt(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Rt(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:l,realFetch:d,untrustedUrl:i=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:u,validateResponse:p,signal:f,redirectPolicy:m="follow",maxRedirects:E=re}){let k=new AbortController,v=setTimeout(()=>k.abort(),s),R=f?Oe?Oe([f,k.signal]):f:k.signal,w=null,T=t,K=l?{lookupFn:l}:{};if(i&&!d&&!he(T))throw U(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let W=async(g,{status:S=null}={})=>{let P=await pe(g,K);if(!P.ok)throw U(S==null?`HTTP refused ${g}: ${P.error}`:`HTTP redirect to ${g} ${P.error}`,S==null?{}:{status:S});let B=new URL(g).hostname;if(d){if(w&&(await w.close(),w=null),!w)try{w=await fe({requireUndici:!0,...u?{importUndici:u}:{}})}catch(h){throw U(S==null?`HTTP refused ${g}: ${h?.message||h}`:`HTTP redirect to ${g} refused: ${h?.message||h}`,S==null?{}:{status:S})}w.pin(B,P.addresses),T=w.fetch}else ve(T,B,P.addresses);return P};try{let g=String(e),S=Object.assign(Object.create(null),n||{});i&&await W(g);for(let P=0;P<=E;P+=1){let B=Object.assign(Object.create(null),{method:r,headers:S,body:o,signal:R,redirect:"manual",dispatcher:void 0}),h=await T(g,B);if((m==="error"||E===0)&&h.status>=300&&h.status<400)throw G(h),U(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(wt.has(h.status)){let N=c===!0&&r==="POST"&&[307,308].includes(h.status)&&Le(r,o);if(r!=="GET"&&r!=="HEAD"&&!N){G(h);let I=new Error(`HTTP ${h.status} ${r} ${g} redirected non-idempotent request`);throw I.status=h.status,I}if(P===E)throw G(h),U(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let Se=h.headers?.get?.("location"),L;try{L=It(Se,g)}catch(I){throw G(h),I}let q=!kt(L,g);if(G(h),q&&r==="POST"){let I=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw I.status=h.status,I}if(q&&c){let I=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw I.status=h.status,I.retryable=!1,I}if(q&&(S=Et(S)),i)await W(L,{status:h.status});else if(q){let I=await pe(L,K);if(!I.ok){let b=new Error(`HTTP redirect from ${g} ${I.error}`);throw b.status=h.status,b.retryable=!1,b}d&&I.addresses?.length&&(w||(w=await fe(u?{importUndici:u}:{})),w&&(w.pin(new URL(L).hostname,I.addresses),T=w.fetch))}g=L;continue}if(typeof p=="function")try{await p(h,{url:g})}catch(N){throw G(h),U(N?.message||String(N))}let _=await _t(h,a,{url:g,onOversize:()=>k.abort()}),X=Nt(_);if(!h.ok){let N=new Error(`HTTP ${h.status} ${r} ${g}`);throw N.status=h.status,N.retryAfter=h.headers?.get?.("retry-after")??null,N.body=X??_.slice(0,300),N}return X??_}throw new Error(`HTTP redirect loop for ${e}`)}catch(g){if(k.signal.aborted&&!ye(f)){let S=g&&(typeof g=="object"||typeof g=="function")&&!M.isProxy(g)?g:null,P=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw g}finally{clearTimeout(v),w&&await w.close()}}async function A(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&M.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let b of Object.getOwnPropertyNames(t)){let y=Object.getOwnPropertyDescriptor(t,b);if(!(b==="toJSON"&&y&&Object.hasOwn(y,"value")&&y.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!y||!y.enumerable||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(t==null||!Object.hasOwn(t,b))return;let y=Object.getOwnPropertyDescriptor(t,b);if(!y||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain own data properties");return y.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let s=n("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let l=n("retries");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>10))throw new TypeError("HTTP retries must be a bounded integer");let d=n("redirectPolicy");if(d!==void 0&&d!=="follow"&&d!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let i=n("maxRedirects");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>re))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${re}`);if(d==="error"&&i!==void 0&&i!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=d??"follow",c=a==="error"?0:i??re;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let y=n(b);if(y!==void 0&&typeof y!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let u=n("maxResponseBytes");if(u!==void 0&&(!Number.isInteger(u)||u<1||u>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=n("signal");if(p!==void 0){if(M.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ye(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let y=n(b);if(y!==void 0&&typeof y!="function")throw new TypeError(`HTTP ${b} must be a function`)}let f=n("fetchImpl"),m=f||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let E=s??12e3,k=(o||"GET").toUpperCase(),v=n("headers"),R=xt(v),w=Object.assign(Object.create(null),R);Object.keys(w).some(b=>b.toLowerCase()==="accept")||(w.Accept="application/json");let T=n("body");T!=null&&typeof T!="string"&&(Object.keys(w).find(y=>y.toLowerCase()==="content-type")||(w["Content-Type"]="application/json"),T=bt(T));let K=l??dt,W=n("lookupFn"),g=!f,S=n("untrustedUrl")===!0,P=n("sameOriginRedirectsOnly")===!0,B=n("importUndici"),h=n("validateResponse"),_=p,X=u??null,N=async()=>{let b;for(let y=0;y<=K;y++){_&&mt.call(_);try{return await Rt(e,{fetchImpl:m,method:k,headers:w,body:T,timeoutMs:E,lookupFn:W,realFetch:g,untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:P,importUndici:B,validateResponse:h,signal:_,redirectPolicy:a,maxRedirects:c})}catch(z){b=z;let J=le=>{if(!z||typeof z!="object"&&typeof z!="function"||M.isProxy(z))return;let Y=Object.getOwnPropertyDescriptor(z,le);return Y&&Object.hasOwn(Y,"value")?Y.value:void 0},ce=J("status"),tt=J("oracleTimeout")===!0||J("name")==="AbortError"||J("name")==="TimeoutError"||ye(_),rt=new Set([408,425,429]),nt=J("retryable")===!1?!1:ce!=null?rt.has(ce)||ut.has(ce)&&Pe.has(k):!tt&&Pe.has(k);if(y===K||!nt)throw z;let Ae=Pt(y,J("retryAfter"));_?await new Promise((le,Y)=>{let ot=setTimeout(le,Ae);ht.call(_,"abort",()=>{clearTimeout(ot),Y(gt(_)||new DOMException("Aborted","AbortError"))},{once:!0})}):await Tt(Ae)}}throw b};if(!(n("dedupe")!==!1&&!_&&Le(k,T)))return N();let L=vt(k,e,w,{untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:P,redirectPolicy:a,maxRedirects:c,timeoutMs:E,retries:K,fetchImpl:te(m),realFetch:g,lookupFn:te(W),importUndici:te(B),validateResponse:te(h)},T),q=ge.get(L);if(q)return q;let I=N().finally(()=>ge.delete(L));return ge.set(L,I),I}var Lt="https://yields.llama.fi";async function Ce(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||Lt).replace(/\/$/,""),n=await A(`${r}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(n?.data)?n.data:[];e.chain&&(o=o.filter(l=>String(l.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(l=>String(l.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(l=>!!l.stablecoin==!!e.stablecoin)),o.sort((l,d)=>Number(d.tvlUsd||0)-Number(l.tvlUsd||0));let s=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...n,data:o.slice(0,s)}}var Lr=300*1e3,Cr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{types as De}from"node:util";function Ct(e){if(!e||typeof e!="object"||De.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ne(e,t="provider response",r=0){if(r>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(De.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){let l=Object.getOwnPropertyDescriptor(e,String(s));if(!l||!Object.hasOwn(l,"value"))throw new Error(`${t} arrays must contain dense own data`);o[s]=ne(l.value,t,r+1)}return o}if(!Ct(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} objects must contain own data`);n[o]=ne(s.value,t,r+1)}return n}var Dt="https://api.hyperliquid.xyz/info",$t="https://api.hyperliquid-testnet.xyz/info";function Mt({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?$t:Dt}async function oe(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Mt(t);return ne(await A(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function be(e={}){return oe({type:"allMids"},e)}async function xe(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),oe(t,e)}var Ft=24*365,Bt=8;function F(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ut(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function $e(e={},t={}){let[r,n]=await Promise.all([xe(t),be(t).catch(()=>({}))]),o=r?.[0]?.universe??r?.universe??[],s=Array.isArray(r?.[1])?r[1]:[],d=o.map((i,a)=>{let c=s[a]||{},u=F(c.markPx),p=F(c.prevDayPx),f=F(c.openInterest),m=F(c.funding);return{coin:i.name,index:a,markPx:u,oraclePx:F(c.oraclePx),midPx:F(c.midPx)??F(n?.[i.name]),prevDayPx:p,change24hPct:Ut(u,p),dayNtlVolumeUsd:F(c.dayNtlVlm),premium:F(c.premium),fundingRate:m,fundingRateAprPct:m==null?null:m*(Ft/Bt)*100,openInterestCoin:f,openInterestUsd:f==null||u==null?null:f*u,maxLeverage:i.maxLeverage??null,szDecimals:i.szDecimals??null,isDelisted:!!i.isDelisted}}).filter(i=>!i.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:d.length,markets:d,totals:{openInterestUsd:d.reduce((i,a)=>i+(a.openInterestUsd||0),0),dayNtlVolumeUsd:d.reduce((i,a)=>i+(a.dayNtlVolumeUsd||0),0)}}}var Kr=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para"});var en=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),tn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var sn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"});import{Contract as ln,JsonRpcProvider as un}from"ethers";var fn=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var vn=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Pn=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Tn=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),On=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});var zt="https://indexer.dydx.trade";function Z(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Vt(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function Fe(e=50,t={}){try{let r=await A(`${zt}/v4/perpetualMarkets?limit=${e}`,t);return Vt(r).map(o=>{let s=Z(o?.nextFundingRate),l=Z(o?.oraclePrice),d=Z(o?.openInterest),i=Z(o?.volume24H),a=Z(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:l,oraclePx:l,fundingRate:s,fundingRateAprPct:s==null?null:s*24*365*100,openInterest:d,dayNtlVolumeUsd:i,change24hPct:l&&a!=null?a/l*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:s==null?null:`${(s*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}var Gt="https://dlob.drift.trade",Be="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified.";async function Ue(e={}){try{let r=(await A(`${Gt}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Be,venue:"drift",quality:"FAILED"}:r.map(n=>({symbol:n?.symbol||n?.marketIndex,coin:n?.symbol,oraclePrice:n?.amm?.oraclePrice,markPrice:n?.amm?.markPrice,fundingRate:n?.amm?.lastFundingRate?`${(Number(n.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:n?.amm?.longFunding,short:n?.amm?.shortFunding},volume24h:n?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${Be} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var Kt="https://gateway.prod.vertexprotocol.com/v2",He="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified.";async function je(e={}){try{let r=(await A(`${Kt}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(r)||r.length===0?{error:He,venue:"vertex",quality:"FAILED"}:r.map(n=>({market:n?.market,type:n?.type,oraclePrice:n?.oracle_price_x18?(Number(BigInt(n.oracle_price_x18))/1e18).toFixed(4):null,minSize:n?.min_size,productId:n?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${He} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}import{Interface as Ie,getAddress as Yn,isAddress as Zn}from"ethers";var qe={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Mn=new Map(Object.values(qe).map(e=>[e.chainId,e]));import{Interface as Jt,getAddress as Vn}from"ethers";var Gn=new Jt(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ze=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Ve=Object.freeze({42161:{name:"arbitrum",api:ze[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:ze[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var ro=`0x${"0".repeat(64)}`,no=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),oo=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),io=new Ie(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),so=new Ie(["function getAccountPositions(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getAccountOrders(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getOrder(address dataStore,bytes32 key) view returns (bytes)"]),ao=new Ie(["event EventLog1(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)","event EventLog2(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,bytes32 indexed topic2,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)"]),co=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Wt(e){let t=Number(e??42161),r=Ve[t];if(!r)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Ve).join(", ")})`);return{chainId:t,...r}}function Xt(e,t={}){let r=Wt(e);return(t.baseUrl||r.api).replace(/\/$/,"")}async function Ge(e={},t={}){return A(`${Xt(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var Yt="https://api.aevo.xyz";async function Ke(e={}){try{return(await A(`${Yt}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}var Qt=Number.MAX_SAFE_INTEGER,xo=String(Qt);var er="https://mainnet.zklighter.elliot.ai",tr="https://testnet.zklighter.elliot.ai";function rr(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?tr:er}function ie(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function nr(e){let t=ie(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function Je(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function or(e,t){let r=Array.isArray(e?.funding_rates)?e.funding_rates:[],n=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let l of n){let d=Je(l.market_id);d!=null&&o.set(d,l)}let s=[];for(let l of r){if(String(l.exchange||"")!=="lighter")continue;let d=Je(l.market_id);if(d==null)continue;let i=o.get(d),a=ie(i?.mark_price??i?.index_price),c=ie(l.rate),u=String(l.symbol||i?.symbol||"").trim();!u||c==null||!(a>0)||s.push({coin:u,symbol:u,marketIndex:d,funding:c,markPx:a,openInterest:ie(i?.open_interest)??0,sizeDecimals:Number(i?.supported_size_decimals??i?.size_decimals??4),priceDecimals:Number(i?.supported_price_decimals??i?.price_decimals??2),fundingAprPct:nr(c)})}return s}async function ir(e={}){let t=rr(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,s]=await Promise.all([A(`${t}/api/v1/funding-rates`,n),A(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:s}}catch(o){throw r.abort(o),o}}async function We(e={}){let{funding:t,books:r}=await ir(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:or(t,r)}}var C=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function se(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function H(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function Q({venue:e,coin:t,markPx:r,fundingRateAprPct:n,dayNtlVolumeUsd:o,extra:s={}}){let l=String(t||"").replace(/[-_]/g,"").replace(/USDT$|USDC$|USD$/,"");return Object.freeze({venue:e,coin:l,markPx:se(r),fundingRateAprPct:se(n),dayNtlVolumeUsd:se(o),quality:"LIVE",...s})}async function sr(e,t){try{let r=await t();return r&&r.quality==="FAILED"?H(e,r.error||"FAILED"):r}catch(r){return H(e,r.message||r)}}async function ar(e={}){return{venue:"hl",quality:"LIVE",markets:((await $e({},e)).markets||[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>Q({venue:"hl",coin:n.coin,markPx:n.markPx,fundingRateAprPct:n.fundingRateAprPct,dayNtlVolumeUsd:n.dayNtlVolumeUsd,extra:{openInterestUsd:n.openInterestUsd??null,change24hPct:n.change24hPct??null}}))}}async function cr(e={}){let t=await Fe(50,e);return t?.quality==="FAILED"||t?.error?H("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>Q({venue:"dydx",coin:n.coin,markPx:n.markPx,fundingRateAprPct:n.fundingRateAprPct,dayNtlVolumeUsd:n.dayNtlVolumeUsd}))}}async function lr(e={}){let t=await Ge({chainId:42161},e);return!Array.isArray(t)||t.length===0?H("gmx","gmx tickers empty or not an array"):{venue:"gmx",quality:"LIVE",markets:t.map(n=>{let o=n.tokenSymbol||n.symbol||n.tokenAddress||"",s=se(n.fundingRate??n.funding??n.borrowingRateLong);return Q({venue:"gmx",coin:o,markPx:n.maxPrice??n.minPrice??n.price,fundingRateAprPct:s==null?null:Math.abs(s)<1?s*24*365*100:s,dayNtlVolumeUsd:null,extra:{quality:s==null?"PARTIAL":"LIVE",note:s==null?"price live; funding not on ticker":void 0}})}).filter(n=>n.coin)}}async function ur(e={}){let t=await Ue(e);return t?.quality==="FAILED"||t?.error?H("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function dr(e={}){let t=await je(e);return t?.quality==="FAILED"||t?.error?H("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function pr(e={}){let t=await We(e);return t?.error?H("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(n=>Q({venue:"lighter",coin:n.coin||n.symbol,markPx:n.markPx,fundingRateAprPct:n.fundingAprPct,dayNtlVolumeUsd:null,extra:{marketIndex:n.marketIndex??null}})).filter(n=>n.coin&&n.fundingRateAprPct!=null)}}async function fr(e={}){let t=await Ke(e);return t?.error?H("aevo",t.error):{venue:"aevo",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(n=>String(n.type||"").toLowerCase()==="perpetual"&&n.instrument).map(n=>{let o=String(n.instrument).split("-")[0],s=n.fundingRate==null?null:Number(String(n.fundingRate).replace("%",""));return Q({venue:"aevo",coin:o,markPx:n.markPrice,fundingRateAprPct:Number.isFinite(s)?s*24*365:null,dayNtlVolumeUsd:n.volume24h})}).filter(n=>n.coin&&n.fundingRateAprPct!=null)}}var ke={hl:ar,lighter:pr,gmx:lr,dydx:cr,aevo:fr,drift:ur,vertex:dr};async function Xe(e={},t={}){let r=Array.isArray(e.venues)&&e.venues.length?e.venues.map(a=>String(a).toLowerCase()).filter(a=>ke[a]):[...C],n=e.coin?String(e.coin).toUpperCase().replace(/[-_]/g,""):null,o=Math.max(1,Math.min(Number(e.limit)||25,100)),s=t.readers||ke,l=await Promise.all(r.map(a=>sr(a,()=>(s[a]||ke[a])(t)))),d=l.filter(a=>a.quality==="FAILED"),i=l.filter(a=>a.quality!=="FAILED").flatMap(a=>a.markets||[]).filter(a=>a.fundingRateAprPct!=null);return n&&(i=i.filter(a=>a.coin===n)),i.sort((a,c)=>Math.abs(c.fundingRateAprPct)-Math.abs(a.fundingRateAprPct)),Object.freeze({provider:"perp-universal",asOf:new Date().toISOString(),rankedOn:"abs-apr",ranked:i.slice(0,o),failed:d,venuesTried:r,sourcesAnswered:l.filter(a=>a.quality!=="FAILED").length,sourcesTried:r.length,custody:"prepare-only"})}var mr=Object.freeze([{id:"stable-loop",label:"Stablecoin loop",risk:"Conservative",targetDelta:"0.00",setup:"Supply USDC, borrow a second major stable, redeposit inside the same protocol or campaign.",exposure:"Borrow APR spike, depeg, collateral-factor change, protocol cap change.",hedge:"No perp hedge by default. Cap leverage, diversify stables, and keep unwind triggers explicit.",monitor:"Borrow APR, utilization, oracle health, depeg distance, reward dilution.",exit:"Unwind if borrow APR exceeds reward-adjusted APR or any stable trades outside the defined band."},{id:"collateral-hedge",label:"Collateral plus perp hedge",risk:"Balanced",targetDelta:"~0.00",setup:"Supply a volatile asset as collateral, borrow stables, and short the collateral notional on a liquid perp venue.",exposure:"Liquidation risk, funding cost, hedge slippage, borrow APR drift.",hedge:"Short collateral notional on a liquid perp venue; rebalance when delta drifts past the band.",monitor:"Health factor, funding, mark price, borrow APR, hedge margin.",exit:"Cut when funding turns persistently negative against the position or health factor nears the floor."},{id:"lp-hedge",label:"LP incentive hedge",risk:"Aggressive",targetDelta:"range-dependent",setup:"Provide concentrated liquidity for incentives and short the estimated volatile-token delta.",exposure:"Impermanent loss, range breaks, reward dilution, exit slippage.",hedge:"Short the estimated volatile-token delta and recompute after material price or range moves.",monitor:"Position delta, range utilization, fee APR, rewards, funding, exit slippage.",exit:"Withdraw when incentives dilute, liquidity caps fill, or expected reward no longer beats IL plus opportunity cost."},{id:"quest-farming",label:"Testnet and quest farming",risk:"Conservative",targetDelta:"n/a",setup:"Complete real protocol tasks with consistent, genuine usage from wallets you actually control.",exposure:"Eligibility rules change, sybil filters, unpaid effort, opportunity cost.",hedge:"No financial hedge. Diversify across campaigns so no single ruleset dominates the outcome.",monitor:"Campaign rules, snapshot windows, task eligibility evidence, wallet hygiene.",exit:"Stop once snapshot risk rises, campaign rules change, or the probability-adjusted expected value turns negative."},{id:"liquidity-usage",label:"Liquidity and route usage",risk:"Balanced",targetDelta:"varies",setup:"Route genuine volume and provide liquidity where usage is a stated eligibility signal.",exposure:"IL, slippage, gas burn, bridge fees, lockup discount.",hedge:"Size positions so IL and fees stay inside the modelled reward, and hedge volatile legs when material.",monitor:"Volume attribution, fee drag, reward accrual, lockup terms.",exit:"Withdraw when incentives dilute or expected reward no longer beats IL plus opportunity cost."},{id:"governance-usage",label:"Governance and ecosystem usage",risk:"Conservative",targetDelta:"n/a",setup:"Participate in governance and ecosystem surfaces where real contribution is the eligibility signal.",exposure:"Vanity activity with no eligibility weight, lock-up of governance assets.",hedge:"No financial hedge. Weight effort toward actions with documented eligibility evidence.",monitor:"Proposal participation, delegation terms, lock durations, published criteria.",exit:"Stop contributing effort once criteria change or the probability-adjusted value turns negative."}]),hr={"stable-loop":"No default perp hedge. Bound leverage and monitor depeg plus borrow APR.","collateral-hedge":"Short the collateral notional on a liquid perp venue and rebalance when delta drifts.","lp-hedge":"Short the estimated volatile-token delta and recompute after material price or range moves."},gr={"stable-loop":"Borrow APR, utilization, stable peg, reward dilution, health factor.","collateral-hedge":"Health factor, funding, mark price, borrow APR, hedge margin.","lp-hedge":"Position delta, range utilization, fee APR, rewards, funding, exit slippage."},wr={"stable-loop":["Prepare supply for the stable collateral leg.","Prepare borrow only after health factor and borrow APR pass the method limits.","Prepare redeposit or unwind steps as separate wallet-signed actions."],"collateral-hedge":["Prepare collateral supply after sizing liquidation buffer.","Prepare stable borrow if borrow APR remains inside the method limit.","Open or adjust the perp short on the selected hedge venue, then record hedge size."],"lp-hedge":["Prepare LP add only after checking pool depth, range, and expected position delta.","Short the estimated volatile-token delta on the selected hedge venue.","Prepare LP remove if the range breaks or net APR turns negative."]};function j(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function O(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function Ze(e){let t=O(e.symbol,"").toUpperCase(),r=O(e.exposure,"").toLowerCase(),n=j(e.apy)??0,o=j(e.tvlUsd)??0;return n<=0||o<=0?null:e.stablecoin===!0?"stable-loop":t.includes("-")||r.includes("multi")?"lp-hedge":/ETH|BTC|SOL|HYPE|BNB|AVAX|MATIC|OP|ARB/.test(t)?"collateral-hedge":null}function Qe(e,t){let r=j(e.tvlUsd)??0,n=O(e.ilRisk,"").toLowerCase(),o=O(e.predictions?.predictedClass,"").toLowerCase(),s=t==="stable-loop"?3:t==="collateral-hedge"?6:9;return r<1e6?s+=6:r<1e7&&(s+=3),(n.includes("yes")||n.includes("high"))&&(s+=3),o.includes("down")&&(s+=2),Math.min(35,Math.max(0,s))}function et(e){let t=Ze(e);if(!t)return null;let r=j(e.apy)??0,n=j(e.apyBase)??0,o=Math.max(0,j(e.apyReward)??Math.max(0,r-n)),s=Math.max(0,j(e.tvlUsd)??0),l=Qe(e,t),d=t==="stable-loop"?4:t==="collateral-hedge"?6:0,i=t==="stable-loop"?0:t==="collateral-hedge"?4:5,a=s<5e6?1.2:.5,c=r-d-i-a-l,u=c<1?"Avoid":r>80||s<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",p=O(e.project),f=O(e.symbol),m=O(e.chain);return{id:O(e.pool,`${m}:${p}:${f}`),recipe:t,label:`${p} ${f}`,chain:m,project:p,symbol:f,tvlUsd:s,rewardApr:o,nativeApr:n,estimatedBorrowApr:d,estimatedFundingApr:i,gasApr:a,riskHaircut:l,netApr:c,verdict:u,exposure:O(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:hr[t],monitor:gr[t],prepareSteps:[`Verify ${p} contracts and reward terms on ${m}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...wr[t]],source:"DeFiLlama yields"}}async function yr(e={},t={}){let r=Math.min(24,Math.max(3,Number(e.limit??12)||12)),n=Number(e.minTvl??2e6),o=new Date().toISOString(),s="read-only discovery and prepare-plan design; no signing or broadcast";try{let l=await Ce({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),d=Array.isArray(l?.data)?l.data:[],i=d.map(et).filter(a=>a!==null).filter(a=>a.tvlUsd>=n).filter(a=>a.rewardApr+a.nativeApr<=300).sort((a,c)=>c.netApr-a.netApr||c.tvlUsd-a.tvlUsd).slice(0,r);return{configured:!0,live:!0,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:d.length,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",candidates:i,posture:s}}catch(l){return{configured:!1,live:!1,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:0,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",error:String(l?.message||l),candidates:[],posture:s}}}var Ye=300,br="Read-only gross funding snapshot for hold-spot/short-perp review; not validated historical regime evidence, not net yield, and no costs are inferred.";function ae(e){return e==null||e===""?null:j(e)}function xr(e){let t=ae(e?.fundingRateAprPct),r=O(e?.coin,"");if(!r||t==null||t<=0)return null;let n=Math.abs(t)>Ye;return Object.freeze({id:`${O(e?.venue)}:${r}`,venue:O(e?.venue),coin:r,markPx:ae(e?.markPx),fundingAprPct:t,dayNtlVolumeUsd:ae(e?.dayNtlVolumeUsd),openInterestUsd:ae(e?.openInterestUsd),quality:O(e?.quality,"UNKNOWN"),strategy:"hold-spot-short-perp",anomaly:n,anomalyReason:n?`absolute annualized funding snapshot exceeds ${Ye}%`:null,verdict:n?"outlier":"watch"})}async function Er(e={},t={}){let r=Number(e.limit??e.perVenueLimit??3),n=Number.isFinite(r)?Math.min(5,Math.max(1,Math.trunc(r))):3,o=await Promise.all(C.map(async i=>{try{return await Xe({venues:[i],coin:e.coin||void 0,limit:100},t)}catch(a){return{asOf:new Date().toISOString(),ranked:[],failed:[{venue:i,quality:"FAILED",error:String(a?.message||a||"unavailable").slice(0,240),markets:[]}],sourcesAnswered:0}}})),s=new Map(C.map(i=>[i,[]]));for(let i=0;i<C.length;i+=1){let a=C[i],c=(o[i]?.ranked||[]).map(xr).filter(u=>u!==null).sort((u,p)=>p.fundingAprPct-u.fundingAprPct).slice(0,n);s.set(a,c)}let l=[];for(let i=0;i<n;i+=1)for(let a of C){let c=s.get(a)?.[i];c&&l.push(c)}let d=C.map((i,a)=>{let c=o[a],u=(c?.failed||[]).find(f=>f.venue===i),p=u?"FAILED":c?.sourcesAnswered===1?"LIVE":"UNKNOWN";return Object.freeze({venue:i,quality:p,candidatesReturned:s.get(i)?.length||0,error:u?.error||null})});return Object.freeze({source:"perp-universal fundingAll",asOf:new Date().toISOString(),rankedOn:"positive-gross-funding-apr-desc-per-venue-round-robin",venuesTried:[...C],venueStatuses:d,sourcesAnswered:o.reduce((i,a)=>i+(a?.sourcesAnswered||0),0),sourcesTried:C.length,candidates:l,failed:o.flatMap(i=>i?.failed||[]),posture:br})}function D(e,t,r,n){let o=typeof e=="number"?e:Number(e);return Number.isFinite(o)?Math.min(n,Math.max(r,o)):t}function Ir(e={}){let t=D(e.wallets,5,1,500),r=D(e.tasksWeekly,6,0,500),n=D(e.hoursWeekly,4,0,168),o=D(e.hourlyCost,25,0,1e4),s=D(e.gasPerTask,.4,0,1e4),l=D(e.bridgeMonthly,12,0,1e5),d=D(e.expectedReward,900,0,1e7),i=D(e.probability,22,0,100)/100,a=D(e.sybilHaircut,25,0,100)/100,c=D(e.lockupMonths,6,0,120),u=r*t*4.33,p=u*s,f=n*4.33*o,m=p+f+l,E=Math.max(0,1-c*.015),k=t*d*i,v=k*(1-a)*E,R=v-m,w=m>0?R/m*100:null,T=t*d>0?m/(t*d*(1-a)*(E||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:s,bridgeMonthly:l,expectedReward:d,probabilityPct:i*100,sybilHaircutPct:a*100,lockupMonths:c},monthlyTasks:u,monthlyGas:p,laborMonthly:f,monthlyCost:m,lockupDiscount:E,grossExpectedValue:k,adjustedExpectedValue:v,netExpectedValue:R,roiPct:w,breakevenProbabilityPct:T,verdict:R>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var Vo={FARMING_METHODS:mr,discoverFarms:yr,discoverCarry:Er,scorePool:et,classifyPool:Ze,riskHaircut:Qe,airdropEV:Ir};export{mr as FARMING_METHODS,Ir as airdropEV,Ze as classifyPool,Vo as default,Er as discoverCarry,yr as discoverFarms,Qe as riskHaircut,et as scorePool};
2
+ `)};l("method",e),l("url",t),Object.keys(r||{}).map((i,a)=>({name:i.toLowerCase(),order:a,value:String(r[i])})).sort((i,a)=>i.name.localeCompare(a.name)||i.order-a.order).forEach((i,a)=>{l(`header-name-${a}`,i.name),l(`header-value-${a}`,i.value)}),l("body",o??"-");for(let i of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])l(`context-${i}`,n[i]??"-");return s.digest("hex")}function Pt(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Te):Math.min(250*2**e,Te)+Math.floor(Math.random()*100)}var Tt=e=>new Promise(t=>setTimeout(t,e));function U(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function we(e,t,r){return U(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function G(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Ot(e){return e?e.byteLength??e.length??0:0}async function _t(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let s=Number(e.headers?.get?.("content-length"));if(Number.isFinite(s)&&s>t&&(G(e),!n))throw we(r,`content-length ${s}`,t);let l=e.body?.getReader?.();if(!l){let u=await e.text(),p=Buffer.byteLength(u,"utf8");if(p>t){if(!n)throw we(r,`body ${p} bytes`,t);return Buffer.from(u,"utf8").subarray(0,t).toString("utf8")}return u}let d=[],i=0,a=!1;try{for(;;){let{value:u,done:p}=await l.read();if(p)break;if(u&&(d.push(Buffer.from(u)),i+=Ot(u),i>t)){a=!0;break}}}finally{if(a)try{await l.cancel()}catch{}try{l.releaseLock?.()}catch{}}if(a&&(typeof o=="function"&&o(),!n))throw we(r,`streamed ${i} bytes`,t);let c=Buffer.concat(d);return(a?c.subarray(0,t):c).toString("utf8")}function Nt(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Rt(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:l,realFetch:d,untrustedUrl:i=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:u,validateResponse:p,signal:f,redirectPolicy:m="follow",maxRedirects:E=re}){let k=new AbortController,v=setTimeout(()=>k.abort(),s),R=f?Oe?Oe([f,k.signal]):f:k.signal,w=null,T=t,K=l?{lookupFn:l}:{};if(i&&!d&&!he(T))throw U(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let W=async(g,{status:S=null}={})=>{let P=await pe(g,K);if(!P.ok)throw U(S==null?`HTTP refused ${g}: ${P.error}`:`HTTP redirect to ${g} ${P.error}`,S==null?{}:{status:S});let B=new URL(g).hostname;if(d){if(w&&(await w.close(),w=null),!w)try{w=await fe({requireUndici:!0,...u?{importUndici:u}:{}})}catch(h){throw U(S==null?`HTTP refused ${g}: ${h?.message||h}`:`HTTP redirect to ${g} refused: ${h?.message||h}`,S==null?{}:{status:S})}w.pin(B,P.addresses),T=w.fetch}else ve(T,B,P.addresses);return P};try{let g=String(e),S=Object.assign(Object.create(null),n||{});i&&await W(g);for(let P=0;P<=E;P+=1){let B=Object.assign(Object.create(null),{method:r,headers:S,body:o,signal:R,redirect:"manual",dispatcher:void 0}),h=await T(g,B);if((m==="error"||E===0)&&h.status>=300&&h.status<400)throw G(h),U(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(wt.has(h.status)){let N=c===!0&&r==="POST"&&[307,308].includes(h.status)&&Le(r,o);if(r!=="GET"&&r!=="HEAD"&&!N){G(h);let I=new Error(`HTTP ${h.status} ${r} ${g} redirected non-idempotent request`);throw I.status=h.status,I}if(P===E)throw G(h),U(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let Se=h.headers?.get?.("location"),L;try{L=It(Se,g)}catch(I){throw G(h),I}let q=!kt(L,g);if(G(h),q&&r==="POST"){let I=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw I.status=h.status,I}if(q&&c){let I=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw I.status=h.status,I.retryable=!1,I}if(q&&(S=Et(S)),i)await W(L,{status:h.status});else if(q){let I=await pe(L,K);if(!I.ok){let b=new Error(`HTTP redirect from ${g} ${I.error}`);throw b.status=h.status,b.retryable=!1,b}d&&I.addresses?.length&&(w||(w=await fe(u?{importUndici:u}:{})),w&&(w.pin(new URL(L).hostname,I.addresses),T=w.fetch))}g=L;continue}if(typeof p=="function")try{await p(h,{url:g})}catch(N){throw G(h),U(N?.message||String(N))}let _=await _t(h,a,{url:g,onOversize:()=>k.abort()}),X=Nt(_);if(!h.ok){let N=new Error(`HTTP ${h.status} ${r} ${g}`);throw N.status=h.status,N.retryAfter=h.headers?.get?.("retry-after")??null,N.body=X??_.slice(0,300),N}return X??_}throw new Error(`HTTP redirect loop for ${e}`)}catch(g){if(k.signal.aborted&&!ye(f)){let S=g&&(typeof g=="object"||typeof g=="function")&&!M.isProxy(g)?g:null,P=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw g}finally{clearTimeout(v),w&&await w.close()}}async function A(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&M.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let b of Object.getOwnPropertyNames(t)){let y=Object.getOwnPropertyDescriptor(t,b);if(!(b==="toJSON"&&y&&Object.hasOwn(y,"value")&&y.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!y||!y.enumerable||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(t==null||!Object.hasOwn(t,b))return;let y=Object.getOwnPropertyDescriptor(t,b);if(!y||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain own data properties");return y.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let s=n("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let l=n("retries");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>10))throw new TypeError("HTTP retries must be a bounded integer");let d=n("redirectPolicy");if(d!==void 0&&d!=="follow"&&d!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let i=n("maxRedirects");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>re))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${re}`);if(d==="error"&&i!==void 0&&i!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=d??"follow",c=a==="error"?0:i??re;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let y=n(b);if(y!==void 0&&typeof y!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let u=n("maxResponseBytes");if(u!==void 0&&(!Number.isInteger(u)||u<1||u>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=n("signal");if(p!==void 0){if(M.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ye(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let y=n(b);if(y!==void 0&&typeof y!="function")throw new TypeError(`HTTP ${b} must be a function`)}let f=n("fetchImpl"),m=f||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let E=s??12e3,k=(o||"GET").toUpperCase(),v=n("headers"),R=xt(v),w=Object.assign(Object.create(null),R);Object.keys(w).some(b=>b.toLowerCase()==="accept")||(w.Accept="application/json");let T=n("body");T!=null&&typeof T!="string"&&(Object.keys(w).find(y=>y.toLowerCase()==="content-type")||(w["Content-Type"]="application/json"),T=bt(T));let K=l??dt,W=n("lookupFn"),g=!f,S=n("untrustedUrl")===!0,P=n("sameOriginRedirectsOnly")===!0,B=n("importUndici"),h=n("validateResponse"),_=p,X=u??null,N=async()=>{let b;for(let y=0;y<=K;y++){_&&mt.call(_);try{return await Rt(e,{fetchImpl:m,method:k,headers:w,body:T,timeoutMs:E,lookupFn:W,realFetch:g,untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:P,importUndici:B,validateResponse:h,signal:_,redirectPolicy:a,maxRedirects:c})}catch(z){b=z;let J=le=>{if(!z||typeof z!="object"&&typeof z!="function"||M.isProxy(z))return;let Y=Object.getOwnPropertyDescriptor(z,le);return Y&&Object.hasOwn(Y,"value")?Y.value:void 0},ce=J("status"),tt=J("oracleTimeout")===!0||J("name")==="AbortError"||J("name")==="TimeoutError"||ye(_),rt=new Set([408,425,429]),nt=J("retryable")===!1?!1:ce!=null?rt.has(ce)||ut.has(ce)&&Pe.has(k):!tt&&Pe.has(k);if(y===K||!nt)throw z;let Ae=Pt(y,J("retryAfter"));_?await new Promise((le,Y)=>{let ot=setTimeout(le,Ae);ht.call(_,"abort",()=>{clearTimeout(ot),Y(gt(_)||new DOMException("Aborted","AbortError"))},{once:!0})}):await Tt(Ae)}}throw b};if(!(n("dedupe")!==!1&&!_&&Le(k,T)))return N();let L=vt(k,e,w,{untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:P,redirectPolicy:a,maxRedirects:c,timeoutMs:E,retries:K,fetchImpl:te(m),realFetch:g,lookupFn:te(W),importUndici:te(B),validateResponse:te(h)},T),q=ge.get(L);if(q)return q;let I=N().finally(()=>ge.delete(L));return ge.set(L,I),I}var Lt="https://yields.llama.fi";async function Ce(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||Lt).replace(/\/$/,""),n=await A(`${r}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),o=Array.isArray(n?.data)?n.data:[];e.chain&&(o=o.filter(l=>String(l.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(o=o.filter(l=>String(l.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(o=o.filter(l=>!!l.stablecoin==!!e.stablecoin)),o.sort((l,d)=>Number(d.tvlUsd||0)-Number(l.tvlUsd||0));let s=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...n,data:o.slice(0,s)}}var Lr=300*1e3,Cr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{types as De}from"node:util";function Ct(e){if(!e||typeof e!="object"||De.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ne(e,t="provider response",r=0){if(r>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(De.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let s=0;s<e.length;s+=1){let l=Object.getOwnPropertyDescriptor(e,String(s));if(!l||!Object.hasOwn(l,"value"))throw new Error(`${t} arrays must contain dense own data`);o[s]=ne(l.value,t,r+1)}return o}if(!Ct(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let o of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,o);if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} objects must contain own data`);n[o]=ne(s.value,t,r+1)}return n}var Dt="https://api.hyperliquid.xyz/info",$t="https://api.hyperliquid-testnet.xyz/info";function Mt({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?$t:Dt}async function oe(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Mt(t);return ne(await A(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"hyperliquid info response")}async function be(e={}){return oe({type:"allMids"},e)}async function xe(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),oe(t,e)}var Ft=24*365,Bt=8;function F(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ut(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function $e(e={},t={}){let[r,n]=await Promise.all([xe(t),be(t).catch(()=>({}))]),o=r?.[0]?.universe??r?.universe??[],s=Array.isArray(r?.[1])?r[1]:[],d=o.map((i,a)=>{let c=s[a]||{},u=F(c.markPx),p=F(c.prevDayPx),f=F(c.openInterest),m=F(c.funding);return{coin:i.name,index:a,markPx:u,oraclePx:F(c.oraclePx),midPx:F(c.midPx)??F(n?.[i.name]),prevDayPx:p,change24hPct:Ut(u,p),dayNtlVolumeUsd:F(c.dayNtlVlm),premium:F(c.premium),fundingRate:m,fundingRateAprPct:m==null?null:m*(Ft/Bt)*100,openInterestCoin:f,openInterestUsd:f==null||u==null?null:f*u,maxLeverage:i.maxLeverage??null,szDecimals:i.szDecimals??null,isDelisted:!!i.isDelisted}}).filter(i=>!i.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:d.length,markets:d,totals:{openInterestUsd:d.reduce((i,a)=>i+(a.openInterestUsd||0),0),dayNtlVolumeUsd:d.reduce((i,a)=>i+(a.dayNtlVolumeUsd||0),0)}}}var Kr=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});var en=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),tn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var sn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"});import{Contract as ln,JsonRpcProvider as un}from"ethers";var fn=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var vn=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Pn=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Tn=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),On=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});var zt="https://indexer.dydx.trade";function Z(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Vt(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function Fe(e=50,t={}){try{let r=await A(`${zt}/v4/perpetualMarkets?limit=${e}`,t);return Vt(r).map(o=>{let s=Z(o?.nextFundingRate),l=Z(o?.oraclePrice),d=Z(o?.openInterest),i=Z(o?.volume24H),a=Z(o?.priceChange24H);return{ticker:o?.ticker,coin:String(o?.ticker||"").replace(/-USD$/,""),markPx:l,oraclePx:l,fundingRate:s,fundingRateAprPct:s==null?null:s*24*365*100,openInterest:d,dayNtlVolumeUsd:i,change24hPct:l&&a!=null?a/l*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:s==null?null:`${(s*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}var Gt="https://dlob.drift.trade",Be="Drift public market API unavailable upstream (dlob /v2/markets dead; data.api.drift.trade/contracts 403). Read-only surface stays FAILED until a live endpoint is verified.";async function Ue(e={}){try{let r=(await A(`${Gt}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Be,venue:"drift",quality:"FAILED"}:r.map(n=>({symbol:n?.symbol||n?.marketIndex,coin:n?.symbol,oraclePrice:n?.amm?.oraclePrice,markPrice:n?.amm?.markPrice,fundingRate:n?.amm?.lastFundingRate?`${(Number(n.amm.lastFundingRate)*100).toFixed(4)}%`:null,openInterest:{long:n?.amm?.longFunding,short:n?.amm?.shortFunding},volume24h:n?.amm?.quoteAssetVolume,venue:"drift",quality:"LIVE"}))}catch(t){return{error:`${Be} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var Kt="https://gateway.prod.vertexprotocol.com/v2",He="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified.";async function je(e={}){try{let r=(await A(`${Kt}/query`,{...e,method:"POST",body:JSON.stringify({all_markets:{}}),headers:{"content-type":"application/json",...e.headers||{}}}))?.data?.all_markets;return!Array.isArray(r)||r.length===0?{error:He,venue:"vertex",quality:"FAILED"}:r.map(n=>({market:n?.market,type:n?.type,oraclePrice:n?.oracle_price_x18?(Number(BigInt(n.oracle_price_x18))/1e18).toFixed(4):null,minSize:n?.min_size,productId:n?.product_id,venue:"vertex",quality:"LIVE"}))}catch(t){return{error:`${He} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}import{Interface as Ie,getAddress as Yn,isAddress as Zn}from"ethers";var qe={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Mn=new Map(Object.values(qe).map(e=>[e.chainId,e]));import{Interface as Jt,getAddress as Vn}from"ethers";var Gn=new Jt(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ze=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Ve=Object.freeze({42161:{name:"arbitrum",api:ze[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:ze[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var ro=`0x${"0".repeat(64)}`,no=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),oo=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),io=new Ie(["function multicall(bytes[] data) payable returns (bytes[] results)","function sendTokens(address token,address receiver,uint256 amount) payable","function sendWnt(address receiver,uint256 amount) payable","function createOrder(((address receiver,address cancellationReceiver,address callbackContract,address uiFeeReceiver,address market,address initialCollateralToken,address[] swapPath) addresses,(uint256 sizeDeltaUsd,uint256 initialCollateralDeltaAmount,uint256 triggerPrice,uint256 acceptablePrice,uint256 executionFee,uint256 callbackGasLimit,uint256 minOutputAmount,uint256 validFromTime) numbers,uint8 orderType,uint8 decreasePositionSwapType,bool isLong,bool shouldUnwrapNativeToken,bool autoCancel,bytes32 referralCode,bytes32[] dataList) params) payable returns (bytes32)","function cancelOrder(bytes32 key) payable"]),so=new Ie(["function getAccountPositions(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getAccountOrders(address dataStore,address account,uint256 start,uint256 end) view returns (bytes)","function getOrder(address dataStore,bytes32 key) view returns (bytes)"]),ao=new Ie(["event EventLog1(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)","event EventLog2(address msgSender,string eventName,string indexed eventNameHash,bytes32 indexed topic1,bytes32 indexed topic2,((tuple(string key,address value)[] items,tuple(string key,address[] value)[] arrayItems),(tuple(string key,uint256 value)[] items,tuple(string key,uint256[] value)[] arrayItems),(tuple(string key,int256 value)[] items,tuple(string key,int256[] value)[] arrayItems),(tuple(string key,bool value)[] items,tuple(string key,bool[] value)[] arrayItems),(tuple(string key,bytes32 value)[] items,tuple(string key,bytes32[] value)[] arrayItems),(tuple(string key,bytes value)[] items,tuple(string key,bytes[] value)[] arrayItems),(tuple(string key,string value)[] items,tuple(string key,string[] value)[] arrayItems)) eventData)"]),co=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function Wt(e){let t=Number(e??42161),r=Ve[t];if(!r)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Ve).join(", ")})`);return{chainId:t,...r}}function Xt(e,t={}){let r=Wt(e);return(t.baseUrl||r.api).replace(/\/$/,"")}async function Ge(e={},t={}){return A(`${Xt(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var Yt="https://api.aevo.xyz";async function Ke(e={}){try{return(await A(`${Yt}/markets`,e)||[]).map(r=>({instrument:r?.instrument_name,type:r?.instrument_type,markPrice:r?.mark_price,indexPrice:r?.index_price,fundingRate:r?.funding_rate?`${(Number(r.funding_rate)*100).toFixed(4)}%`:null,openInterest:r?.open_interest,volume24h:r?.volume_24h}))}catch(t){return{error:String(t.message||t).slice(0,200)}}}var Qt=Number.MAX_SAFE_INTEGER,xo=String(Qt);var er="https://mainnet.zklighter.elliot.ai",tr="https://testnet.zklighter.elliot.ai";function rr(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?tr:er}function ie(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function nr(e){let t=ie(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function Je(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function or(e,t){let r=Array.isArray(e?.funding_rates)?e.funding_rates:[],n=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let l of n){let d=Je(l.market_id);d!=null&&o.set(d,l)}let s=[];for(let l of r){if(String(l.exchange||"")!=="lighter")continue;let d=Je(l.market_id);if(d==null)continue;let i=o.get(d),a=ie(i?.mark_price??i?.index_price),c=ie(l.rate),u=String(l.symbol||i?.symbol||"").trim();!u||c==null||!(a>0)||s.push({coin:u,symbol:u,marketIndex:d,funding:c,markPx:a,openInterest:ie(i?.open_interest)??0,sizeDecimals:Number(i?.supported_size_decimals??i?.size_decimals??4),priceDecimals:Number(i?.supported_price_decimals??i?.price_decimals??2),fundingAprPct:nr(c)})}return s}async function ir(e={}){let t=rr(e),r=new AbortController,n={fetchImpl:e.fetchImpl,retries:0,signal:r.signal};try{let[o,s]=await Promise.all([A(`${t}/api/v1/funding-rates`,n),A(`${t}/api/v1/orderBookDetails`,n)]);return{funding:o,books:s}}catch(o){throw r.abort(o),o}}async function We(e={}){let{funding:t,books:r}=await ir(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:or(t,r)}}var C=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function se(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function H(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function Q({venue:e,coin:t,markPx:r,fundingRateAprPct:n,dayNtlVolumeUsd:o,extra:s={}}){let l=String(t||"").replace(/[-_]/g,"").replace(/USDT$|USDC$|USD$/,"");return Object.freeze({venue:e,coin:l,markPx:se(r),fundingRateAprPct:se(n),dayNtlVolumeUsd:se(o),quality:"LIVE",...s})}async function sr(e,t){try{let r=await t();return r&&r.quality==="FAILED"?H(e,r.error||"FAILED"):r}catch(r){return H(e,r.message||r)}}async function ar(e={}){return{venue:"hl",quality:"LIVE",markets:((await $e({},e)).markets||[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>Q({venue:"hl",coin:n.coin,markPx:n.markPx,fundingRateAprPct:n.fundingRateAprPct,dayNtlVolumeUsd:n.dayNtlVolumeUsd,extra:{openInterestUsd:n.openInterestUsd??null,change24hPct:n.change24hPct??null}}))}}async function cr(e={}){let t=await Fe(50,e);return t?.quality==="FAILED"||t?.error?H("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>Q({venue:"dydx",coin:n.coin,markPx:n.markPx,fundingRateAprPct:n.fundingRateAprPct,dayNtlVolumeUsd:n.dayNtlVolumeUsd}))}}async function lr(e={}){let t=await Ge({chainId:42161},e);return!Array.isArray(t)||t.length===0?H("gmx","gmx tickers empty or not an array"):{venue:"gmx",quality:"LIVE",markets:t.map(n=>{let o=n.tokenSymbol||n.symbol||n.tokenAddress||"",s=se(n.fundingRate??n.funding??n.borrowingRateLong);return Q({venue:"gmx",coin:o,markPx:n.maxPrice??n.minPrice??n.price,fundingRateAprPct:s==null?null:Math.abs(s)<1?s*24*365*100:s,dayNtlVolumeUsd:null,extra:{quality:s==null?"PARTIAL":"LIVE",note:s==null?"price live; funding not on ticker":void 0}})}).filter(n=>n.coin)}}async function ur(e={}){let t=await Ue(e);return t?.quality==="FAILED"||t?.error?H("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function dr(e={}){let t=await je(e);return t?.quality==="FAILED"||t?.error?H("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function pr(e={}){let t=await We(e);return t?.error?H("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(n=>Q({venue:"lighter",coin:n.coin||n.symbol,markPx:n.markPx,fundingRateAprPct:n.fundingAprPct,dayNtlVolumeUsd:null,extra:{marketIndex:n.marketIndex??null}})).filter(n=>n.coin&&n.fundingRateAprPct!=null)}}async function fr(e={}){let t=await Ke(e);return t?.error?H("aevo",t.error):{venue:"aevo",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(n=>String(n.type||"").toLowerCase()==="perpetual"&&n.instrument).map(n=>{let o=String(n.instrument).split("-")[0],s=n.fundingRate==null?null:Number(String(n.fundingRate).replace("%",""));return Q({venue:"aevo",coin:o,markPx:n.markPrice,fundingRateAprPct:Number.isFinite(s)?s*24*365:null,dayNtlVolumeUsd:n.volume24h})}).filter(n=>n.coin&&n.fundingRateAprPct!=null)}}var ke={hl:ar,lighter:pr,gmx:lr,dydx:cr,aevo:fr,drift:ur,vertex:dr};async function Xe(e={},t={}){let r=Array.isArray(e.venues)&&e.venues.length?e.venues.map(a=>String(a).toLowerCase()).filter(a=>ke[a]):[...C],n=e.coin?String(e.coin).toUpperCase().replace(/[-_]/g,""):null,o=Math.max(1,Math.min(Number(e.limit)||25,100)),s=t.readers||ke,l=await Promise.all(r.map(a=>sr(a,()=>(s[a]||ke[a])(t)))),d=l.filter(a=>a.quality==="FAILED"),i=l.filter(a=>a.quality!=="FAILED").flatMap(a=>a.markets||[]).filter(a=>a.fundingRateAprPct!=null);return n&&(i=i.filter(a=>a.coin===n)),i.sort((a,c)=>Math.abs(c.fundingRateAprPct)-Math.abs(a.fundingRateAprPct)),Object.freeze({provider:"perp-universal",asOf:new Date().toISOString(),rankedOn:"abs-apr",ranked:i.slice(0,o),failed:d,venuesTried:r,sourcesAnswered:l.filter(a=>a.quality!=="FAILED").length,sourcesTried:r.length,custody:"prepare-only"})}var mr=Object.freeze([{id:"stable-loop",label:"Stablecoin loop",risk:"Conservative",targetDelta:"0.00",setup:"Supply USDC, borrow a second major stable, redeposit inside the same protocol or campaign.",exposure:"Borrow APR spike, depeg, collateral-factor change, protocol cap change.",hedge:"No perp hedge by default. Cap leverage, diversify stables, and keep unwind triggers explicit.",monitor:"Borrow APR, utilization, oracle health, depeg distance, reward dilution.",exit:"Unwind if borrow APR exceeds reward-adjusted APR or any stable trades outside the defined band."},{id:"collateral-hedge",label:"Collateral plus perp hedge",risk:"Balanced",targetDelta:"~0.00",setup:"Supply a volatile asset as collateral, borrow stables, and short the collateral notional on a liquid perp venue.",exposure:"Liquidation risk, funding cost, hedge slippage, borrow APR drift.",hedge:"Short collateral notional on a liquid perp venue; rebalance when delta drifts past the band.",monitor:"Health factor, funding, mark price, borrow APR, hedge margin.",exit:"Cut when funding turns persistently negative against the position or health factor nears the floor."},{id:"lp-hedge",label:"LP incentive hedge",risk:"Aggressive",targetDelta:"range-dependent",setup:"Provide concentrated liquidity for incentives and short the estimated volatile-token delta.",exposure:"Impermanent loss, range breaks, reward dilution, exit slippage.",hedge:"Short the estimated volatile-token delta and recompute after material price or range moves.",monitor:"Position delta, range utilization, fee APR, rewards, funding, exit slippage.",exit:"Withdraw when incentives dilute, liquidity caps fill, or expected reward no longer beats IL plus opportunity cost."},{id:"quest-farming",label:"Testnet and quest farming",risk:"Conservative",targetDelta:"n/a",setup:"Complete real protocol tasks with consistent, genuine usage from wallets you actually control.",exposure:"Eligibility rules change, sybil filters, unpaid effort, opportunity cost.",hedge:"No financial hedge. Diversify across campaigns so no single ruleset dominates the outcome.",monitor:"Campaign rules, snapshot windows, task eligibility evidence, wallet hygiene.",exit:"Stop once snapshot risk rises, campaign rules change, or the probability-adjusted expected value turns negative."},{id:"liquidity-usage",label:"Liquidity and route usage",risk:"Balanced",targetDelta:"varies",setup:"Route genuine volume and provide liquidity where usage is a stated eligibility signal.",exposure:"IL, slippage, gas burn, bridge fees, lockup discount.",hedge:"Size positions so IL and fees stay inside the modelled reward, and hedge volatile legs when material.",monitor:"Volume attribution, fee drag, reward accrual, lockup terms.",exit:"Withdraw when incentives dilute or expected reward no longer beats IL plus opportunity cost."},{id:"governance-usage",label:"Governance and ecosystem usage",risk:"Conservative",targetDelta:"n/a",setup:"Participate in governance and ecosystem surfaces where real contribution is the eligibility signal.",exposure:"Vanity activity with no eligibility weight, lock-up of governance assets.",hedge:"No financial hedge. Weight effort toward actions with documented eligibility evidence.",monitor:"Proposal participation, delegation terms, lock durations, published criteria.",exit:"Stop contributing effort once criteria change or the probability-adjusted value turns negative."}]),hr={"stable-loop":"No default perp hedge. Bound leverage and monitor depeg plus borrow APR.","collateral-hedge":"Short the collateral notional on a liquid perp venue and rebalance when delta drifts.","lp-hedge":"Short the estimated volatile-token delta and recompute after material price or range moves."},gr={"stable-loop":"Borrow APR, utilization, stable peg, reward dilution, health factor.","collateral-hedge":"Health factor, funding, mark price, borrow APR, hedge margin.","lp-hedge":"Position delta, range utilization, fee APR, rewards, funding, exit slippage."},wr={"stable-loop":["Prepare supply for the stable collateral leg.","Prepare borrow only after health factor and borrow APR pass the method limits.","Prepare redeposit or unwind steps as separate wallet-signed actions."],"collateral-hedge":["Prepare collateral supply after sizing liquidation buffer.","Prepare stable borrow if borrow APR remains inside the method limit.","Open or adjust the perp short on the selected hedge venue, then record hedge size."],"lp-hedge":["Prepare LP add only after checking pool depth, range, and expected position delta.","Short the estimated volatile-token delta on the selected hedge venue.","Prepare LP remove if the range breaks or net APR turns negative."]};function j(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function O(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function Ze(e){let t=O(e.symbol,"").toUpperCase(),r=O(e.exposure,"").toLowerCase(),n=j(e.apy)??0,o=j(e.tvlUsd)??0;return n<=0||o<=0?null:e.stablecoin===!0?"stable-loop":t.includes("-")||r.includes("multi")?"lp-hedge":/ETH|BTC|SOL|HYPE|BNB|AVAX|MATIC|OP|ARB/.test(t)?"collateral-hedge":null}function Qe(e,t){let r=j(e.tvlUsd)??0,n=O(e.ilRisk,"").toLowerCase(),o=O(e.predictions?.predictedClass,"").toLowerCase(),s=t==="stable-loop"?3:t==="collateral-hedge"?6:9;return r<1e6?s+=6:r<1e7&&(s+=3),(n.includes("yes")||n.includes("high"))&&(s+=3),o.includes("down")&&(s+=2),Math.min(35,Math.max(0,s))}function et(e){let t=Ze(e);if(!t)return null;let r=j(e.apy)??0,n=j(e.apyBase)??0,o=Math.max(0,j(e.apyReward)??Math.max(0,r-n)),s=Math.max(0,j(e.tvlUsd)??0),l=Qe(e,t),d=t==="stable-loop"?4:t==="collateral-hedge"?6:0,i=t==="stable-loop"?0:t==="collateral-hedge"?4:5,a=s<5e6?1.2:.5,c=r-d-i-a-l,u=c<1?"Avoid":r>80||s<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",p=O(e.project),f=O(e.symbol),m=O(e.chain);return{id:O(e.pool,`${m}:${p}:${f}`),recipe:t,label:`${p} ${f}`,chain:m,project:p,symbol:f,tvlUsd:s,rewardApr:o,nativeApr:n,estimatedBorrowApr:d,estimatedFundingApr:i,gasApr:a,riskHaircut:l,netApr:c,verdict:u,exposure:O(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:hr[t],monitor:gr[t],prepareSteps:[`Verify ${p} contracts and reward terms on ${m}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...wr[t]],source:"DeFiLlama yields"}}async function yr(e={},t={}){let r=Math.min(24,Math.max(3,Number(e.limit??12)||12)),n=Number(e.minTvl??2e6),o=new Date().toISOString(),s="read-only discovery and prepare-plan design; no signing or broadcast";try{let l=await Ce({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),d=Array.isArray(l?.data)?l.data:[],i=d.map(et).filter(a=>a!==null).filter(a=>a.tvlUsd>=n).filter(a=>a.rewardApr+a.nativeApr<=300).sort((a,c)=>c.netApr-a.netApr||c.tvlUsd-a.tvlUsd).slice(0,r);return{configured:!0,live:!0,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:d.length,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",candidates:i,posture:s}}catch(l){return{configured:!1,live:!1,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:0,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",error:String(l?.message||l),candidates:[],posture:s}}}var Ye=300,br="Read-only gross funding snapshot for hold-spot/short-perp review; not validated historical regime evidence, not net yield, and no costs are inferred.";function ae(e){return e==null||e===""?null:j(e)}function xr(e){let t=ae(e?.fundingRateAprPct),r=O(e?.coin,"");if(!r||t==null||t<=0)return null;let n=Math.abs(t)>Ye;return Object.freeze({id:`${O(e?.venue)}:${r}`,venue:O(e?.venue),coin:r,markPx:ae(e?.markPx),fundingAprPct:t,dayNtlVolumeUsd:ae(e?.dayNtlVolumeUsd),openInterestUsd:ae(e?.openInterestUsd),quality:O(e?.quality,"UNKNOWN"),strategy:"hold-spot-short-perp",anomaly:n,anomalyReason:n?`absolute annualized funding snapshot exceeds ${Ye}%`:null,verdict:n?"outlier":"watch"})}async function Er(e={},t={}){let r=Number(e.limit??e.perVenueLimit??3),n=Number.isFinite(r)?Math.min(5,Math.max(1,Math.trunc(r))):3,o=await Promise.all(C.map(async i=>{try{return await Xe({venues:[i],coin:e.coin||void 0,limit:100},t)}catch(a){return{asOf:new Date().toISOString(),ranked:[],failed:[{venue:i,quality:"FAILED",error:String(a?.message||a||"unavailable").slice(0,240),markets:[]}],sourcesAnswered:0}}})),s=new Map(C.map(i=>[i,[]]));for(let i=0;i<C.length;i+=1){let a=C[i],c=(o[i]?.ranked||[]).map(xr).filter(u=>u!==null).sort((u,p)=>p.fundingAprPct-u.fundingAprPct).slice(0,n);s.set(a,c)}let l=[];for(let i=0;i<n;i+=1)for(let a of C){let c=s.get(a)?.[i];c&&l.push(c)}let d=C.map((i,a)=>{let c=o[a],u=(c?.failed||[]).find(f=>f.venue===i),p=u?"FAILED":c?.sourcesAnswered===1?"LIVE":"UNKNOWN";return Object.freeze({venue:i,quality:p,candidatesReturned:s.get(i)?.length||0,error:u?.error||null})});return Object.freeze({source:"perp-universal fundingAll",asOf:new Date().toISOString(),rankedOn:"positive-gross-funding-apr-desc-per-venue-round-robin",venuesTried:[...C],venueStatuses:d,sourcesAnswered:o.reduce((i,a)=>i+(a?.sourcesAnswered||0),0),sourcesTried:C.length,candidates:l,failed:o.flatMap(i=>i?.failed||[]),posture:br})}function D(e,t,r,n){let o=typeof e=="number"?e:Number(e);return Number.isFinite(o)?Math.min(n,Math.max(r,o)):t}function Ir(e={}){let t=D(e.wallets,5,1,500),r=D(e.tasksWeekly,6,0,500),n=D(e.hoursWeekly,4,0,168),o=D(e.hourlyCost,25,0,1e4),s=D(e.gasPerTask,.4,0,1e4),l=D(e.bridgeMonthly,12,0,1e5),d=D(e.expectedReward,900,0,1e7),i=D(e.probability,22,0,100)/100,a=D(e.sybilHaircut,25,0,100)/100,c=D(e.lockupMonths,6,0,120),u=r*t*4.33,p=u*s,f=n*4.33*o,m=p+f+l,E=Math.max(0,1-c*.015),k=t*d*i,v=k*(1-a)*E,R=v-m,w=m>0?R/m*100:null,T=t*d>0?m/(t*d*(1-a)*(E||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:s,bridgeMonthly:l,expectedReward:d,probabilityPct:i*100,sybilHaircutPct:a*100,lockupMonths:c},monthlyTasks:u,monthlyGas:p,laborMonthly:f,monthlyCost:m,lockupDiscount:E,grossExpectedValue:k,adjustedExpectedValue:v,netExpectedValue:R,roiPct:w,breakevenProbabilityPct:T,verdict:R>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var Vo={FARMING_METHODS:mr,discoverFarms:yr,discoverCarry:Er,scorePool:et,classifyPool:Ze,riskHaircut:Qe,airdropEV:Ir};export{mr as FARMING_METHODS,Ir as airdropEV,Ze as classifyPool,Vo as default,Er as discoverCarry,yr as discoverFarms,Qe as riskHaircut,et as scorePool};