@oracle-agent/oracle 0.35.55 → 0.35.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +1 -1
- package/dist/cli/commands/chat.mjs +221 -221
- package/dist/cli/commands/data.mjs +1 -1
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +150 -150
- package/dist/cli/commands/farm.mjs +16 -16
- package/dist/cli/commands/model.mjs +223 -223
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +32 -25
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +22 -22
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +31 -31
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +5 -5
- package/dist/local-signer/runtime.mjs +21 -22
- package/dist/teams/index.mjs +7 -7
- package/dist/tui/standalone-client.mjs +102 -102
- package/package.json +1 -1
- package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
- package/public/oracle-splash/docs/connectors/index.html +2 -2
- package/public/oracle-splash/docs/getting-started/index.html +2 -2
- package/public/oracle-splash/docs/index.html +3 -3
- package/public/oracle-splash/docs/reference/index.html +2 -2
- package/public/oracle-splash/docs/security/index.html +2 -2
- package/public/oracle-splash/docs/using-oracle/index.html +2 -2
- package/public/oracle-splash/download/index.html +3 -3
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/index.html +6 -6
- package/server.json +2 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createHash as xt}from"node:crypto";import{types as F}from"node:util";import{AsyncLocalStorage as dt}from"node:async_hooks";var pt=new dt,ft=["http","retry","shared"],mt=512;function ne(e){let t=pt.getStore();if(!t||t.closed||!ft.includes(e))return null;if(t.spans.length>=mt)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}import V from"node:net";import ht from"node:dns";var gt=new Set(["localhost","metadata.google.internal","metadata.goog"]);function oe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let f=c.split(":"),h=f.at(-1);if(h?.includes(".")){let p=h.split(".").map(Number);if(p.length!==4||p.some(d=>!Number.isInteger(d)||d<0||d>255))return null;f.splice(f.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return f.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:f.map(p=>Number.parseInt(p,16))},[n,o]=t.split("::"),s=r(n),l=r(o);if(!s||!l)return null;let u=t.includes("::"),i=8-s.length-l.length;if(!u&&i!==0||u&&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 fe(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 me(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=oe(e);if(!t)return!1;let r=oe("::ffff:0:0");return fe(t,r,96)?me([...t.slice(12)].join(".")):fe(t,oe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>fe(t,oe(o),s)):!1}return!1}function wt(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(gt.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=V.isIP(r);return n!==0&&!me(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function he(e,{lookupFn:t=ht.promises.lookup}={}){let r=wt(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;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};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=>!me(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function yt(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function ge({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(p){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);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 s=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),l=new Map,u=p=>(Array.isArray(p)?p:[p]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(V.isIPv6(d.address)?6:4)})),i=(p,d,w)=>{l.set(s(p),u(typeof d=="string"?[{address:d,family:w}]:d))},a=p=>{let d=s(p);if(V.isIP(d))return[{address:d,family:V.isIPv6(d)?6:4}];let w=l.get(d);if(!w||!w.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return w},c=yt(),f=c&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:c.uri,token:`Bearer ${c.token}`,connectTimeout:1e4}):new r({connect:{lookup(p,d,w){let g;try{g=a(p)}catch(E){return w(E)}return d?.all?w(null,g):w(null,g[0].address,g[0].family)}}}),h=bt((p,d={})=>n(p,{...d,dispatcher:f}),i);return{dispatcher:f,fetch:h,pin:i,resolve:a,async close(){try{await f.destroy()}catch{}}}}var we=Symbol.for("oracle.egressGuard.pinCapableFetch");function bt(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[we]=Object.freeze({pin:t}),e}function ye(e){return typeof e=="function"&&typeof e[we]?.pin=="function"}function Re(e,t,r){if(!ye(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[we].pin(t,r)}var Et=new Set([408,425,429,500,502,503,504]),Le=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),It=2,Ce=4e3,kt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,St=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,At=AbortSignal.prototype.throwIfAborted,vt=EventTarget.prototype.addEventListener,Me=EventTarget.prototype.removeEventListener,De=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Q=e=>e?kt.call(e):!1,Pt=e=>e?St.call(e):void 0,Ot=new Set([301,302,303,307,308]),se=3,zr=64*1024,$=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function I(e){return H(`HTTP JSON body refused: ${e}`)}function Tt(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 F[t]=="function"&&F[t](e))}function _t(e){let t=[],r=0,n=0,o=0,s=0,l=new WeakSet,u=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>$.bytes)throw I("serialized byte limit exceeded");t.push(c)},i=c=>{if(Buffer.byteLength(c,"utf8")>$.bytes)throw I("serialized byte limit exceeded");return JSON.stringify(c)},a=(c,f)=>{if(n+=1,n>$.nodes)throw I("node limit exceeded");if(f>$.depth)throw I("depth limit exceeded");if(c===null){u("null");return}if(typeof c=="string"){u(i(c));return}if(typeof c=="boolean"){u(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw I("non-finite number");u(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw I("unsupported non-JSON value");if(F.isProxy(c))throw I("proxy value");if(Tt(c))throw I("unsupported exotic object");if(l.has(c))throw I("cyclic value");l.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw I("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),w=0;for(;d!==null;){if(F.isProxy(d))throw I("proxy array prototype");if(w+=1,w>$.depth)throw I("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>$.arrayLength)throw I("array length limit exceeded");for(let E=0;E<c.length;E+=1){let _=Object.getOwnPropertyDescriptor(c,String(E));if(!_||!Object.hasOwn(_,"value")||_.enumerable!==!0)throw I("array entries must be dense enumerable own data")}let g=0;for(let E in c){if(s+=1,s>$.fields)throw I("enumeration limit exceeded");if(Object.hasOwn(c,E)&&(g+=1,g>c.length))throw I("named array fields are unsupported")}if(g!==c.length)throw I("array entries must be dense enumerable own data");u("[");for(let E=0;E<c.length;E+=1)E&&u(","),a(Object.getOwnPropertyDescriptor(c,String(E)).value,f+1);u("]");return}let h=Object.getPrototypeOf(c);if(h!==Object.prototype&&h!==null)throw I("non-plain object");let p=[];for(let d in c){if(s+=1,s>$.fields)throw I("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>$.fields)throw I("field limit exceeded");let w=Object.getOwnPropertyDescriptor(c,d);if(!w||!Object.hasOwn(w,"value")||w.enumerable!==!0)throw I("object fields must be enumerable own data");p.push([d,w.value])}u("{");for(let d=0;d<p.length;d+=1)d&&u(","),u(i(p[d][0])),u(":"),a(p[d][1],f+1);u("}")}finally{l.delete(c)}};return a(e,0),t.join("")}function Nt(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(F.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 Rt(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Lt(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 Ct(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var be=new Map,$e=new WeakMap,Fe=1;function ie(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=$e.get(e);return t||(t=Fe,Fe+=1,$e.set(e,t)),`reference:${t}`}var Mt=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Dt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Be(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?Mt.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 Ue(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(Be);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Be(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&Dt.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function $t(e,t,r,n={},o=null){let s=xt("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 Ft(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ce):Math.min(250*2**e,Ce)+Math.floor(Math.random()*100)}var Bt=e=>new Promise(t=>setTimeout(t,e));function H(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function xe(e,t,r){return H(`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 Ut(e){return e?e.byteLength??e.length??0:0}async function Ht(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 xe(r,`content-length ${s}`,t);let l=e.body?.getReader?.();if(!l){let f=await e.text(),h=Buffer.byteLength(f,"utf8");if(h>t){if(!n)throw xe(r,`body ${h} bytes`,t);return Buffer.from(f,"utf8").subarray(0,t).toString("utf8")}return f}let u=[],i=0,a=!1;try{for(;;){let{value:f,done:h}=await l.read();if(h)break;if(f&&(u.push(Buffer.from(f)),i+=Ut(f),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 xe(r,`streamed ${i} bytes`,t);let c=Buffer.concat(u);return(a?c.subarray(0,t):c).toString("utf8")}function jt(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function zt(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:l,realFetch:u,untrustedUrl:i=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:f,validateResponse:h,signal:p,redirectPolicy:d="follow",maxRedirects:w=se}){let g=null,E=t,_=l?{lookupFn:l}:{};if(i&&!u&&!ye(E))throw H(`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 O=new AbortController,R=setTimeout(()=>O.abort(),s),J=p?De?De([p,O.signal]):p:O.signal,W=async(y,{status:S=null}={})=>{let v=await he(y,_);if(!v.ok)throw H(S==null?`HTTP refused ${y}: ${v.error}`:`HTTP redirect to ${y} ${v.error}`,S==null?{}:{status:S});let U=new URL(y).hostname;if(u){if(g&&(await g.close(),g=null),!g)try{g=await ge({requireUndici:!0,...f?{importUndici:f}:{}})}catch(m){throw H(S==null?`HTTP refused ${y}: ${m?.message||m}`:`HTTP redirect to ${y} refused: ${m?.message||m}`,S==null?{}:{status:S})}g.pin(U,v.addresses),E=g.fetch}else Re(E,U,v.addresses);return v};try{let y=String(e),S=Object.assign(Object.create(null),n||{});i&&await W(y);for(let v=0;v<=w;v+=1){let U=Object.assign(Object.create(null),{method:r,headers:S,body:o,signal:J,redirect:"manual",dispatcher:void 0}),m=await E(y,U);if((d==="error"||w===0)&&m.status>=300&&m.status<400)throw G(m),H(`HTTP ${m.status} ${r} redirect refused`,{status:m.status,redirectRefused:!0});if(Ot.has(m.status)){let N=c===!0&&r==="POST"&&[307,308].includes(m.status)&&Ue(r,o);if(r!=="GET"&&r!=="HEAD"&&!N){G(m);let k=new Error(`HTTP ${m.status} ${r} ${y} redirected non-idempotent request`);throw k.status=m.status,k}if(v===w)throw G(m),H(`HTTP ${m.status} ${r} redirect budget exhausted`,{status:m.status,redirectRefused:!0});let Pe=m.headers?.get?.("location"),L;try{L=Lt(Pe,y)}catch(k){throw G(m),k}let q=!Ct(L,y);if(G(m),q&&r==="POST"){let k=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw k.status=m.status,k}if(q&&c){let k=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw k.status=m.status,k.retryable=!1,k}if(q&&(S=Rt(S)),i)await W(L,{status:m.status});else if(q){let k=await he(L,_);if(!k.ok){let x=new Error(`HTTP redirect from ${y} ${k.error}`);throw x.status=m.status,x.retryable=!1,x}u&&k.addresses?.length&&(g||(g=await ge(f?{importUndici:f}:{})),g&&(g.pin(new URL(L).hostname,k.addresses),E=g.fetch))}y=L;continue}if(typeof h=="function")try{await h(m,{url:y})}catch(N){throw G(m),H(N?.message||String(N))}let P=await Ht(m,a,{url:y,onOversize:()=>O.abort()}),X=jt(P);if(!m.ok){let N=new Error(`HTTP ${m.status} ${r} ${y}`);throw N.status=m.status,N.retryAfter=m.headers?.get?.("retry-after")??null,N.body=X??P.slice(0,300),N}return X??P}throw new Error(`HTTP redirect loop for ${e}`)}catch(y){if(O.signal.aborted&&!Q(p)){let S=y&&(typeof y=="object"||typeof y=="function")&&!F.isProxy(y)?y:null,v=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(v&&Object.hasOwn(v,"value")&&v.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 m=new Error("HTTP request timed out");throw Object.defineProperties(m,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),m}}throw y}finally{clearTimeout(R),g&&await g.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&&F.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 x of Object.getOwnPropertyNames(t)){let b=Object.getOwnPropertyDescriptor(t,x);if(!(x==="toJSON"&&b&&Object.hasOwn(b,"value")&&b.value===void 0)){if(!r.has(x))throw new TypeError("HTTP options contain unknown fields");if(!b||!b.enumerable||!Object.hasOwn(b,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=x=>{if(t==null||!Object.hasOwn(t,x))return;let b=Object.getOwnPropertyDescriptor(t,x);if(!b||!Object.hasOwn(b,"value"))throw new TypeError("HTTP options must contain own data properties");return b.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 u=n("redirectPolicy");if(u!==void 0&&u!=="follow"&&u!=="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>se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${se}`);if(u==="error"&&i!==void 0&&i!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=u??"follow",c=a==="error"?0:i??se;for(let x of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let b=n(x);if(b!==void 0&&typeof b!="boolean")throw new TypeError(`HTTP ${x} must be boolean`)}let f=n("maxResponseBytes");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let h=n("signal");if(h!==void 0){if(F.isProxy(h)||!(h instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Q(h)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let x of["importUndici","lookupFn","validateResponse"]){let b=n(x);if(b!==void 0&&typeof b!="function")throw new TypeError(`HTTP ${x} must be a function`)}let p=n("fetchImpl"),d=p||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let w=s??12e3,g=(o||"GET").toUpperCase(),E=n("headers"),_=Nt(E),O=Object.assign(Object.create(null),_);Object.keys(O).some(x=>x.toLowerCase()==="accept")||(O.Accept="application/json");let R=n("body");R!=null&&typeof R!="string"&&(Object.keys(O).find(b=>b.toLowerCase()==="content-type")||(O["Content-Type"]="application/json"),R=_t(R));let J=l??It,W=n("lookupFn"),y=!p,S=n("untrustedUrl")===!0,v=n("sameOriginRedirectsOnly")===!0,U=n("importUndici"),m=n("validateResponse"),P=h,X=f??null,N=async()=>{let x;for(let b=0;b<=J;b++){P&&At.call(P);let Oe=ne("http");try{let D=await zt(e,{fetchImpl:d,method:g,headers:O,body:R,timeoutMs:w,lookupFn:W,realFetch:y,untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:v,importUndici:U,validateResponse:m,signal:P,redirectPolicy:a,maxRedirects:c});return Oe?.("succeeded"),D}catch(D){x=D;let K=pe=>{if(!D||typeof D!="object"&&typeof D!="function"||F.isProxy(D))return;let Y=Object.getOwnPropertyDescriptor(D,pe);return Y&&Object.hasOwn(Y,"value")?Y.value:void 0},re=K("status");Oe?.("failed",re);let at=K("oracleTimeout")===!0||K("name")==="AbortError"||K("name")==="TimeoutError"||Q(P),ct=new Set([408,425,429]),lt=K("retryable")===!1?!1:re!=null?ct.has(re)||Et.has(re)&&Le.has(g):!at&&Le.has(g);if(b===J||!lt)throw D;let Te=Ft(b,K("retryAfter")),ut=ne("retry"),_e=!1;try{P?await new Promise((pe,Y)=>{let Ne,Z=()=>{clearTimeout(Ne),Me.call(P,"abort",Z),Y(Pt(P)||new DOMException("Aborted","AbortError"))};if(Q(P)){Z();return}Ne=setTimeout(()=>{Me.call(P,"abort",Z),pe()},Te),vt.call(P,"abort",Z,{once:!0}),Q(P)&&Z()}):await Bt(Te),_e=!0}finally{ut?.(_e?"succeeded":"failed")}}}throw x};if(!(n("dedupe")!==!1&&!P&&Ue(g,R)))return N();let L=$t(g,e,O,{untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:v,redirectPolicy:a,maxRedirects:c,timeoutMs:w,retries:J,fetchImpl:ie(d),realFetch:y,lookupFn:ie(W),importUndici:ie(U),validateResponse:ie(m)},R),q=be.get(L);if(q){let x=ne("shared");try{let b=await q;return x?.("succeeded"),b}catch(b){throw x?.("failed"),b}}let k=N().finally(()=>be.delete(L));return be.set(L,k),k}var qt="https://yields.llama.fi";async function He(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||qt).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,u)=>Number(u.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 Kr=300*1e3,Jr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{types as je}from"node:util";function Vt(e){if(!e||typeof e!="object"||je.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ae(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(je.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]=ae(l.value,t,r+1)}return o}if(!Vt(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]=ae(s.value,t,r+1)}return n}var Gt="https://api.hyperliquid.xyz/info",Kt="https://api.hyperliquid-testnet.xyz/info";function Jt({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"?Kt:Gt}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Jt(t);return ae(await A(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function Ee(e={}){return ce({type:"allMids"},e)}async function Ie(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ce(t,e)}var Wt=24*365,Xt=8;function B(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Yt(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function ze(e={},t={}){let[r,n]=await Promise.all([Ie(t),Ee(t).catch(()=>({}))]),o=r?.[0]?.universe??r?.universe??[],s=Array.isArray(r?.[1])?r[1]:[],u=o.map((i,a)=>{let c=s[a]||{},f=B(c.markPx),h=B(c.prevDayPx),p=B(c.openInterest),d=B(c.funding);return{coin:i.name,index:a,markPx:f,oraclePx:B(c.oraclePx),midPx:B(c.midPx)??B(n?.[i.name]),prevDayPx:h,change24hPct:Yt(f,h),dayNtlVolumeUsd:B(c.dayNtlVlm),premium:B(c.premium),fundingRate:d,fundingRateAprPct:d==null?null:d*(Wt/Xt)*100,openInterestCoin:p,openInterestUsd:p==null||f==null?null:p*f,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:u.length,markets:u,totals:{openInterestUsd:u.reduce((i,a)=>i+(a.openInterestUsd||0),0),dayNtlVolumeUsd:u.reduce((i,a)=>i+(a.dayNtlVolumeUsd||0),0)}}}var cn=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});var hn=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"}),gn=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 xn=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 kn,JsonRpcProvider as Sn}from"ethers";var Pn=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var Un=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Hn=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),jn=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),zn=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});var tr="https://indexer.dydx.trade";function ee(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function rr(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function Ve(e=50,t={}){try{let r=await A(`${tr}/v4/perpetualMarkets?limit=${e}`,t);return rr(r).map(o=>{let s=ee(o?.nextFundingRate),l=ee(o?.oraclePrice),u=ee(o?.openInterest),i=ee(o?.volume24H),a=ee(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:u,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 nr="https://dlob.drift.trade",Ge="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 Ke(e={}){try{let r=(await A(`${nr}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Ge,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:`${Ge} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var or="https://gateway.prod.vertexprotocol.com/v2",Je="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 We(e={}){try{let r=(await A(`${or}/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:Je,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:`${Je} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}import{Interface as Ae,getAddress as mo,isAddress as ho}from"ethers";var Se={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},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}};var Qn=new Map(Object.values(Se).map(e=>[e.chainId,e]));import{Interface as ir,getAddress as ao}from"ethers";var co=new ir(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Xe=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Ye=Object.freeze({42161:{name:"arbitrum",api:Xe[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Xe[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var bo=`0x${"0".repeat(64)}`,xo=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Eo=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Io=new Ae(["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"]),ko=new Ae(["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)"]),So=new Ae(["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)"]),Ao=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function sr(e){let t=Number(e??42161),r=Ye[t];if(!r)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Ye).join(", ")})`);return{chainId:t,...r}}function ar(e,t={}){let r=sr(e);return(t.baseUrl||r.api).replace(/\/$/,"")}async function Ze(e={},t={}){return A(`${ar(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var cr="https://api.aevo.xyz";async function Qe(e={}){try{return(await A(`${cr}/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 ur=Number.MAX_SAFE_INTEGER,Do=String(ur);var dr="https://mainnet.zklighter.elliot.ai",pr="https://testnet.zklighter.elliot.ai";function fr(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?pr:dr}function le(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function mr(e){let t=le(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function et(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function hr(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 u=et(l.market_id);u!=null&&o.set(u,l)}let s=[];for(let l of r){if(String(l.exchange||"")!=="lighter")continue;let u=et(l.market_id);if(u==null)continue;let i=o.get(u),a=le(i?.mark_price??i?.index_price),c=le(l.rate),f=String(l.symbol||i?.symbol||"").trim();!f||c==null||!(a>0)||s.push({coin:f,symbol:f,marketIndex:u,funding:c,markPx:a,openInterest:le(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:mr(c)})}return s}async function gr(e={}){let t=fr(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 tt(e={}){let{funding:t,books:r}=await gr(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:hr(t,r)}}var C=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function ue(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function j(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function te({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:ue(r),fundingRateAprPct:ue(n),dayNtlVolumeUsd:ue(o),quality:"LIVE",...s})}async function wr(e,t){try{let r=await t();return r&&r.quality==="FAILED"?j(e,r.error||"FAILED"):r}catch(r){return j(e,r.message||r)}}async function yr(e={}){return{venue:"hl",quality:"LIVE",markets:((await ze({},e)).markets||[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>te({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 br(e={}){let t=await Ve(50,e);return t?.quality==="FAILED"||t?.error?j("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>te({venue:"dydx",coin:n.coin,markPx:n.markPx,fundingRateAprPct:n.fundingRateAprPct,dayNtlVolumeUsd:n.dayNtlVolumeUsd}))}}async function xr(e={}){let t=await Ze({chainId:42161},e);return!Array.isArray(t)||t.length===0?j("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=ue(n.fundingRate??n.funding??n.borrowingRateLong);return te({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 Er(e={}){let t=await Ke(e);return t?.quality==="FAILED"||t?.error?j("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function Ir(e={}){let t=await We(e);return t?.quality==="FAILED"||t?.error?j("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function kr(e={}){let t=await tt(e);return t?.error?j("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(n=>te({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 Sr(e={}){let t=await Qe(e);return t?.error?j("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 te({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 ve={hl:yr,lighter:kr,gmx:xr,dydx:br,aevo:Sr,drift:Er,vertex:Ir};async function rt(e={},t={}){let r=Array.isArray(e.venues)&&e.venues.length?e.venues.map(a=>String(a).toLowerCase()).filter(a=>ve[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||ve,l=await Promise.all(r.map(a=>wr(a,()=>(s[a]||ve[a])(t)))),u=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:u,venuesTried:r,sourcesAnswered:l.filter(a=>a.quality!=="FAILED").length,sourcesTried:r.length,custody:"prepare-only"})}var Ar=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."}]),vr={"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."},Pr={"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."},Or={"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 z(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function T(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function ot(e){let t=T(e.symbol,"").toUpperCase(),r=T(e.exposure,"").toLowerCase(),n=z(e.apy)??0,o=z(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 it(e,t){let r=z(e.tvlUsd)??0,n=T(e.ilRisk,"").toLowerCase(),o=T(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 st(e){let t=ot(e);if(!t)return null;let r=z(e.apy)??0,n=z(e.apyBase)??0,o=Math.max(0,z(e.apyReward)??Math.max(0,r-n)),s=Math.max(0,z(e.tvlUsd)??0),l=it(e,t),u=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-u-i-a-l,f=c<1?"Avoid":r>80||s<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",h=T(e.project),p=T(e.symbol),d=T(e.chain);return{id:T(e.pool,`${d}:${h}:${p}`),recipe:t,label:`${h} ${p}`,chain:d,project:h,symbol:p,tvlUsd:s,rewardApr:o,nativeApr:n,estimatedBorrowApr:u,estimatedFundingApr:i,gasApr:a,riskHaircut:l,netApr:c,verdict:f,exposure:T(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:vr[t],monitor:Pr[t],prepareSteps:[`Verify ${h} contracts and reward terms on ${d}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Or[t]],source:"DeFiLlama yields"}}async function Tr(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 He({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),u=Array.isArray(l?.data)?l.data:[],i=u.map(st).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:u.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 nt=300,_r="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 de(e){return e==null||e===""?null:z(e)}function Nr(e){let t=de(e?.fundingRateAprPct),r=T(e?.coin,"");if(!r||t==null||t<=0)return null;let n=Math.abs(t)>nt;return Object.freeze({id:`${T(e?.venue)}:${r}`,venue:T(e?.venue),coin:r,markPx:de(e?.markPx),fundingAprPct:t,dayNtlVolumeUsd:de(e?.dayNtlVolumeUsd),openInterestUsd:de(e?.openInterestUsd),quality:T(e?.quality,"UNKNOWN"),strategy:"hold-spot-short-perp",anomaly:n,anomalyReason:n?`absolute annualized funding snapshot exceeds ${nt}%`:null,verdict:n?"outlier":"watch"})}async function Rr(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 rt({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(Nr).filter(f=>f!==null).sort((f,h)=>h.fundingAprPct-f.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 u=C.map((i,a)=>{let c=o[a],f=(c?.failed||[]).find(p=>p.venue===i),h=f?"FAILED":c?.sourcesAnswered===1?"LIVE":"UNKNOWN";return Object.freeze({venue:i,quality:h,candidatesReturned:s.get(i)?.length||0,error:f?.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:u,sourcesAnswered:o.reduce((i,a)=>i+(a?.sourcesAnswered||0),0),sourcesTried:C.length,candidates:l,failed:o.flatMap(i=>i?.failed||[]),posture:_r})}function M(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 Lr(e={}){let t=M(e.wallets,5,1,500),r=M(e.tasksWeekly,6,0,500),n=M(e.hoursWeekly,4,0,168),o=M(e.hourlyCost,25,0,1e4),s=M(e.gasPerTask,.4,0,1e4),l=M(e.bridgeMonthly,12,0,1e5),u=M(e.expectedReward,900,0,1e7),i=M(e.probability,22,0,100)/100,a=M(e.sybilHaircut,25,0,100)/100,c=M(e.lockupMonths,6,0,120),f=r*t*4.33,h=f*s,p=n*4.33*o,d=h+p+l,w=Math.max(0,1-c*.015),g=t*u*i,E=g*(1-a)*w,_=E-d,O=d>0?_/d*100:null,R=t*u>0?d/(t*u*(1-a)*(w||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:s,bridgeMonthly:l,expectedReward:u,probabilityPct:i*100,sybilHaircutPct:a*100,lockupMonths:c},monthlyTasks:f,monthlyGas:h,laborMonthly:p,monthlyCost:d,lockupDiscount:w,grossExpectedValue:g,adjustedExpectedValue:E,netExpectedValue:_,roiPct:O,breakevenProbabilityPct:R,verdict:_>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var ai={FARMING_METHODS:Ar,discoverFarms:Tr,discoverCarry:Rr,scorePool:st,classifyPool:ot,riskHaircut:it,airdropEV:Lr};export{Ar as FARMING_METHODS,Lr as airdropEV,ot as classifyPool,ai as default,Rr as discoverCarry,Tr as discoverFarms,it as riskHaircut,st as scorePool};
|
|
1
|
+
import{createHash as xt}from"node:crypto";import{types as F}from"node:util";import{AsyncLocalStorage as dt}from"node:async_hooks";var pt=new dt,ft=["http","retry","shared"],mt=512;function ne(e){let t=pt.getStore();if(!t||t.closed||!ft.includes(e))return null;if(t.spans.length>=mt)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}import V from"node:net";import ht from"node:dns";var gt=new Set(["localhost","metadata.google.internal","metadata.goog"]);function oe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=c=>{if(!c)return[];let f=c.split(":"),h=f.at(-1);if(h?.includes(".")){let p=h.split(".").map(Number);if(p.length!==4||p.some(d=>!Number.isInteger(d)||d<0||d>255))return null;f.splice(f.length-1,1,(p[0]<<8|p[1]).toString(16),(p[2]<<8|p[3]).toString(16))}return f.some(p=>!/^[0-9a-f]{1,4}$/.test(p))?null:f.map(p=>Number.parseInt(p,16))},[n,o]=t.split("::"),s=r(n),l=r(o);if(!s||!l)return null;let u=t.includes("::"),i=8-s.length-l.length;if(!u&&i!==0||u&&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 fe(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 me(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=oe(e);if(!t)return!1;let r=oe("::ffff:0:0");return fe(t,r,96)?me([...t.slice(12)].join(".")):fe(t,oe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,s])=>fe(t,oe(o),s)):!1}return!1}function wt(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(gt.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=V.isIP(r);return n!==0&&!me(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function he(e,{lookupFn:t=ht.promises.lookup}={}){let r=wt(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;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};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=>!me(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function yt(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function ge({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(p){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${p?.message||p}`);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 s=p=>String(p).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),l=new Map,u=p=>(Array.isArray(p)?p:[p]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(V.isIPv6(d.address)?6:4)})),i=(p,d,w)=>{l.set(s(p),u(typeof d=="string"?[{address:d,family:w}]:d))},a=p=>{let d=s(p);if(V.isIP(d))return[{address:d,family:V.isIPv6(d)?6:4}];let w=l.get(d);if(!w||!w.length)throw new Error(`refused: unpinned host ${p} during pinned fetch`);return w},c=yt(),f=c&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:c.uri,token:`Bearer ${c.token}`,connectTimeout:1e4}):new r({connect:{lookup(p,d,w){let g;try{g=a(p)}catch(E){return w(E)}return d?.all?w(null,g):w(null,g[0].address,g[0].family)}}}),h=bt((p,d={})=>n(p,{...d,dispatcher:f}),i);return{dispatcher:f,fetch:h,pin:i,resolve:a,async close(){try{await f.destroy()}catch{}}}}var we=Symbol.for("oracle.egressGuard.pinCapableFetch");function bt(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[we]=Object.freeze({pin:t}),e}function ye(e){return typeof e=="function"&&typeof e[we]?.pin=="function"}function Le(e,t,r){if(!ye(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[we].pin(t,r)}var Et=new Set([408,425,429,500,502,503,504]),Re=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),It=2,Ce=4e3,kt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,St=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,At=AbortSignal.prototype.throwIfAborted,vt=EventTarget.prototype.addEventListener,Me=EventTarget.prototype.removeEventListener,De=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Q=e=>e?kt.call(e):!1,Pt=e=>e?St.call(e):void 0,Tt=new Set([301,302,303,307,308]),se=3,zr=64*1024,$=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function I(e){return H(`HTTP JSON body refused: ${e}`)}function Ot(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 F[t]=="function"&&F[t](e))}function _t(e){let t=[],r=0,n=0,o=0,s=0,l=new WeakSet,u=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>$.bytes)throw I("serialized byte limit exceeded");t.push(c)},i=c=>{if(Buffer.byteLength(c,"utf8")>$.bytes)throw I("serialized byte limit exceeded");return JSON.stringify(c)},a=(c,f)=>{if(n+=1,n>$.nodes)throw I("node limit exceeded");if(f>$.depth)throw I("depth limit exceeded");if(c===null){u("null");return}if(typeof c=="string"){u(i(c));return}if(typeof c=="boolean"){u(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw I("non-finite number");u(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw I("unsupported non-JSON value");if(F.isProxy(c))throw I("proxy value");if(Ot(c))throw I("unsupported exotic object");if(l.has(c))throw I("cyclic value");l.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw I("symbol-keyed fields are unsupported");if(Array.isArray(c)){let d=Object.getPrototypeOf(c),w=0;for(;d!==null;){if(F.isProxy(d))throw I("proxy array prototype");if(w+=1,w>$.depth)throw I("array prototype depth limit exceeded");d=Object.getPrototypeOf(d)}if(c.length>$.arrayLength)throw I("array length limit exceeded");for(let E=0;E<c.length;E+=1){let _=Object.getOwnPropertyDescriptor(c,String(E));if(!_||!Object.hasOwn(_,"value")||_.enumerable!==!0)throw I("array entries must be dense enumerable own data")}let g=0;for(let E in c){if(s+=1,s>$.fields)throw I("enumeration limit exceeded");if(Object.hasOwn(c,E)&&(g+=1,g>c.length))throw I("named array fields are unsupported")}if(g!==c.length)throw I("array entries must be dense enumerable own data");u("[");for(let E=0;E<c.length;E+=1)E&&u(","),a(Object.getOwnPropertyDescriptor(c,String(E)).value,f+1);u("]");return}let h=Object.getPrototypeOf(c);if(h!==Object.prototype&&h!==null)throw I("non-plain object");let p=[];for(let d in c){if(s+=1,s>$.fields)throw I("enumeration limit exceeded");if(!Object.hasOwn(c,d))continue;if(o+=1,o>$.fields)throw I("field limit exceeded");let w=Object.getOwnPropertyDescriptor(c,d);if(!w||!Object.hasOwn(w,"value")||w.enumerable!==!0)throw I("object fields must be enumerable own data");p.push([d,w.value])}u("{");for(let d=0;d<p.length;d+=1)d&&u(","),u(i(p[d][0])),u(":"),a(p[d][1],f+1);u("}")}finally{l.delete(c)}};return a(e,0),t.join("")}function Nt(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(F.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 Lt(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Rt(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 Ct(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var be=new Map,$e=new WeakMap,Fe=1;function ie(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=$e.get(e);return t||(t=Fe,Fe+=1,$e.set(e,t)),`reference:${t}`}var Mt=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Dt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Be(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?Mt.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 Ue(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(Be);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Be(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&Dt.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function $t(e,t,r,n={},o=null){let s=xt("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 Ft(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Ce):Math.min(250*2**e,Ce)+Math.floor(Math.random()*100)}var Bt=e=>new Promise(t=>setTimeout(t,e));function H(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function xe(e,t,r){return H(`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 Ut(e){return e?e.byteLength??e.length??0:0}async function Ht(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 xe(r,`content-length ${s}`,t);let l=e.body?.getReader?.();if(!l){let f=await e.text(),h=Buffer.byteLength(f,"utf8");if(h>t){if(!n)throw xe(r,`body ${h} bytes`,t);return Buffer.from(f,"utf8").subarray(0,t).toString("utf8")}return f}let u=[],i=0,a=!1;try{for(;;){let{value:f,done:h}=await l.read();if(h)break;if(f&&(u.push(Buffer.from(f)),i+=Ut(f),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 xe(r,`streamed ${i} bytes`,t);let c=Buffer.concat(u);return(a?c.subarray(0,t):c).toString("utf8")}function jt(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function zt(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:l,realFetch:u,untrustedUrl:i=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:f,validateResponse:h,signal:p,redirectPolicy:d="follow",maxRedirects:w=se}){let g=null,E=t,_=l?{lookupFn:l}:{};if(i&&!u&&!ye(E))throw H(`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 T=new AbortController,L=setTimeout(()=>T.abort(),s),J=p?De?De([p,T.signal]):p:T.signal,W=async(y,{status:S=null}={})=>{let v=await he(y,_);if(!v.ok)throw H(S==null?`HTTP refused ${y}: ${v.error}`:`HTTP redirect to ${y} ${v.error}`,S==null?{}:{status:S});let U=new URL(y).hostname;if(u){if(g&&(await g.close(),g=null),!g)try{g=await ge({requireUndici:!0,...f?{importUndici:f}:{}})}catch(m){throw H(S==null?`HTTP refused ${y}: ${m?.message||m}`:`HTTP redirect to ${y} refused: ${m?.message||m}`,S==null?{}:{status:S})}g.pin(U,v.addresses),E=g.fetch}else Le(E,U,v.addresses);return v};try{let y=String(e),S=Object.assign(Object.create(null),n||{});i&&await W(y);for(let v=0;v<=w;v+=1){let U=Object.assign(Object.create(null),{method:r,headers:S,body:o,signal:J,redirect:"manual",dispatcher:void 0}),m=await E(y,U);if((d==="error"||w===0)&&m.status>=300&&m.status<400)throw G(m),H(`HTTP ${m.status} ${r} redirect refused`,{status:m.status,redirectRefused:!0});if(Tt.has(m.status)){let N=c===!0&&r==="POST"&&[307,308].includes(m.status)&&Ue(r,o);if(r!=="GET"&&r!=="HEAD"&&!N){G(m);let k=new Error(`HTTP ${m.status} ${r} ${y} redirected non-idempotent request`);throw k.status=m.status,k}if(v===w)throw G(m),H(`HTTP ${m.status} ${r} redirect budget exhausted`,{status:m.status,redirectRefused:!0});let Pe=m.headers?.get?.("location"),R;try{R=Rt(Pe,y)}catch(k){throw G(m),k}let q=!Ct(R,y);if(G(m),q&&r==="POST"){let k=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw k.status=m.status,k}if(q&&c){let k=new Error(`HTTP ${m.status} ${r} cross-origin redirect refused`);throw k.status=m.status,k.retryable=!1,k}if(q&&(S=Lt(S)),i)await W(R,{status:m.status});else if(q){let k=await he(R,_);if(!k.ok){let x=new Error(`HTTP redirect from ${y} ${k.error}`);throw x.status=m.status,x.retryable=!1,x}u&&k.addresses?.length&&(g||(g=await ge(f?{importUndici:f}:{})),g&&(g.pin(new URL(R).hostname,k.addresses),E=g.fetch))}y=R;continue}if(typeof h=="function")try{await h(m,{url:y})}catch(N){throw G(m),H(N?.message||String(N))}let P=await Ht(m,a,{url:y,onOversize:()=>T.abort()}),X=jt(P);if(!m.ok){let N=new Error(`HTTP ${m.status} ${r} ${y}`);throw N.status=m.status,N.retryAfter=m.headers?.get?.("retry-after")??null,N.body=X??P.slice(0,300),N}return X??P}throw new Error(`HTTP redirect loop for ${e}`)}catch(y){if(T.signal.aborted&&!Q(p)){let S=y&&(typeof y=="object"||typeof y=="function")&&!F.isProxy(y)?y:null,v=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(v&&Object.hasOwn(v,"value")&&v.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 m=new Error("HTTP request timed out");throw Object.defineProperties(m,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),m}}throw y}finally{clearTimeout(L),g&&await g.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&&F.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 x of Object.getOwnPropertyNames(t)){let b=Object.getOwnPropertyDescriptor(t,x);if(!(x==="toJSON"&&b&&Object.hasOwn(b,"value")&&b.value===void 0)){if(!r.has(x))throw new TypeError("HTTP options contain unknown fields");if(!b||!b.enumerable||!Object.hasOwn(b,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=x=>{if(t==null||!Object.hasOwn(t,x))return;let b=Object.getOwnPropertyDescriptor(t,x);if(!b||!Object.hasOwn(b,"value"))throw new TypeError("HTTP options must contain own data properties");return b.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 u=n("redirectPolicy");if(u!==void 0&&u!=="follow"&&u!=="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>se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${se}`);if(u==="error"&&i!==void 0&&i!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=u??"follow",c=a==="error"?0:i??se;for(let x of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let b=n(x);if(b!==void 0&&typeof b!="boolean")throw new TypeError(`HTTP ${x} must be boolean`)}let f=n("maxResponseBytes");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let h=n("signal");if(h!==void 0){if(F.isProxy(h)||!(h instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Q(h)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let x of["importUndici","lookupFn","validateResponse"]){let b=n(x);if(b!==void 0&&typeof b!="function")throw new TypeError(`HTTP ${x} must be a function`)}let p=n("fetchImpl"),d=p||globalThis.fetch;if(typeof d!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let w=s??12e3,g=(o||"GET").toUpperCase(),E=n("headers"),_=Nt(E),T=Object.assign(Object.create(null),_);Object.keys(T).some(x=>x.toLowerCase()==="accept")||(T.Accept="application/json");let L=n("body");L!=null&&typeof L!="string"&&(Object.keys(T).find(b=>b.toLowerCase()==="content-type")||(T["Content-Type"]="application/json"),L=_t(L));let J=l??It,W=n("lookupFn"),y=!p,S=n("untrustedUrl")===!0,v=n("sameOriginRedirectsOnly")===!0,U=n("importUndici"),m=n("validateResponse"),P=h,X=f??null,N=async()=>{let x;for(let b=0;b<=J;b++){P&&At.call(P);let Te=ne("http");try{let D=await zt(e,{fetchImpl:d,method:g,headers:T,body:L,timeoutMs:w,lookupFn:W,realFetch:y,untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:v,importUndici:U,validateResponse:m,signal:P,redirectPolicy:a,maxRedirects:c});return Te?.("succeeded"),D}catch(D){x=D;let K=pe=>{if(!D||typeof D!="object"&&typeof D!="function"||F.isProxy(D))return;let Y=Object.getOwnPropertyDescriptor(D,pe);return Y&&Object.hasOwn(Y,"value")?Y.value:void 0},re=K("status");Te?.("failed",re);let at=K("oracleTimeout")===!0||K("name")==="AbortError"||K("name")==="TimeoutError"||Q(P),ct=new Set([408,425,429]),lt=K("retryable")===!1?!1:re!=null?ct.has(re)||Et.has(re)&&Re.has(g):!at&&Re.has(g);if(b===J||!lt)throw D;let Oe=Ft(b,K("retryAfter")),ut=ne("retry"),_e=!1;try{P?await new Promise((pe,Y)=>{let Ne,Z=()=>{clearTimeout(Ne),Me.call(P,"abort",Z),Y(Pt(P)||new DOMException("Aborted","AbortError"))};if(Q(P)){Z();return}Ne=setTimeout(()=>{Me.call(P,"abort",Z),pe()},Oe),vt.call(P,"abort",Z,{once:!0}),Q(P)&&Z()}):await Bt(Oe),_e=!0}finally{ut?.(_e?"succeeded":"failed")}}}throw x};if(!(n("dedupe")!==!1&&!P&&Ue(g,L)))return N();let R=$t(g,e,T,{untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:v,redirectPolicy:a,maxRedirects:c,timeoutMs:w,retries:J,fetchImpl:ie(d),realFetch:y,lookupFn:ie(W),importUndici:ie(U),validateResponse:ie(m)},L),q=be.get(R);if(q){let x=ne("shared");try{let b=await q;return x?.("succeeded"),b}catch(b){throw x?.("failed"),b}}let k=N().finally(()=>be.delete(R));return be.set(R,k),k}var qt="https://yields.llama.fi";async function He(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||qt).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,u)=>Number(u.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 Kr=300*1e3,Jr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{types as je}from"node:util";function Vt(e){if(!e||typeof e!="object"||je.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ae(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(je.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]=ae(l.value,t,r+1)}return o}if(!Vt(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]=ae(s.value,t,r+1)}return n}var Gt="https://api.hyperliquid.xyz/info",Kt="https://api.hyperliquid-testnet.xyz/info";function Jt({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"?Kt:Gt}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Jt(t);return ae(await A(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function Ee(e={}){return ce({type:"allMids"},e)}async function Ie(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),ce(t,e)}var Wt=24*365,Xt=8;function B(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Yt(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function ze(e={},t={}){let[r,n]=await Promise.all([Ie(t),Ee(t).catch(()=>({}))]),o=r?.[0]?.universe??r?.universe??[],s=Array.isArray(r?.[1])?r[1]:[],u=o.map((i,a)=>{let c=s[a]||{},f=B(c.markPx),h=B(c.prevDayPx),p=B(c.openInterest),d=B(c.funding);return{coin:i.name,index:a,markPx:f,oraclePx:B(c.oraclePx),midPx:B(c.midPx)??B(n?.[i.name]),prevDayPx:h,change24hPct:Yt(f,h),dayNtlVolumeUsd:B(c.dayNtlVlm),premium:B(c.premium),fundingRate:d,fundingRateAprPct:d==null?null:d*(Wt/Xt)*100,openInterestCoin:p,openInterestUsd:p==null||f==null?null:p*f,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:u.length,markets:u,totals:{openInterestUsd:u.reduce((i,a)=>i+(a.openInterestUsd||0),0),dayNtlVolumeUsd:u.reduce((i,a)=>i+(a.dayNtlVolumeUsd||0),0)}}}var cn=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});var hn=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"}),gn=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 xn=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 kn,JsonRpcProvider as Sn}from"ethers";var Pn=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var Un=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Hn=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),jn=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),zn=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});var tr="https://indexer.dydx.trade";function ee(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function rr(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function Ve(e=50,t={}){try{let r=await A(`${tr}/v4/perpetualMarkets?limit=${e}`,t);return rr(r).map(o=>{let s=ee(o?.nextFundingRate),l=ee(o?.oraclePrice),u=ee(o?.openInterest),i=ee(o?.volume24H),a=ee(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:u,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 nr="https://dlob.drift.trade",Ge="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 Ke(e={}){try{let r=(await A(`${nr}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Ge,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:`${Ge} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var or="https://gateway.prod.vertexprotocol.com/v2",Je="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 We(e={}){try{let r=(await A(`${or}/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:Je,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:`${Je} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}import{Interface as Ae,getAddress as mo,isAddress as ho}from"ethers";var Se={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},elysium:{chainId:1339,name:"Elysium",rpcEnv:["ELYSIUM_RPC_URL"],evm:!0,readOnly:!0}};var Qn=new Map(Object.values(Se).map(e=>[e.chainId,e]));import{Interface as ir,getAddress as ao}from"ethers";var co=new ir(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Xe=Object.freeze({42161:"https://arbitrum-api.gmxinfra.io",43114:"https://avalanche-api.gmxinfra.io"}),Ye=Object.freeze({42161:{name:"arbitrum",api:Xe[42161],exchangeRouter:"0x1C3fa76e6E1088bCE750f23a5BFcffa1efEF6A41",router:"0x7452c558d45f8afC8c83dAe62C3f8A5BE19c71f6",orderVault:"0x31eF83a530Fde1B38EE9A18093A333D8Bbbc40D5",dataStore:"0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8",reader:"0x470fbC46bcC0f16532691Df360A07d8Bf5ee0789",eventEmitter:"0xC8ee91A54287DB53897056e12D9819156D3822Fb",wnt:"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",usdc:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831"},43114:{name:"avalanche",api:Xe[43114],exchangeRouter:"0x8f550E53DFe96C055D5Bdb267c21F268fCAF63B2",router:"0x820F5FfC5b525cD4d88Cd91aCf2c28F16530Cc68",orderVault:"0xD3D60D22d415aD43b7e64b510D86A30f19B1B12C",dataStore:"0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6",reader:"0x62Cb8740E6986B29dC671B2EB596676f60590A5B",eventEmitter:"0xDb17B211c34240B014ab6d61d4A31FA0C0e20c26",wnt:"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",usdc:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"}});var bo=`0x${"0".repeat(64)}`,xo=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),Eo=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),Io=new Ae(["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"]),ko=new Ae(["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)"]),So=new Ae(["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)"]),Ao=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function sr(e){let t=Number(e??42161),r=Ye[t];if(!r)throw new Error(`gmx: unsupported chainId ${e} (supported: ${Object.keys(Ye).join(", ")})`);return{chainId:t,...r}}function ar(e,t={}){let r=sr(e);return(t.baseUrl||r.api).replace(/\/$/,"")}async function Ze(e={},t={}){return A(`${ar(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var cr="https://api.aevo.xyz";async function Qe(e={}){try{return(await A(`${cr}/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 ur=Number.MAX_SAFE_INTEGER,Do=String(ur);var dr="https://mainnet.zklighter.elliot.ai",pr="https://testnet.zklighter.elliot.ai";function fr(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?pr:dr}function le(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function mr(e){let t=le(e);if(t==null)throw new Error("lighter: funding rate required");return t*24*365*100}function et(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:null}function hr(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 u=et(l.market_id);u!=null&&o.set(u,l)}let s=[];for(let l of r){if(String(l.exchange||"")!=="lighter")continue;let u=et(l.market_id);if(u==null)continue;let i=o.get(u),a=le(i?.mark_price??i?.index_price),c=le(l.rate),f=String(l.symbol||i?.symbol||"").trim();!f||c==null||!(a>0)||s.push({coin:f,symbol:f,marketIndex:u,funding:c,markPx:a,openInterest:le(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:mr(c)})}return s}async function gr(e={}){let t=fr(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 tt(e={}){let{funding:t,books:r}=await gr(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:hr(t,r)}}var C=Object.freeze(["hl","lighter","gmx","dydx","aevo","drift","vertex"]);function ue(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function j(e,t){return Object.freeze({venue:e,quality:"FAILED",error:String(t||"unavailable").slice(0,240),markets:[]})}function te({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:ue(r),fundingRateAprPct:ue(n),dayNtlVolumeUsd:ue(o),quality:"LIVE",...s})}async function wr(e,t){try{let r=await t();return r&&r.quality==="FAILED"?j(e,r.error||"FAILED"):r}catch(r){return j(e,r.message||r)}}async function yr(e={}){return{venue:"hl",quality:"LIVE",markets:((await ze({},e)).markets||[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>te({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 br(e={}){let t=await Ve(50,e);return t?.quality==="FAILED"||t?.error?j("dydx",t.error):{venue:"dydx",quality:"LIVE",markets:(Array.isArray(t)?t:[]).filter(n=>n.coin&&n.fundingRateAprPct!=null).map(n=>te({venue:"dydx",coin:n.coin,markPx:n.markPx,fundingRateAprPct:n.fundingRateAprPct,dayNtlVolumeUsd:n.dayNtlVolumeUsd}))}}async function xr(e={}){let t=await Ze({chainId:42161},e);return!Array.isArray(t)||t.length===0?j("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=ue(n.fundingRate??n.funding??n.borrowingRateLong);return te({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 Er(e={}){let t=await Ke(e);return t?.quality==="FAILED"||t?.error?j("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function Ir(e={}){let t=await We(e);return t?.quality==="FAILED"||t?.error?j("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function kr(e={}){let t=await tt(e);return t?.error?j("lighter",t.error):{venue:"lighter",quality:"LIVE",markets:(t.markets||[]).map(n=>te({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 Sr(e={}){let t=await Qe(e);return t?.error?j("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 te({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 ve={hl:yr,lighter:kr,gmx:xr,dydx:br,aevo:Sr,drift:Er,vertex:Ir};async function rt(e={},t={}){let r=Array.isArray(e.venues)&&e.venues.length?e.venues.map(a=>String(a).toLowerCase()).filter(a=>ve[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||ve,l=await Promise.all(r.map(a=>wr(a,()=>(s[a]||ve[a])(t)))),u=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:u,venuesTried:r,sourcesAnswered:l.filter(a=>a.quality!=="FAILED").length,sourcesTried:r.length,custody:"prepare-only"})}var Ar=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."}]),vr={"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."},Pr={"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."},Tr={"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 z(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 ot(e){let t=O(e.symbol,"").toUpperCase(),r=O(e.exposure,"").toLowerCase(),n=z(e.apy)??0,o=z(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 it(e,t){let r=z(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 st(e){let t=ot(e);if(!t)return null;let r=z(e.apy)??0,n=z(e.apyBase)??0,o=Math.max(0,z(e.apyReward)??Math.max(0,r-n)),s=Math.max(0,z(e.tvlUsd)??0),l=it(e,t),u=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-u-i-a-l,f=c<1?"Avoid":r>80||s<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",h=O(e.project),p=O(e.symbol),d=O(e.chain);return{id:O(e.pool,`${d}:${h}:${p}`),recipe:t,label:`${h} ${p}`,chain:d,project:h,symbol:p,tvlUsd:s,rewardApr:o,nativeApr:n,estimatedBorrowApr:u,estimatedFundingApr:i,gasApr:a,riskHaircut:l,netApr:c,verdict:f,exposure:O(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:vr[t],monitor:Pr[t],prepareSteps:[`Verify ${h} contracts and reward terms on ${d}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Tr[t]],source:"DeFiLlama yields"}}async function Or(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 He({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),u=Array.isArray(l?.data)?l.data:[],i=u.map(st).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:u.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 nt=300,_r="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 de(e){return e==null||e===""?null:z(e)}function Nr(e){let t=de(e?.fundingRateAprPct),r=O(e?.coin,"");if(!r||t==null||t<=0)return null;let n=Math.abs(t)>nt;return Object.freeze({id:`${O(e?.venue)}:${r}`,venue:O(e?.venue),coin:r,markPx:de(e?.markPx),fundingAprPct:t,dayNtlVolumeUsd:de(e?.dayNtlVolumeUsd),openInterestUsd:de(e?.openInterestUsd),quality:O(e?.quality,"UNKNOWN"),strategy:"hold-spot-short-perp",anomaly:n,anomalyReason:n?`absolute annualized funding snapshot exceeds ${nt}%`:null,verdict:n?"outlier":"watch"})}async function Lr(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 rt({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(Nr).filter(f=>f!==null).sort((f,h)=>h.fundingAprPct-f.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 u=C.map((i,a)=>{let c=o[a],f=(c?.failed||[]).find(p=>p.venue===i),h=f?"FAILED":c?.sourcesAnswered===1?"LIVE":"UNKNOWN";return Object.freeze({venue:i,quality:h,candidatesReturned:s.get(i)?.length||0,error:f?.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:u,sourcesAnswered:o.reduce((i,a)=>i+(a?.sourcesAnswered||0),0),sourcesTried:C.length,candidates:l,failed:o.flatMap(i=>i?.failed||[]),posture:_r})}function M(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 Rr(e={}){let t=M(e.wallets,5,1,500),r=M(e.tasksWeekly,6,0,500),n=M(e.hoursWeekly,4,0,168),o=M(e.hourlyCost,25,0,1e4),s=M(e.gasPerTask,.4,0,1e4),l=M(e.bridgeMonthly,12,0,1e5),u=M(e.expectedReward,900,0,1e7),i=M(e.probability,22,0,100)/100,a=M(e.sybilHaircut,25,0,100)/100,c=M(e.lockupMonths,6,0,120),f=r*t*4.33,h=f*s,p=n*4.33*o,d=h+p+l,w=Math.max(0,1-c*.015),g=t*u*i,E=g*(1-a)*w,_=E-d,T=d>0?_/d*100:null,L=t*u>0?d/(t*u*(1-a)*(w||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:s,bridgeMonthly:l,expectedReward:u,probabilityPct:i*100,sybilHaircutPct:a*100,lockupMonths:c},monthlyTasks:f,monthlyGas:h,laborMonthly:p,monthlyCost:d,lockupDiscount:w,grossExpectedValue:g,adjustedExpectedValue:E,netExpectedValue:_,roiPct:T,breakevenProbabilityPct:L,verdict:_>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var ai={FARMING_METHODS:Ar,discoverFarms:Or,discoverCarry:Lr,scorePool:st,classifyPool:ot,riskHaircut:it,airdropEV:Rr};export{Ar as FARMING_METHODS,Rr as airdropEV,ot as classifyPool,ai as default,Lr as discoverCarry,Or as discoverFarms,it as riskHaircut,st as scorePool};
|