@oracle-agent/oracle 0.35.44 → 0.35.45
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/agent-sessions.mjs +24 -24
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +26 -26
- package/dist/bin/oracle-data-mcp.mjs +14 -14
- package/dist/bin/oracle-gateway.mjs +47 -47
- package/dist/bin/oracle-investigate.mjs +4 -4
- package/dist/bin/oracle-launch-radar-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +23 -23
- package/dist/bin/oracle-scan.mjs +6 -6
- package/dist/bin/oracle.mjs +1 -0
- package/dist/cli/commands/account.mjs +39 -0
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/airdrop.mjs +7 -7
- package/dist/cli/commands/chat.mjs +198 -198
- package/dist/cli/commands/data.mjs +29 -29
- package/dist/cli/commands/doctor.mjs +7 -7
- package/dist/cli/commands/eval.mjs +123 -123
- package/dist/cli/commands/farm.mjs +16 -16
- package/dist/cli/commands/follow.mjs +36 -36
- package/dist/cli/commands/mint.mjs +10 -10
- package/dist/cli/commands/model.mjs +205 -205
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/receipt.mjs +11 -11
- package/dist/cli/commands/resolve.mjs +9 -9
- package/dist/cli/commands/session-vault.mjs +5 -5
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +25 -25
- package/dist/cli/commands/snipe.mjs +7 -7
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +14 -14
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +24 -24
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +7 -3
- package/dist/local-signer/runtime.mjs +22 -22
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +7 -7
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +4 -4
- package/dist/strategy/index.mjs +3 -3
- package/dist/tui/standalone-client.mjs +85 -85
- 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
package/dist/data/names.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{keccak_256 as fe}from"@noble/hashes/sha3.js";import{createHash as tt}from"node:crypto";import{types as k}from"node:util";import{AsyncLocalStorage as We}from"node:async_hooks";var Ye=new We,Ke=["http","retry","shared"],qe=512;function X(t){let e=Ye.getStore();if(!e||e.closed||!Ke.includes(t))return null;if(e.spans.length>=qe)return e.droppedSpans++,null;let r={stage:t,startMs:e.now()-e.start,durationMs:null,outcome:"pending",status:null};return e.spans.push(r),(n,s=null)=>{e.closed||r.durationMs!==null||(r.durationMs=Math.max(0,e.now()-e.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(s)&&s>=100&&s<=599?s:null)}}import $ from"node:net";import Xe from"node:dns";var Ze=new Set(["localhost","metadata.google.internal","metadata.goog"]);function Z(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=o=>{if(!o)return[];let a=o.split(":"),l=a.at(-1);if(l?.includes(".")){let h=l.split(".").map(Number);if(h.length!==4||h.some(m=>!Number.isInteger(m)||m<0||m>255))return null;a.splice(a.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return a.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:a.map(h=>Number.parseInt(h,16))},[n,s]=e.split("::"),u=r(n),i=r(s);if(!u||!i)return null;let d=e.includes("::"),c=8-u.length-i.length;if(!d&&c!==0||d&&c<1)return null;let p=[...u,...Array(Math.max(0,c)).fill(0),...i];return p.length!==8?null:Uint8Array.from(p.flatMap(o=>[o>>8,o&255]))}function ne(t,e,r){let n=Math.floor(r/8),s=r%8;for(let i=0;i<n;i+=1)if(t[i]!==e[i])return!1;if(!s)return!0;let u=255<<8-s;return(t[n]&u)===(e[n]&u)}function oe(t){if($.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if($.isIPv6(t)){let e=Z(t);if(!e)return!1;let r=Z("::ffff:0:0");return ne(e,r,96)?oe([...e.slice(12)].join(".")):ne(e,Z("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([s,u])=>ne(e,Z(s),u)):!1}return!1}function Qe(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ze.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=$.isIP(r);return n!==0&&!oe(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function se(t,{lookupFn:e=Xe.promises.lookup}={}){let r=Qe(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:$.isIPv6(r.host)?6:4}]};let n;try{n=await e(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(s=>!oe(s.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function ae({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let a=await e();r=a.Agent,n=a.fetch}catch(a){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${a?.message||a}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)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=a=>String(a).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),u=new Map,i=a=>(Array.isArray(a)?a:[a]).map(l=>typeof l=="string"?{address:l}:l).filter(l=>l&&l.address).map(l=>({address:l.address,family:l.family||($.isIPv6(l.address)?6:4)})),d=(a,l,h)=>{u.set(s(a),i(typeof l=="string"?[{address:l,family:h}]:l))},c=a=>{let l=s(a);if($.isIP(l))return[{address:l,family:$.isIPv6(l)?6:4}];let h=u.get(l);if(!h||!h.length)throw new Error(`refused: unpinned host ${a} during pinned fetch`);return h},p=new r({connect:{lookup(a,l,h){let m;try{m=c(a)}catch(x){return h(x)}return l?.all?h(null,m):h(null,m[0].address,m[0].family)}}}),o=et((a,l={})=>n(a,{...l,dispatcher:p}),d);return{dispatcher:p,fetch:o,pin:d,resolve:c,async close(){try{await p.destroy()}catch{}}}}var ie=Symbol.for("oracle.egressGuard.pinCapableFetch");function et(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[ie]=Object.freeze({pin:e}),t}function ce(t){return typeof t=="function"&&typeof t[ie]?.pin=="function"}function Ee(t,e,r){if(!ce(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[ie].pin(e,r)}var rt=new Set([408,425,429,500,502,503,504]),Oe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),nt=2,Se=4e3,ot=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,st=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,at=AbortSignal.prototype.throwIfAborted,it=EventTarget.prototype.addEventListener,Pe=EventTarget.prototype.removeEventListener,xe=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Y=t=>t?ot.call(t):!1,ct=t=>t?st.call(t):void 0,ut=new Set([301,302,303,307,308]),ee=3,tr=64*1024,M=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function T(t){return j(`HTTP JSON body refused: ${t}`)}function lt(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof k[e]=="function"&&k[e](t))}function ft(t){let e=[],r=0,n=0,s=0,u=0,i=new WeakSet,d=o=>{if(r+=Buffer.byteLength(o,"utf8"),r>M.bytes)throw T("serialized byte limit exceeded");e.push(o)},c=o=>{if(Buffer.byteLength(o,"utf8")>M.bytes)throw T("serialized byte limit exceeded");return JSON.stringify(o)},p=(o,a)=>{if(n+=1,n>M.nodes)throw T("node limit exceeded");if(a>M.depth)throw T("depth limit exceeded");if(o===null){d("null");return}if(typeof o=="string"){d(c(o));return}if(typeof o=="boolean"){d(o?"true":"false");return}if(typeof o=="number"){if(!Number.isFinite(o))throw T("non-finite number");d(Object.is(o,-0)?"0":String(o));return}if(typeof o!="object")throw T("unsupported non-JSON value");if(k.isProxy(o))throw T("proxy value");if(lt(o))throw T("unsupported exotic object");if(i.has(o))throw T("cyclic value");i.add(o);try{if(Object.getOwnPropertySymbols(o).length>0)throw T("symbol-keyed fields are unsupported");if(Array.isArray(o)){let m=Object.getPrototypeOf(o),x=0;for(;m!==null;){if(k.isProxy(m))throw T("proxy array prototype");if(x+=1,x>M.depth)throw T("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(o.length>M.arrayLength)throw T("array length limit exceeded");for(let O=0;O<o.length;O+=1){let H=Object.getOwnPropertyDescriptor(o,String(O));if(!H||!Object.hasOwn(H,"value")||H.enumerable!==!0)throw T("array entries must be dense enumerable own data")}let g=0;for(let O in o){if(u+=1,u>M.fields)throw T("enumeration limit exceeded");if(Object.hasOwn(o,O)&&(g+=1,g>o.length))throw T("named array fields are unsupported")}if(g!==o.length)throw T("array entries must be dense enumerable own data");d("[");for(let O=0;O<o.length;O+=1)O&&d(","),p(Object.getOwnPropertyDescriptor(o,String(O)).value,a+1);d("]");return}let l=Object.getPrototypeOf(o);if(l!==Object.prototype&&l!==null)throw T("non-plain object");let h=[];for(let m in o){if(u+=1,u>M.fields)throw T("enumeration limit exceeded");if(!Object.hasOwn(o,m))continue;if(s+=1,s>M.fields)throw T("field limit exceeded");let x=Object.getOwnPropertyDescriptor(o,m);if(!x||!Object.hasOwn(x,"value")||x.enumerable!==!0)throw T("object fields must be enumerable own data");h.push([m,x.value])}d("{");for(let m=0;m<h.length;m+=1)m&&d(","),d(c(h[m][0])),d(":"),p(h[m][1],a+1);d("}")}finally{i.delete(o)}};return p(t,0),e.join("")}function dt(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(k.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let s=n.toLowerCase();if(r.has(s))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(s);let u=Object.getOwnPropertyDescriptor(t,n);if(!u||!Object.hasOwn(u,"value"))throw new TypeError("HTTP headers must contain own data properties");let i=u.value;if(i==null||["object","function","symbol"].includes(typeof i))throw new TypeError("HTTP header values must be scalar");e[n]=String(i)}return e}function pt(){return Object.assign(Object.create(null),{Accept:"application/json"})}function ht(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function mt(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var ue=new Map,Ae=new WeakMap,Re=1;function Q(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=Ae.get(t);return e||(e=Re,Re+=1,Ae.set(t,e)),`reference:${e}`}var yt=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),wt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function ve(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?yt.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function _e(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(ve);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return ve(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&wt.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function bt(t,e,r,n={},s=null){let u=tt("sha256"),i=(c,p)=>{let o=String(p);u.update(String(Buffer.byteLength(c,"utf8"))).update(":").update(c),u.update("=").update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o).update(`
|
|
2
|
-
`)};i("method",t),i("url",e),Object.keys(r||{}).map((c,p)=>({name:c.toLowerCase(),order:p,value:String(r[c])})).sort((c,p)=>c.name.localeCompare(p.name)||c.order-p.order).forEach((c,p)=>{i(`header-name-${p}`,c.name),i(`header-value-${p}`,c.value)}),i("body",s??"-");for(let c of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])i(`context-${c}`,n[c]??"-");return u.digest("hex")}function gt(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Se):Math.min(250*2**t,Se)+Math.floor(Math.random()*100)}var Tt=t=>new Promise(e=>setTimeout(e,t));function j(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function le(t,e,r){return j(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function B(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function Et(t){return t?t.byteLength??t.length??0:0}async function Ot(t,e,{url:r,truncate:n=!1,onOversize:s}={}){if(e==null)return await t.text();let u=Number(t.headers?.get?.("content-length"));if(Number.isFinite(u)&&u>e&&(B(t),!n))throw le(r,`content-length ${u}`,e);let i=t.body?.getReader?.();if(!i){let a=await t.text(),l=Buffer.byteLength(a,"utf8");if(l>e){if(!n)throw le(r,`body ${l} bytes`,e);return Buffer.from(a,"utf8").subarray(0,e).toString("utf8")}return a}let d=[],c=0,p=!1;try{for(;;){let{value:a,done:l}=await i.read();if(l)break;if(a&&(d.push(Buffer.from(a)),c+=Et(a),c>e)){p=!0;break}}}finally{if(p)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(p&&(typeof s=="function"&&s(),!n))throw le(r,`streamed ${c} bytes`,e);let o=Buffer.concat(d);return(p?o.subarray(0,e):o).toString("utf8")}function St(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Pt(t,{fetchImpl:e,method:r,headers:n,body:s,timeoutMs:u,lookupFn:i,realFetch:d,untrustedUrl:c=!1,maxResponseBytes:p=null,sameOriginRedirectsOnly:o=!1,importUndici:a,validateResponse:l,signal:h,redirectPolicy:m="follow",maxRedirects:x=ee}){let g=null,O=e,H=i?{lookupFn:i}:{};if(c&&!d&&!ce(O))throw j(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let R=new AbortController,I=setTimeout(()=>R.abort(),u),z=h?xe?xe([h,R.signal]):h:R.signal,G=async(y,{status:S=null}={})=>{let P=await se(y,H);if(!P.ok)throw j(S==null?`HTTP refused ${y}: ${P.error}`:`HTTP redirect to ${y} ${P.error}`,S==null?{}:{status:S});let N=new URL(y).hostname;if(d){if(g&&(await g.close(),g=null),!g)try{g=await ae({requireUndici:!0,...a?{importUndici:a}:{}})}catch(f){throw j(S==null?`HTTP refused ${y}: ${f?.message||f}`:`HTTP redirect to ${y} refused: ${f?.message||f}`,S==null?{}:{status:S})}g.pin(N,P.addresses),O=g.fetch}else Ee(O,N,P.addresses);return P};try{let y=String(t),S=Object.assign(Object.create(null),n||{});c&&await G(y);for(let P=0;P<=x;P+=1){let N=Object.assign(Object.create(null),{method:r,headers:S,body:s,signal:z,redirect:"manual",dispatcher:void 0}),f=await O(y,N);if((m==="error"||x===0)&&f.status>=300&&f.status<400)throw B(f),j(`HTTP ${f.status} ${r} redirect refused`,{status:f.status,redirectRefused:!0});if(ut.has(f.status)){let v=o===!0&&r==="POST"&&[307,308].includes(f.status)&&_e(r,s);if(r!=="GET"&&r!=="HEAD"&&!v){B(f);let E=new Error(`HTTP ${f.status} ${r} ${y} redirected non-idempotent request`);throw E.status=f.status,E}if(P===x)throw B(f),j(`HTTP ${f.status} ${r} redirect budget exhausted`,{status:f.status,redirectRefused:!0});let ye=f.headers?.get?.("location"),_;try{_=ht(ye,y)}catch(E){throw B(f),E}let L=!mt(_,y);if(B(f),L&&r==="POST"){let E=new Error(`HTTP ${f.status} ${r} cross-origin redirect refused`);throw E.status=f.status,E}if(L&&o){let E=new Error(`HTTP ${f.status} ${r} cross-origin redirect refused`);throw E.status=f.status,E.retryable=!1,E}if(L&&(S=pt(S)),c)await G(_,{status:f.status});else if(L){let E=await se(_,H);if(!E.ok){let b=new Error(`HTTP redirect from ${y} ${E.error}`);throw b.status=f.status,b.retryable=!1,b}d&&E.addresses?.length&&(g||(g=await ae(a?{importUndici:a}:{})),g&&(g.pin(new URL(_).hostname,E.addresses),O=g.fetch))}y=_;continue}if(typeof l=="function")try{await l(f,{url:y})}catch(v){throw B(f),j(v?.message||String(v))}let A=await Ot(f,p,{url:y,onOversize:()=>R.abort()}),V=St(A);if(!f.ok){let v=new Error(`HTTP ${f.status} ${r} ${y}`);throw v.status=f.status,v.retryAfter=f.headers?.get?.("retry-after")??null,v.body=V??A.slice(0,300),v}return V??A}throw new Error(`HTTP redirect loop for ${t}`)}catch(y){if(R.signal.aborted&&!Y(h)){let S=y&&(typeof y=="object"||typeof y=="function")&&!k.isProxy(y)?y:null,P=S?Object.getOwnPropertyDescriptor(S,"oversize"):null;if(!(P&&Object.hasOwn(P,"value")&&P.value===!0))try{if(!S)throw new TypeError("unsafe rejection");Object.defineProperties(S,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let f=new Error("HTTP request timed out");throw Object.defineProperties(f,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),f}}throw y}finally{clearTimeout(I),g&&await g.close()}}async function Ie(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&k.isProxy(e))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(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let b of Object.getOwnPropertyNames(e)){let w=Object.getOwnPropertyDescriptor(e,b);if(!(b==="toJSON"&&w&&Object.hasOwn(w,"value")&&w.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!w||!w.enumerable||!Object.hasOwn(w,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(e==null||!Object.hasOwn(e,b))return;let w=Object.getOwnPropertyDescriptor(e,b);if(!w||!Object.hasOwn(w,"value"))throw new TypeError("HTTP options must contain own data properties");return w.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let s=n("method");if(s!==void 0&&(typeof s!="string"||!/^[A-Za-z]+$/u.test(s)))throw new TypeError("HTTP method must be a string token");let u=n("timeoutMs");if(u!==void 0&&(!Number.isInteger(u)||u<1||u>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let i=n("retries");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>10))throw new TypeError("HTTP retries must be a bounded integer");let d=n("redirectPolicy");if(d!==void 0&&d!=="follow"&&d!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let c=n("maxRedirects");if(c!==void 0&&(!Number.isInteger(c)||c<0||c>ee))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ee}`);if(d==="error"&&c!==void 0&&c!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let p=d??"follow",o=p==="error"?0:c??ee;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let w=n(b);if(w!==void 0&&typeof w!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let a=n("maxResponseBytes");if(a!==void 0&&(!Number.isInteger(a)||a<1||a>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let l=n("signal");if(l!==void 0){if(k.isProxy(l)||!(l instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Y(l)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let w=n(b);if(w!==void 0&&typeof w!="function")throw new TypeError(`HTTP ${b} must be a function`)}let h=n("fetchImpl"),m=h||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let x=u??12e3,g=(s||"GET").toUpperCase(),O=n("headers"),H=dt(O),R=Object.assign(Object.create(null),H);Object.keys(R).some(b=>b.toLowerCase()==="accept")||(R.Accept="application/json");let I=n("body");I!=null&&typeof I!="string"&&(Object.keys(R).find(w=>w.toLowerCase()==="content-type")||(R["Content-Type"]="application/json"),I=ft(I));let z=i??nt,G=n("lookupFn"),y=!h,S=n("untrustedUrl")===!0,P=n("sameOriginRedirectsOnly")===!0,N=n("importUndici"),f=n("validateResponse"),A=l,V=a??null,v=async()=>{let b;for(let w=0;w<=z;w++){A&&at.call(A);let we=X("http");try{let C=await Pt(t,{fetchImpl:m,method:g,headers:R,body:I,timeoutMs:x,lookupFn:G,realFetch:y,untrustedUrl:S,maxResponseBytes:V,sameOriginRedirectsOnly:P,importUndici:N,validateResponse:f,signal:A,redirectPolicy:p,maxRedirects:o});return we?.("succeeded"),C}catch(C){b=C;let F=re=>{if(!C||typeof C!="object"&&typeof C!="function"||k.isProxy(C))return;let J=Object.getOwnPropertyDescriptor(C,re);return J&&Object.hasOwn(J,"value")?J.value:void 0},q=F("status");we?.("failed",q);let ze=F("oracleTimeout")===!0||F("name")==="AbortError"||F("name")==="TimeoutError"||Y(A),Ge=new Set([408,425,429]),Ve=F("retryable")===!1?!1:q!=null?Ge.has(q)||rt.has(q)&&Oe.has(g):!ze&&Oe.has(g);if(w===z||!Ve)throw C;let be=gt(w,F("retryAfter")),Je=X("retry"),ge=!1;try{A?await new Promise((re,J)=>{let Te,W=()=>{clearTimeout(Te),Pe.call(A,"abort",W),J(ct(A)||new DOMException("Aborted","AbortError"))};if(Y(A)){W();return}Te=setTimeout(()=>{Pe.call(A,"abort",W),re()},be),it.call(A,"abort",W,{once:!0}),Y(A)&&W()}):await Tt(be),ge=!0}finally{Je?.(ge?"succeeded":"failed")}}}throw b};if(!(n("dedupe")!==!1&&!A&&_e(g,I)))return v();let _=bt(g,t,R,{untrustedUrl:S,maxResponseBytes:V,sameOriginRedirectsOnly:P,redirectPolicy:p,maxRedirects:o,timeoutMs:x,retries:z,fetchImpl:Q(m),realFetch:y,lookupFn:Q(G),importUndici:Q(N),validateResponse:Q(f)},I),L=ue.get(_);if(L){let b=X("shared");try{let w=await L;return b?.("succeeded"),w}catch(w){throw b?.("failed"),w}}let E=v().finally(()=>ue.delete(_));return ue.set(_,E),E}var Ce={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}},xt=new Map(Object.values(Ce).map(t=>[t.chainId,t]));function Me(t){return xt.get(Number(t))||null}function ke(t,e=process.env){let r=Me(t);if(!r)return null;for(let n of r.rpcEnv){let s=(e[n]||"").trim();if(s)return s}return null}import{Interface as At,getAddress as cr}from"ethers";var ur=new At(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Rt={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function vt(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=ke(t,r);return n||Rt[Number(t)]||null}var _t=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function It(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!_t.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}var K=new Map,He=new Map;function Ct(t){let e=new Error(t?.message||JSON.stringify(t));return e.code=t?.code,e}function Mt(t){if(t?.error)throw Ct(t.error);return t?.result}function kt(t,e,r){return`${t}
|
|
1
|
+
import{keccak_256 as fe}from"@noble/hashes/sha3.js";import{createHash as rt}from"node:crypto";import{types as H}from"node:util";import{AsyncLocalStorage as Ye}from"node:async_hooks";var We=new Ye,Xe=["http","retry","shared"],Ke=512;function Z(t){let e=We.getStore();if(!e||e.closed||!Xe.includes(t))return null;if(e.spans.length>=Ke)return e.droppedSpans++,null;let r={stage:t,startMs:e.now()-e.start,durationMs:null,outcome:"pending",status:null};return e.spans.push(r),(n,s=null)=>{e.closed||r.durationMs!==null||(r.durationMs=Math.max(0,e.now()-e.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(s)&&s>=100&&s<=599?s:null)}}import $ from"node:net";import Ze from"node:dns";var qe=new Set(["localhost","metadata.google.internal","metadata.goog"]);function q(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=o=>{if(!o)return[];let p=o.split(":"),T=p.at(-1);if(T?.includes(".")){let l=T.split(".").map(Number);if(l.length!==4||l.some(c=>!Number.isInteger(c)||c<0||c>255))return null;p.splice(p.length-1,1,(l[0]<<8|l[1]).toString(16),(l[2]<<8|l[3]).toString(16))}return p.some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:p.map(l=>Number.parseInt(l,16))},[n,s]=e.split("::"),u=r(n),a=r(s);if(!u||!a)return null;let d=e.includes("::"),i=8-u.length-a.length;if(!d&&i!==0||d&&i<1)return null;let h=[...u,...Array(Math.max(0,i)).fill(0),...a];return h.length!==8?null:Uint8Array.from(h.flatMap(o=>[o>>8,o&255]))}function ne(t,e,r){let n=Math.floor(r/8),s=r%8;for(let a=0;a<n;a+=1)if(t[a]!==e[a])return!1;if(!s)return!0;let u=255<<8-s;return(t[n]&u)===(e[n]&u)}function oe(t){if($.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if($.isIPv6(t)){let e=q(t);if(!e)return!1;let r=q("::ffff:0:0");return ne(e,r,96)?oe([...e.slice(12)].join(".")):ne(e,q("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([s,u])=>ne(e,q(s),u)):!1}return!1}function Qe(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(qe.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=$.isIP(r);return n!==0&&!oe(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function se(t,{lookupFn:e=Ze.promises.lookup}={}){let r=Qe(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:$.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await e(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(s=>!oe(s.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function et(t=process.env){let e=t.ORACLE_HOSTED_EGRESS_PROXY||"";if(!e)return null;let r;try{r=new URL(e)}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=t.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 ae({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n,s;try{s=await e(),r=s.Agent,n=s.fetch}catch(l){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${l?.message||l}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)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 u=l=>String(l).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),a=new Map,d=l=>(Array.isArray(l)?l:[l]).map(c=>typeof c=="string"?{address:c}:c).filter(c=>c&&c.address).map(c=>({address:c.address,family:c.family||($.isIPv6(c.address)?6:4)})),i=(l,c,g)=>{a.set(u(l),d(typeof c=="string"?[{address:c,family:g}]:c))},h=l=>{let c=u(l);if($.isIP(c))return[{address:c,family:$.isIPv6(c)?6:4}];let g=a.get(c);if(!g||!g.length)throw new Error(`refused: unpinned host ${l} during pinned fetch`);return g},o=et(),p=o&&typeof s.ProxyAgent=="function"?new s.ProxyAgent({uri:o.uri,token:`Bearer ${o.token}`,connectTimeout:1e4}):new r({connect:{lookup(l,c,g){let m;try{m=h(l)}catch(O){return g(O)}return c?.all?g(null,m):g(null,m[0].address,m[0].family)}}}),T=tt((l,c={})=>n(l,{...c,dispatcher:p}),i);return{dispatcher:p,fetch:T,pin:i,resolve:h,async close(){try{await p.destroy()}catch{}}}}var ie=Symbol.for("oracle.egressGuard.pinCapableFetch");function tt(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[ie]=Object.freeze({pin:e}),t}function ce(t){return typeof t=="function"&&typeof t[ie]?.pin=="function"}function Ee(t,e,r){if(!ce(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[ie].pin(e,r)}var nt=new Set([408,425,429,500,502,503,504]),Oe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),ot=2,Se=4e3,st=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,at=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,it=AbortSignal.prototype.throwIfAborted,ct=EventTarget.prototype.addEventListener,Pe=EventTarget.prototype.removeEventListener,Re=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,W=t=>t?st.call(t):!1,ut=t=>t?at.call(t):void 0,lt=new Set([301,302,303,307,308]),ee=3,rr=64*1024,k=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function E(t){return N(`HTTP JSON body refused: ${t}`)}function ft(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof H[e]=="function"&&H[e](t))}function dt(t){let e=[],r=0,n=0,s=0,u=0,a=new WeakSet,d=o=>{if(r+=Buffer.byteLength(o,"utf8"),r>k.bytes)throw E("serialized byte limit exceeded");e.push(o)},i=o=>{if(Buffer.byteLength(o,"utf8")>k.bytes)throw E("serialized byte limit exceeded");return JSON.stringify(o)},h=(o,p)=>{if(n+=1,n>k.nodes)throw E("node limit exceeded");if(p>k.depth)throw E("depth limit exceeded");if(o===null){d("null");return}if(typeof o=="string"){d(i(o));return}if(typeof o=="boolean"){d(o?"true":"false");return}if(typeof o=="number"){if(!Number.isFinite(o))throw E("non-finite number");d(Object.is(o,-0)?"0":String(o));return}if(typeof o!="object")throw E("unsupported non-JSON value");if(H.isProxy(o))throw E("proxy value");if(ft(o))throw E("unsupported exotic object");if(a.has(o))throw E("cyclic value");a.add(o);try{if(Object.getOwnPropertySymbols(o).length>0)throw E("symbol-keyed fields are unsupported");if(Array.isArray(o)){let c=Object.getPrototypeOf(o),g=0;for(;c!==null;){if(H.isProxy(c))throw E("proxy array prototype");if(g+=1,g>k.depth)throw E("array prototype depth limit exceeded");c=Object.getPrototypeOf(c)}if(o.length>k.arrayLength)throw E("array length limit exceeded");for(let O=0;O<o.length;O+=1){let L=Object.getOwnPropertyDescriptor(o,String(O));if(!L||!Object.hasOwn(L,"value")||L.enumerable!==!0)throw E("array entries must be dense enumerable own data")}let m=0;for(let O in o){if(u+=1,u>k.fields)throw E("enumeration limit exceeded");if(Object.hasOwn(o,O)&&(m+=1,m>o.length))throw E("named array fields are unsupported")}if(m!==o.length)throw E("array entries must be dense enumerable own data");d("[");for(let O=0;O<o.length;O+=1)O&&d(","),h(Object.getOwnPropertyDescriptor(o,String(O)).value,p+1);d("]");return}let T=Object.getPrototypeOf(o);if(T!==Object.prototype&&T!==null)throw E("non-plain object");let l=[];for(let c in o){if(u+=1,u>k.fields)throw E("enumeration limit exceeded");if(!Object.hasOwn(o,c))continue;if(s+=1,s>k.fields)throw E("field limit exceeded");let g=Object.getOwnPropertyDescriptor(o,c);if(!g||!Object.hasOwn(g,"value")||g.enumerable!==!0)throw E("object fields must be enumerable own data");l.push([c,g.value])}d("{");for(let c=0;c<l.length;c+=1)c&&d(","),d(i(l[c][0])),d(":"),h(l[c][1],p+1);d("}")}finally{a.delete(o)}};return h(t,0),e.join("")}function pt(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(H.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let s=n.toLowerCase();if(r.has(s))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(s);let u=Object.getOwnPropertyDescriptor(t,n);if(!u||!Object.hasOwn(u,"value"))throw new TypeError("HTTP headers must contain own data properties");let a=u.value;if(a==null||["object","function","symbol"].includes(typeof a))throw new TypeError("HTTP header values must be scalar");e[n]=String(a)}return e}function ht(){return Object.assign(Object.create(null),{Accept:"application/json"})}function mt(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function yt(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var ue=new Map,xe=new WeakMap,Ae=1;function Q(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=xe.get(t);return e||(e=Ae,Ae+=1,xe.set(t,e)),`reference:${e}`}var wt=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),bt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function _e(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?wt.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function ve(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(_e);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return _e(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&bt.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function gt(t,e,r,n={},s=null){let u=rt("sha256"),a=(i,h)=>{let o=String(h);u.update(String(Buffer.byteLength(i,"utf8"))).update(":").update(i),u.update("=").update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o).update(`
|
|
2
|
+
`)};a("method",t),a("url",e),Object.keys(r||{}).map((i,h)=>({name:i.toLowerCase(),order:h,value:String(r[i])})).sort((i,h)=>i.name.localeCompare(h.name)||i.order-h.order).forEach((i,h)=>{a(`header-name-${h}`,i.name),a(`header-value-${h}`,i.value)}),a("body",s??"-");for(let i of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])a(`context-${i}`,n[i]??"-");return u.digest("hex")}function Tt(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Se):Math.min(250*2**t,Se)+Math.floor(Math.random()*100)}var Et=t=>new Promise(e=>setTimeout(e,t));function N(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function le(t,e,r){return N(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function B(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function Ot(t){return t?t.byteLength??t.length??0:0}async function St(t,e,{url:r,truncate:n=!1,onOversize:s}={}){if(e==null)return await t.text();let u=Number(t.headers?.get?.("content-length"));if(Number.isFinite(u)&&u>e&&(B(t),!n))throw le(r,`content-length ${u}`,e);let a=t.body?.getReader?.();if(!a){let p=await t.text(),T=Buffer.byteLength(p,"utf8");if(T>e){if(!n)throw le(r,`body ${T} bytes`,e);return Buffer.from(p,"utf8").subarray(0,e).toString("utf8")}return p}let d=[],i=0,h=!1;try{for(;;){let{value:p,done:T}=await a.read();if(T)break;if(p&&(d.push(Buffer.from(p)),i+=Ot(p),i>e)){h=!0;break}}}finally{if(h)try{await a.cancel()}catch{}try{a.releaseLock?.()}catch{}}if(h&&(typeof s=="function"&&s(),!n))throw le(r,`streamed ${i} bytes`,e);let o=Buffer.concat(d);return(h?o.subarray(0,e):o).toString("utf8")}function Pt(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Rt(t,{fetchImpl:e,method:r,headers:n,body:s,timeoutMs:u,lookupFn:a,realFetch:d,untrustedUrl:i=!1,maxResponseBytes:h=null,sameOriginRedirectsOnly:o=!1,importUndici:p,validateResponse:T,signal:l,redirectPolicy:c="follow",maxRedirects:g=ee}){let m=null,O=e,L=a?{lookupFn:a}:{};if(i&&!d&&!ce(O))throw N(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let A=new AbortController,I=setTimeout(()=>A.abort(),u),z=l?Re?Re([l,A.signal]):l:A.signal,G=async(y,{status:P=null}={})=>{let R=await se(y,L);if(!R.ok)throw N(P==null?`HTTP refused ${y}: ${R.error}`:`HTTP redirect to ${y} ${R.error}`,P==null?{}:{status:P});let M=new URL(y).hostname;if(d){if(m&&(await m.close(),m=null),!m)try{m=await ae({requireUndici:!0,...p?{importUndici:p}:{}})}catch(f){throw N(P==null?`HTTP refused ${y}: ${f?.message||f}`:`HTTP redirect to ${y} refused: ${f?.message||f}`,P==null?{}:{status:P})}m.pin(M,R.addresses),O=m.fetch}else Ee(O,M,R.addresses);return R};try{let y=String(t),P=Object.assign(Object.create(null),n||{});i&&await G(y);for(let R=0;R<=g;R+=1){let M=Object.assign(Object.create(null),{method:r,headers:P,body:s,signal:z,redirect:"manual",dispatcher:void 0}),f=await O(y,M);if((c==="error"||g===0)&&f.status>=300&&f.status<400)throw B(f),N(`HTTP ${f.status} ${r} redirect refused`,{status:f.status,redirectRefused:!0});if(lt.has(f.status)){let _=o===!0&&r==="POST"&&[307,308].includes(f.status)&&ve(r,s);if(r!=="GET"&&r!=="HEAD"&&!_){B(f);let S=new Error(`HTTP ${f.status} ${r} ${y} redirected non-idempotent request`);throw S.status=f.status,S}if(R===g)throw B(f),N(`HTTP ${f.status} ${r} redirect budget exhausted`,{status:f.status,redirectRefused:!0});let ye=f.headers?.get?.("location"),v;try{v=mt(ye,y)}catch(S){throw B(f),S}let j=!yt(v,y);if(B(f),j&&r==="POST"){let S=new Error(`HTTP ${f.status} ${r} cross-origin redirect refused`);throw S.status=f.status,S}if(j&&o){let S=new Error(`HTTP ${f.status} ${r} cross-origin redirect refused`);throw S.status=f.status,S.retryable=!1,S}if(j&&(P=ht(P)),i)await G(v,{status:f.status});else if(j){let S=await se(v,L);if(!S.ok){let b=new Error(`HTTP redirect from ${y} ${S.error}`);throw b.status=f.status,b.retryable=!1,b}d&&S.addresses?.length&&(m||(m=await ae(p?{importUndici:p}:{})),m&&(m.pin(new URL(v).hostname,S.addresses),O=m.fetch))}y=v;continue}if(typeof T=="function")try{await T(f,{url:y})}catch(_){throw B(f),N(_?.message||String(_))}let x=await St(f,h,{url:y,onOversize:()=>A.abort()}),V=Pt(x);if(!f.ok){let _=new Error(`HTTP ${f.status} ${r} ${y}`);throw _.status=f.status,_.retryAfter=f.headers?.get?.("retry-after")??null,_.body=V??x.slice(0,300),_}return V??x}throw new Error(`HTTP redirect loop for ${t}`)}catch(y){if(A.signal.aborted&&!W(l)){let P=y&&(typeof y=="object"||typeof y=="function")&&!H.isProxy(y)?y:null,R=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(R&&Object.hasOwn(R,"value")&&R.value===!0))try{if(!P)throw new TypeError("unsafe rejection");Object.defineProperties(P,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let f=new Error("HTTP request timed out");throw Object.defineProperties(f,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),f}}throw y}finally{clearTimeout(I),m&&await m.close()}}async function Ie(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&H.isProxy(e))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(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let b of Object.getOwnPropertyNames(e)){let w=Object.getOwnPropertyDescriptor(e,b);if(!(b==="toJSON"&&w&&Object.hasOwn(w,"value")&&w.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!w||!w.enumerable||!Object.hasOwn(w,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(e==null||!Object.hasOwn(e,b))return;let w=Object.getOwnPropertyDescriptor(e,b);if(!w||!Object.hasOwn(w,"value"))throw new TypeError("HTTP options must contain own data properties");return w.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let s=n("method");if(s!==void 0&&(typeof s!="string"||!/^[A-Za-z]+$/u.test(s)))throw new TypeError("HTTP method must be a string token");let u=n("timeoutMs");if(u!==void 0&&(!Number.isInteger(u)||u<1||u>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let a=n("retries");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>10))throw new TypeError("HTTP retries must be a bounded integer");let d=n("redirectPolicy");if(d!==void 0&&d!=="follow"&&d!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let i=n("maxRedirects");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>ee))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ee}`);if(d==="error"&&i!==void 0&&i!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let h=d??"follow",o=h==="error"?0:i??ee;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let w=n(b);if(w!==void 0&&typeof w!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let p=n("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let T=n("signal");if(T!==void 0){if(H.isProxy(T)||!(T instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{W(T)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let w=n(b);if(w!==void 0&&typeof w!="function")throw new TypeError(`HTTP ${b} must be a function`)}let l=n("fetchImpl"),c=l||globalThis.fetch;if(typeof c!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let g=u??12e3,m=(s||"GET").toUpperCase(),O=n("headers"),L=pt(O),A=Object.assign(Object.create(null),L);Object.keys(A).some(b=>b.toLowerCase()==="accept")||(A.Accept="application/json");let I=n("body");I!=null&&typeof I!="string"&&(Object.keys(A).find(w=>w.toLowerCase()==="content-type")||(A["Content-Type"]="application/json"),I=dt(I));let z=a??ot,G=n("lookupFn"),y=!l,P=n("untrustedUrl")===!0,R=n("sameOriginRedirectsOnly")===!0,M=n("importUndici"),f=n("validateResponse"),x=T,V=p??null,_=async()=>{let b;for(let w=0;w<=z;w++){x&&it.call(x);let we=Z("http");try{let C=await Rt(t,{fetchImpl:c,method:m,headers:A,body:I,timeoutMs:g,lookupFn:G,realFetch:y,untrustedUrl:P,maxResponseBytes:V,sameOriginRedirectsOnly:R,importUndici:M,validateResponse:f,signal:x,redirectPolicy:h,maxRedirects:o});return we?.("succeeded"),C}catch(C){b=C;let F=re=>{if(!C||typeof C!="object"&&typeof C!="function"||H.isProxy(C))return;let J=Object.getOwnPropertyDescriptor(C,re);return J&&Object.hasOwn(J,"value")?J.value:void 0},K=F("status");we?.("failed",K);let ze=F("oracleTimeout")===!0||F("name")==="AbortError"||F("name")==="TimeoutError"||W(x),Ge=new Set([408,425,429]),Ve=F("retryable")===!1?!1:K!=null?Ge.has(K)||nt.has(K)&&Oe.has(m):!ze&&Oe.has(m);if(w===z||!Ve)throw C;let be=Tt(w,F("retryAfter")),Je=Z("retry"),ge=!1;try{x?await new Promise((re,J)=>{let Te,Y=()=>{clearTimeout(Te),Pe.call(x,"abort",Y),J(ut(x)||new DOMException("Aborted","AbortError"))};if(W(x)){Y();return}Te=setTimeout(()=>{Pe.call(x,"abort",Y),re()},be),ct.call(x,"abort",Y,{once:!0}),W(x)&&Y()}):await Et(be),ge=!0}finally{Je?.(ge?"succeeded":"failed")}}}throw b};if(!(n("dedupe")!==!1&&!x&&ve(m,I)))return _();let v=gt(m,t,A,{untrustedUrl:P,maxResponseBytes:V,sameOriginRedirectsOnly:R,redirectPolicy:h,maxRedirects:o,timeoutMs:g,retries:z,fetchImpl:Q(c),realFetch:y,lookupFn:Q(G),importUndici:Q(M),validateResponse:Q(f)},I),j=ue.get(v);if(j){let b=Z("shared");try{let w=await j;return b?.("succeeded"),w}catch(w){throw b?.("failed"),w}}let S=_().finally(()=>ue.delete(v));return ue.set(v,S),S}var Ce={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}},xt=new Map(Object.values(Ce).map(t=>[t.chainId,t]));function ke(t){return xt.get(Number(t))||null}function He(t,e=process.env){let r=ke(t);if(!r)return null;for(let n of r.rpcEnv){let s=(e[n]||"").trim();if(s)return s}return null}import{Interface as At,getAddress as ur}from"ethers";var lr=new At(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var _t={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function vt(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=He(t,r);return n||_t[Number(t)]||null}var It=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Ct(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!It.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}var X=new Map,Le=new Map;function kt(t){let e=new Error(t?.message||JSON.stringify(t));return e.code=t?.code,e}function Ht(t){if(t?.error)throw kt(t.error);return t?.result}function Lt(t,e,r){return`${t}
|
|
3
3
|
${e}
|
|
4
|
-
${JSON.stringify(r??[])}`}async function
|
|
4
|
+
${JSON.stringify(r??[])}`}async function Mt(t,e,r){return Ie(t,{method:"POST",body:e,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function Me(t,e,r=[],n={}){let s=String(e||""),u=Ct(s),a=vt(t,n);if(!a)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);if(u==="eth_chainid"&&n.cacheChainId!==!1){let o=Le.get(a);if(o!=null)return o}let i=n.dedupe!==!1&&!n.signal?Lt(a,s,r):null;if(i&&X.has(i))return X.get(i);let h=(async()=>{let o=await Mt(a,{jsonrpc:"2.0",id:1,method:e,params:r},n),p=Ht(o);return u==="eth_chainid"&&typeof p=="string"&&Le.set(a,p),p})();return i&&(X.set(i,h),h.finally(()=>{X.get(i)===h&&X.delete(i)}).catch(()=>{})),h}var pe=999,de=1,Nt=8453,Ne="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",jt="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",je="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",$t="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Bt=".80002105.reverse",$e=/^0x[a-fA-F0-9]{40}$/,he=new TextEncoder,Be=t=>"0x"+Buffer.from(t).toString("hex"),U=t=>Be(fe(he.encode(t))).slice(0,10),Ue=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function te(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=fe(he.encode(r)),s=new Uint8Array(64);s.set(e,0),s.set(n,32),e=fe(s)}return Be(e)}function me(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let s=e.slice(r+64,r+64+n*2);return Buffer.from(s,"hex").toString("utf8")}catch{return""}}function hr(t){let e=he.encode(String(t)),r=e.length.toString(16).padStart(64,"0"),n=Buffer.from(e).toString("hex").padEnd(Math.ceil(e.length/32)*64,"0");return"0000000000000000000000000000000000000000000000000000000000000020"+r+n}async function D(t,e,r){try{return await Me(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function Ut(t){let e=await D(pe,Ne,U("primaryName(address)")+Ue(t)),r=me(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function Dt(t){let e=await D(pe,jt,U("getName(address)")+Ue(t)),r=me(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function De(t,e,r){let n=await D(t,r,U("name(bytes32)")+e.slice(2));return me(n)||null}async function Ft(t){let e=te(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await D(de,je,U("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:De(de,e,n)}async function zt(t){let e=te(t.slice(2).toLowerCase()+Bt);return De(Nt,e,$t)}var Fe=[{source:"hl",fn:Ut},{source:"hype",fn:Dt},{source:"ens",fn:Ft},{source:"basename",fn:zt}];async function mr(t){if(!$e.test(String(t||"").trim()))return null;let e=String(t).trim();return(await Promise.all(Fe.map(async({source:n,fn:s})=>{try{let u=await s(e);return u?{name:u,source:n,address:e}:null}catch{return null}}))).find(Boolean)||null}async function Gt(t){let e=te(t),r=await D(pe,Ne,U("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function Vt(t,e,r){let n=te(e),s=await D(t,r,U("resolver(bytes32)")+n.slice(2));if(!s)return null;let u="0x"+s.slice(-40);if(/^0x0+$/.test(u))return null;let a=await D(t,u,U("addr(bytes32)")+n.slice(2));if(!a)return null;let d="0x"+a.slice(-40);return/^0x0+$/.test(d)?null:d}async function Jt(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Gt(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await Vt(de,e,je);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}async function yr(t){let e=String(t||"").trim();return $e.test(e)?{address:e,source:"address",name:null}:Jt(e)}var wr=Fe.map(t=>t.source);export{$e as ADDRESS_RE,wr as NAME_SOURCES,me as decodeAbiString,hr as encodeAbiString,mr as lookupName,te as namehash,Jt as resolveName,yr as toAddress};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createHash as bt}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 u=c.split(":"),p=u.at(-1);if(p?.includes(".")){let f=p.split(".").map(Number);if(f.length!==4||f.some(m=>!Number.isInteger(m)||m<0||m>255))return null;u.splice(u.length-1,1,(f[0]<<8|f[1]).toString(16),(f[2]<<8|f[3]).toString(16))}return u.some(f=>!/^[0-9a-f]{1,4}$/.test(f))?null:u.map(f=>Number.parseInt(f,16))},[n,o]=t.split("::"),s=r(n),l=r(o);if(!s||!l)return null;let d=t.includes("::"),i=8-s.length-l.length;if(!d&&i!==0||d&&i<1)return null;let a=[...s,...Array(Math.max(0,i)).fill(0),...l];return a.length!==8?null:Uint8Array.from(a.flatMap(c=>[c>>8,c&255]))}function 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;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}}async function ge({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let u=await t();r=u.Agent,n=u.fetch}catch(u){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${u?.message||u}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=u=>String(u).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,l=u=>(Array.isArray(u)?u:[u]).map(p=>typeof p=="string"?{address:p}:p).filter(p=>p&&p.address).map(p=>({address:p.address,family:p.family||(V.isIPv6(p.address)?6:4)})),d=(u,p,f)=>{s.set(o(u),l(typeof p=="string"?[{address:p,family:f}]:p))},i=u=>{let p=o(u);if(V.isIP(p))return[{address:p,family:V.isIPv6(p)?6:4}];let f=s.get(p);if(!f||!f.length)throw new Error(`refused: unpinned host ${u} during pinned fetch`);return f},a=new r({connect:{lookup(u,p,f){let m;try{m=i(u)}catch(I){return f(I)}return p?.all?f(null,m):f(null,m[0].address,m[0].family)}}}),c=yt((u,p={})=>n(u,{...p,dispatcher:a}),d);return{dispatcher:a,fetch:c,pin:d,resolve:i,async close(){try{await a.destroy()}catch{}}}}var we=Symbol.for("oracle.egressGuard.pinCapableFetch");function yt(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 Ne(e,t,r){if(!ye(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[we].pin(t,r)}var xt=new Set([408,425,429,500,502,503,504]),Re=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Et=2,Le=4e3,It=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,kt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,St=AbortSignal.prototype.throwIfAborted,At=EventTarget.prototype.addEventListener,Ce=EventTarget.prototype.removeEventListener,Me=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Q=e=>e?It.call(e):!1,vt=e=>e?kt.call(e):void 0,Pt=new Set([301,302,303,307,308]),se=3,jr=64*1024,$=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function E(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 Ot(e){let t=[],r=0,n=0,o=0,s=0,l=new WeakSet,d=c=>{if(r+=Buffer.byteLength(c,"utf8"),r>$.bytes)throw E("serialized byte limit exceeded");t.push(c)},i=c=>{if(Buffer.byteLength(c,"utf8")>$.bytes)throw E("serialized byte limit exceeded");return JSON.stringify(c)},a=(c,u)=>{if(n+=1,n>$.nodes)throw E("node limit exceeded");if(u>$.depth)throw E("depth limit exceeded");if(c===null){d("null");return}if(typeof c=="string"){d(i(c));return}if(typeof c=="boolean"){d(c?"true":"false");return}if(typeof c=="number"){if(!Number.isFinite(c))throw E("non-finite number");d(Object.is(c,-0)?"0":String(c));return}if(typeof c!="object")throw E("unsupported non-JSON value");if(F.isProxy(c))throw E("proxy value");if(Tt(c))throw E("unsupported exotic object");if(l.has(c))throw E("cyclic value");l.add(c);try{if(Object.getOwnPropertySymbols(c).length>0)throw E("symbol-keyed fields are unsupported");if(Array.isArray(c)){let m=Object.getPrototypeOf(c),I=0;for(;m!==null;){if(F.isProxy(m))throw E("proxy array prototype");if(I+=1,I>$.depth)throw E("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(c.length>$.arrayLength)throw E("array length limit exceeded");for(let x=0;x<c.length;x+=1){let _=Object.getOwnPropertyDescriptor(c,String(x));if(!_||!Object.hasOwn(_,"value")||_.enumerable!==!0)throw E("array entries must be dense enumerable own data")}let g=0;for(let x in c){if(s+=1,s>$.fields)throw E("enumeration limit exceeded");if(Object.hasOwn(c,x)&&(g+=1,g>c.length))throw E("named array fields are unsupported")}if(g!==c.length)throw E("array entries must be dense enumerable own data");d("[");for(let x=0;x<c.length;x+=1)x&&d(","),a(Object.getOwnPropertyDescriptor(c,String(x)).value,u+1);d("]");return}let p=Object.getPrototypeOf(c);if(p!==Object.prototype&&p!==null)throw E("non-plain object");let f=[];for(let m in c){if(s+=1,s>$.fields)throw E("enumeration limit exceeded");if(!Object.hasOwn(c,m))continue;if(o+=1,o>$.fields)throw E("field limit exceeded");let I=Object.getOwnPropertyDescriptor(c,m);if(!I||!Object.hasOwn(I,"value")||I.enumerable!==!0)throw E("object fields must be enumerable own data");f.push([m,I.value])}d("{");for(let m=0;m<f.length;m+=1)m&&d(","),d(i(f[m][0])),d(":"),a(f[m][1],u+1);d("}")}finally{l.delete(c)}};return a(e,0),t.join("")}function _t(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 Nt(){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 Lt(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var be=new Map,De=new WeakMap,$e=1;function ie(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=De.get(e);return t||(t=$e,$e+=1,De.set(e,t)),`reference:${t}`}var Ct=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Mt=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Fe(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?Ct.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 Be(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(Fe);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Fe(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&Mt.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function Dt(e,t,r,n={},o=null){let s=bt("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 $t(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Le):Math.min(250*2**e,Le)+Math.floor(Math.random()*100)}var Ft=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 Bt(e){return e?e.byteLength??e.length??0:0}async function Ut(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 u=await e.text(),p=Buffer.byteLength(u,"utf8");if(p>t){if(!n)throw xe(r,`body ${p} bytes`,t);return Buffer.from(u,"utf8").subarray(0,t).toString("utf8")}return u}let d=[],i=0,a=!1;try{for(;;){let{value:u,done:p}=await l.read();if(p)break;if(u&&(d.push(Buffer.from(u)),i+=Bt(u),i>t)){a=!0;break}}}finally{if(a)try{await l.cancel()}catch{}try{l.releaseLock?.()}catch{}}if(a&&(typeof o=="function"&&o(),!n))throw xe(r,`streamed ${i} bytes`,t);let c=Buffer.concat(d);return(a?c.subarray(0,t):c).toString("utf8")}function Ht(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function jt(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:s,lookupFn:l,realFetch:d,untrustedUrl:i=!1,maxResponseBytes:a=null,sameOriginRedirectsOnly:c=!1,importUndici:u,validateResponse:p,signal:f,redirectPolicy:m="follow",maxRedirects:I=se}){let g=null,x=t,_=l?{lookupFn:l}:{};if(i&&!d&&!ye(x))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,R=setTimeout(()=>T.abort(),s),J=f?Me?Me([f,T.signal]):f:T.signal,W=async(w,{status:S=null}={})=>{let v=await he(w,_);if(!v.ok)throw H(S==null?`HTTP refused ${w}: ${v.error}`:`HTTP redirect to ${w} ${v.error}`,S==null?{}:{status:S});let U=new URL(w).hostname;if(d){if(g&&(await g.close(),g=null),!g)try{g=await ge({requireUndici:!0,...u?{importUndici:u}:{}})}catch(h){throw H(S==null?`HTTP refused ${w}: ${h?.message||h}`:`HTTP redirect to ${w} refused: ${h?.message||h}`,S==null?{}:{status:S})}g.pin(U,v.addresses),x=g.fetch}else Ne(x,U,v.addresses);return v};try{let w=String(e),S=Object.assign(Object.create(null),n||{});i&&await W(w);for(let v=0;v<=I;v+=1){let U=Object.assign(Object.create(null),{method:r,headers:S,body:o,signal:J,redirect:"manual",dispatcher:void 0}),h=await x(w,U);if((m==="error"||I===0)&&h.status>=300&&h.status<400)throw G(h),H(`HTTP ${h.status} ${r} redirect refused`,{status:h.status,redirectRefused:!0});if(Pt.has(h.status)){let N=c===!0&&r==="POST"&&[307,308].includes(h.status)&&Be(r,o);if(r!=="GET"&&r!=="HEAD"&&!N){G(h);let k=new Error(`HTTP ${h.status} ${r} ${w} redirected non-idempotent request`);throw k.status=h.status,k}if(v===I)throw G(h),H(`HTTP ${h.status} ${r} redirect budget exhausted`,{status:h.status,redirectRefused:!0});let ve=h.headers?.get?.("location"),L;try{L=Rt(ve,w)}catch(k){throw G(h),k}let z=!Lt(L,w);if(G(h),z&&r==="POST"){let k=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw k.status=h.status,k}if(z&&c){let k=new Error(`HTTP ${h.status} ${r} cross-origin redirect refused`);throw k.status=h.status,k.retryable=!1,k}if(z&&(S=Nt(S)),i)await W(L,{status:h.status});else if(z){let k=await he(L,_);if(!k.ok){let b=new Error(`HTTP redirect from ${w} ${k.error}`);throw b.status=h.status,b.retryable=!1,b}d&&k.addresses?.length&&(g||(g=await ge(u?{importUndici:u}:{})),g&&(g.pin(new URL(L).hostname,k.addresses),x=g.fetch))}w=L;continue}if(typeof p=="function")try{await p(h,{url:w})}catch(N){throw G(h),H(N?.message||String(N))}let P=await Ut(h,a,{url:w,onOversize:()=>T.abort()}),X=Ht(P);if(!h.ok){let N=new Error(`HTTP ${h.status} ${r} ${w}`);throw N.status=h.status,N.retryAfter=h.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(w){if(T.signal.aborted&&!Q(f)){let S=w&&(typeof w=="object"||typeof w=="function")&&!F.isProxy(w)?w: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 h=new Error("HTTP request timed out");throw Object.defineProperties(h,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),h}}throw w}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 b of Object.getOwnPropertyNames(t)){let y=Object.getOwnPropertyDescriptor(t,b);if(!(b==="toJSON"&&y&&Object.hasOwn(y,"value")&&y.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!y||!y.enumerable||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(t==null||!Object.hasOwn(t,b))return;let y=Object.getOwnPropertyDescriptor(t,b);if(!y||!Object.hasOwn(y,"value"))throw new TypeError("HTTP options must contain own data properties");return y.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let s=n("timeoutMs");if(s!==void 0&&(!Number.isInteger(s)||s<1||s>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let l=n("retries");if(l!==void 0&&(!Number.isInteger(l)||l<0||l>10))throw new TypeError("HTTP retries must be a bounded integer");let d=n("redirectPolicy");if(d!==void 0&&d!=="follow"&&d!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let i=n("maxRedirects");if(i!==void 0&&(!Number.isInteger(i)||i<0||i>se))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${se}`);if(d==="error"&&i!==void 0&&i!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let a=d??"follow",c=a==="error"?0:i??se;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let y=n(b);if(y!==void 0&&typeof y!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let u=n("maxResponseBytes");if(u!==void 0&&(!Number.isInteger(u)||u<1||u>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let p=n("signal");if(p!==void 0){if(F.isProxy(p)||!(p instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Q(p)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let y=n(b);if(y!==void 0&&typeof y!="function")throw new TypeError(`HTTP ${b} must be a function`)}let f=n("fetchImpl"),m=f||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let I=s??12e3,g=(o||"GET").toUpperCase(),x=n("headers"),_=_t(x),T=Object.assign(Object.create(null),_);Object.keys(T).some(b=>b.toLowerCase()==="accept")||(T.Accept="application/json");let R=n("body");R!=null&&typeof R!="string"&&(Object.keys(T).find(y=>y.toLowerCase()==="content-type")||(T["Content-Type"]="application/json"),R=Ot(R));let J=l??Et,W=n("lookupFn"),w=!f,S=n("untrustedUrl")===!0,v=n("sameOriginRedirectsOnly")===!0,U=n("importUndici"),h=n("validateResponse"),P=p,X=u??null,N=async()=>{let b;for(let y=0;y<=J;y++){P&&St.call(P);let Pe=ne("http");try{let D=await jt(e,{fetchImpl:m,method:g,headers:T,body:R,timeoutMs:I,lookupFn:W,realFetch:w,untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:v,importUndici:U,validateResponse:h,signal:P,redirectPolicy:a,maxRedirects:c});return Pe?.("succeeded"),D}catch(D){b=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");Pe?.("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)||xt.has(re)&&Re.has(g):!at&&Re.has(g);if(y===J||!lt)throw D;let Te=$t(y,K("retryAfter")),ut=ne("retry"),Oe=!1;try{P?await new Promise((pe,Y)=>{let _e,Z=()=>{clearTimeout(_e),Ce.call(P,"abort",Z),Y(vt(P)||new DOMException("Aborted","AbortError"))};if(Q(P)){Z();return}_e=setTimeout(()=>{Ce.call(P,"abort",Z),pe()},Te),At.call(P,"abort",Z,{once:!0}),Q(P)&&Z()}):await Ft(Te),Oe=!0}finally{ut?.(Oe?"succeeded":"failed")}}}throw b};if(!(n("dedupe")!==!1&&!P&&Be(g,R)))return N();let L=Dt(g,e,T,{untrustedUrl:S,maxResponseBytes:X,sameOriginRedirectsOnly:v,redirectPolicy:a,maxRedirects:c,timeoutMs:I,retries:J,fetchImpl:ie(m),realFetch:w,lookupFn:ie(W),importUndici:ie(U),validateResponse:ie(h)},R),z=be.get(L);if(z){let b=ne("shared");try{let y=await z;return b?.("succeeded"),y}catch(y){throw b?.("failed"),y}}let k=N().finally(()=>be.delete(L));return be.set(L,k),k}var qt="https://yields.llama.fi";async function Ue(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,d)=>Number(d.tvlUsd||0)-Number(l.tvlUsd||0));let s=Math.min(5e3,Math.max(1,Number(e.limit||o.length||1)));return{...n,data:o.slice(0,s)}}var Gr=300*1e3,Kr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{types as He}from"node:util";function zt(e){if(!e||typeof e!="object"||He.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(He.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(!zt(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 Vt="https://api.hyperliquid.xyz/info",Gt="https://api.hyperliquid-testnet.xyz/info";function Kt({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"?Gt:Vt}async function ce(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=Kt(t);return ae(await A(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly}),"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 Jt=24*365,Wt=8;function B(e){if(e==null)return null;let t=Number(e);return Number.isFinite(t)?t:null}function Xt(e,t){return e==null||t==null||t===0?null:(e-t)/t*100}async function je(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]:[],d=o.map((i,a)=>{let c=s[a]||{},u=B(c.markPx),p=B(c.prevDayPx),f=B(c.openInterest),m=B(c.funding);return{coin:i.name,index:a,markPx:u,oraclePx:B(c.oraclePx),midPx:B(c.midPx)??B(n?.[i.name]),prevDayPx:p,change24hPct:Xt(u,p),dayNtlVolumeUsd:B(c.dayNtlVlm),premium:B(c.premium),fundingRate:m,fundingRateAprPct:m==null?null:m*(Jt/Wt)*100,openInterestCoin:f,openInterestUsd:f==null||u==null?null:f*u,maxLeverage:i.maxLeverage??null,szDecimals:i.szDecimals??null,isDelisted:!!i.isDelisted}}).filter(i=>!i.isDelisted);return{provider:"hl-info",venue:"hyperliquid",kind:"market-datapoints",asOfMs:Date.now(),count:d.length,markets:d,totals:{openInterestUsd:d.reduce((i,a)=>i+(a.openInterestUsd||0),0),dayNtlVolumeUsd:d.reduce((i,a)=>i+(a.dayNtlVolumeUsd||0),0)}}}var an=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});var mn=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"}),hn=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 bn=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 In,JsonRpcProvider as kn}from"ethers";var vn=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var Bn=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),Un=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Hn=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),jn=Object.freeze({CROSS:"cross",ISOLATED:"isolated"});var er="https://indexer.dydx.trade";function ee(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function tr(e){let t=e?.markets;return Array.isArray(t)?t:t&&typeof t=="object"?Object.values(t):[]}async function ze(e=50,t={}){try{let r=await A(`${er}/v4/perpetualMarkets?limit=${e}`,t);return tr(r).map(o=>{let s=ee(o?.nextFundingRate),l=ee(o?.oraclePrice),d=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:d,dayNtlVolumeUsd:i,change24hPct:l&&a!=null?a/l*100:null,oraclePrice:o?.oraclePrice,indexPrice:o?.indexPrice,nextFundingRate:s==null?null:`${(s*100).toFixed(4)}%`,volume24h:o?.volume24H,venue:"dydx",quality:"LIVE"}}).filter(o=>o.ticker)}catch(r){return{error:String(r.message||r).slice(0,200),venue:"dydx",quality:"FAILED"}}}var rr="https://dlob.drift.trade",Ve="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 Ge(e={}){try{let r=(await A(`${rr}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Ve,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:`${Ve} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var nr="https://gateway.prod.vertexprotocol.com/v2",Ke="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified.";async function Je(e={}){try{let r=(await A(`${nr}/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:Ke,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:`${Ke} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}import{Interface as Se,getAddress as uo,isAddress as po}from"ethers";var We={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}},Xn=new Map(Object.values(We).map(e=>[e.chainId,e]));import{Interface as or,getAddress as oo}from"ethers";var io=new or(["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 go=`0x${"0".repeat(64)}`,wo=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),yo=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),bo=new Se(["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"]),xo=new Se(["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)"]),Eo=new Se(["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)"]),Io=Object.freeze({OrderCreated:"created",OrderUpdated:"updated",OrderExecuted:"executed",OrderCancelled:"cancelled",OrderFrozen:"frozen"});function ir(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 sr(e,t={}){let r=ir(e);return(t.baseUrl||r.api).replace(/\/$/,"")}async function Ze(e={},t={}){return A(`${sr(e.chainId??42161,t)}/prices/tickers`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4})}var ar="https://api.aevo.xyz";async function Qe(e={}){try{return(await A(`${ar}/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 lr=Number.MAX_SAFE_INTEGER,Lo=String(lr);var ur="https://mainnet.zklighter.elliot.ai",dr="https://testnet.zklighter.elliot.ai";function pr(e={}){return e.testnet||process.env.LIGHTER_TESTNET==="1"?dr:ur}function le(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function fr(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 mr(e,t){let r=Array.isArray(e?.funding_rates)?e.funding_rates:[],n=Array.isArray(t?.order_book_details)?t.order_book_details:[],o=new Map;for(let l of n){let d=et(l.market_id);d!=null&&o.set(d,l)}let s=[];for(let l of r){if(String(l.exchange||"")!=="lighter")continue;let d=et(l.market_id);if(d==null)continue;let i=o.get(d),a=le(i?.mark_price??i?.index_price),c=le(l.rate),u=String(l.symbol||i?.symbol||"").trim();!u||c==null||!(a>0)||s.push({coin:u,symbol:u,marketIndex:d,funding:c,markPx:a,openInterest: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:fr(c)})}return s}async function hr(e={}){let t=pr(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 hr(e);return{live:!0,source:"Lighter funding-rates + orderBookDetails",markets:mr(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 gr(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 wr(e={}){return{venue:"hl",quality:"LIVE",markets:((await je({},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 yr(e={}){let t=await ze(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 br(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 xr(e={}){let t=await Ge(e);return t?.quality==="FAILED"||t?.error?j("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function Er(e={}){let t=await Je(e);return t?.quality==="FAILED"||t?.error?j("vertex",t.error):{venue:"vertex",quality:"LIVE",markets:[]}}async function Ir(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 kr(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 Ae={hl:wr,lighter:Ir,gmx:br,dydx:yr,aevo:kr,drift:xr,vertex:Er};async function rt(e={},t={}){let r=Array.isArray(e.venues)&&e.venues.length?e.venues.map(a=>String(a).toLowerCase()).filter(a=>Ae[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||Ae,l=await Promise.all(r.map(a=>gr(a,()=>(s[a]||Ae[a])(t)))),d=l.filter(a=>a.quality==="FAILED"),i=l.filter(a=>a.quality!=="FAILED").flatMap(a=>a.markets||[]).filter(a=>a.fundingRateAprPct!=null);return n&&(i=i.filter(a=>a.coin===n)),i.sort((a,c)=>Math.abs(c.fundingRateAprPct)-Math.abs(a.fundingRateAprPct)),Object.freeze({provider:"perp-universal",asOf:new Date().toISOString(),rankedOn:"abs-apr",ranked:i.slice(0,o),failed:d,venuesTried:r,sourcesAnswered:l.filter(a=>a.quality!=="FAILED").length,sourcesTried:r.length,custody:"prepare-only"})}var Sr=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."}]),Ar={"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."},vr={"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."},Pr={"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 q(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=q(e.apy)??0,o=q(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=q(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=q(e.apy)??0,n=q(e.apyBase)??0,o=Math.max(0,q(e.apyReward)??Math.max(0,r-n)),s=Math.max(0,q(e.tvlUsd)??0),l=it(e,t),d=t==="stable-loop"?4:t==="collateral-hedge"?6:0,i=t==="stable-loop"?0:t==="collateral-hedge"?4:5,a=s<5e6?1.2:.5,c=r-d-i-a-l,u=c<1?"Avoid":r>80||s<1e7?"Watchlist":c>=8?"Farmable":"Watchlist",p=O(e.project),f=O(e.symbol),m=O(e.chain);return{id:O(e.pool,`${m}:${p}:${f}`),recipe:t,label:`${p} ${f}`,chain:m,project:p,symbol:f,tvlUsd:s,rewardApr:o,nativeApr:n,estimatedBorrowApr:d,estimatedFundingApr:i,gasApr:a,riskHaircut:l,netApr:c,verdict:u,exposure:O(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:Ar[t],monitor:vr[t],prepareSteps:[`Verify ${p} contracts and reward terms on ${m}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Pr[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 Ue({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),d=Array.isArray(l?.data)?l.data:[],i=d.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:d.length,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",candidates:i,posture:s}}catch(l){return{configured:!1,live:!1,source:"DeFiLlama yields",generatedAt:o,chain:e.chain??"all",considered:0,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",error:String(l?.message||l),candidates:[],posture:s}}}var nt=300,Or="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:q(e)}function _r(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 Nr(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(_r).filter(u=>u!==null).sort((u,p)=>p.fundingAprPct-u.fundingAprPct).slice(0,n);s.set(a,c)}let l=[];for(let i=0;i<n;i+=1)for(let a of C){let c=s.get(a)?.[i];c&&l.push(c)}let d=C.map((i,a)=>{let c=o[a],u=(c?.failed||[]).find(f=>f.venue===i),p=u?"FAILED":c?.sourcesAnswered===1?"LIVE":"UNKNOWN";return Object.freeze({venue:i,quality:p,candidatesReturned:s.get(i)?.length||0,error:u?.error||null})});return Object.freeze({source:"perp-universal fundingAll",asOf:new Date().toISOString(),rankedOn:"positive-gross-funding-apr-desc-per-venue-round-robin",venuesTried:[...C],venueStatuses:d,sourcesAnswered:o.reduce((i,a)=>i+(a?.sourcesAnswered||0),0),sourcesTried:C.length,candidates:l,failed:o.flatMap(i=>i?.failed||[]),posture:Or})}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),d=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),u=r*t*4.33,p=u*s,f=n*4.33*o,m=p+f+l,I=Math.max(0,1-c*.015),g=t*d*i,x=g*(1-a)*I,_=x-m,T=m>0?_/m*100:null,R=t*d>0?m/(t*d*(1-a)*(I||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:n,hourlyCost:o,gasPerTask:s,bridgeMonthly:l,expectedReward:d,probabilityPct:i*100,sybilHaircutPct:a*100,lockupMonths:c},monthlyTasks:u,monthlyGas:p,laborMonthly:f,monthlyCost:m,lockupDiscount:I,grossExpectedValue:g,adjustedExpectedValue:x,netExpectedValue:_,roiPct:T,breakevenProbabilityPct:R,verdict:_>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var oi={FARMING_METHODS:Sr,discoverFarms:Tr,discoverCarry:Nr,scorePool:st,classifyPool:ot,riskHaircut:it,airdropEV:Rr};export{Sr as FARMING_METHODS,Rr as airdropEV,ot as classifyPool,oi as default,Nr 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 Ne(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,Le=4e3,kt=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,St=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,At=AbortSignal.prototype.throwIfAborted,vt=EventTarget.prototype.addEventListener,Ce=EventTarget.prototype.removeEventListener,Me=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 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,De=new WeakMap,$e=1;function ie(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=De.get(e);return t||(t=$e,$e+=1,De.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 Fe(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 Be(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(Fe);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Fe(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,Le):Math.min(250*2**e,Le)+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,R=setTimeout(()=>T.abort(),s),J=p?Me?Me([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 Ne(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)&&Be(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 ve=m.headers?.get?.("location"),L;try{L=Lt(ve,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:()=>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(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),T=Object.assign(Object.create(null),_);Object.keys(T).some(x=>x.toLowerCase()==="accept")||(T.Accept="application/json");let R=n("body");R!=null&&typeof R!="string"&&(Object.keys(T).find(b=>b.toLowerCase()==="content-type")||(T["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 Pe=ne("http");try{let D=await zt(e,{fetchImpl:d,method:g,headers:T,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 Pe?.("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");Pe?.("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 Te=Ft(b,K("retryAfter")),ut=ne("retry"),Oe=!1;try{P?await new Promise((pe,Y)=>{let _e,Z=()=>{clearTimeout(_e),Ce.call(P,"abort",Z),Y(Pt(P)||new DOMException("Aborted","AbortError"))};if(Q(P)){Z();return}_e=setTimeout(()=>{Ce.call(P,"abort",Z),pe()},Te),vt.call(P,"abort",Z,{once:!0}),Q(P)&&Z()}):await Bt(Te),Oe=!0}finally{ut?.(Oe?"succeeded":"failed")}}}throw x};if(!(n("dedupe")!==!1&&!P&&Be(g,R)))return N();let L=$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)},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 Ue(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 He}from"node:util";function Vt(e){if(!e||typeof e!="object"||He.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(He.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}),"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 je(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 qe(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",Ve="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 Ge(e={}){try{let r=(await A(`${nr}/v2/markets`,e))?.markets;return!Array.isArray(r)||r.length===0?{error:Ve,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:`${Ve} (${String(t.message||t).slice(0,120)})`,venue:"drift",quality:"FAILED"}}}var or="https://gateway.prod.vertexprotocol.com/v2",Ke="Vertex public market API unavailable upstream (gateway TLS eof; /v2/query all_markets not a valid op). Read-only surface stays FAILED until a live endpoint is verified.";async function Je(e={}){try{let r=(await A(`${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:Ke,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:`${Ke} (${String(t.message||t).slice(0,120)})`,venue:"vertex",quality:"FAILED"}}}import{Interface as Se,getAddress as po,isAddress as fo}from"ethers";var We={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}},Yn=new Map(Object.values(We).map(e=>[e.chainId,e]));import{Interface as ir,getAddress as io}from"ethers";var so=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 wo=`0x${"0".repeat(64)}`,yo=Object.freeze({marketSwap:0,limitSwap:1,marketIncrease:2,limitIncrease:3,marketDecrease:4,limitDecrease:5,stopLossDecrease:6,stopIncrease:8}),bo=Object.freeze({noSwap:0,swapPnlTokenToCollateralToken:1,swapCollateralTokenToPnlToken:2}),xo=new Se(["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"]),Eo=new Se(["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)"]),Io=new Se(["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)"]),ko=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,Co=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 je({},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 qe(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 Ge(e);return t?.quality==="FAILED"||t?.error?j("drift",t.error):{venue:"drift",quality:"LIVE",markets:[]}}async function Ir(e={}){let t=await Je(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 Ae={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=>Ae[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||Ae,l=await Promise.all(r.map(a=>wr(a,()=>(s[a]||Ae[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 Ue({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 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,T=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:T,breakevenProbabilityPct:R,verdict:_>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var ii={FARMING_METHODS:Ar,discoverFarms:Or,discoverCarry:Rr,scorePool:st,classifyPool:ot,riskHaircut:it,airdropEV:Lr};export{Ar as FARMING_METHODS,Lr as airdropEV,ot as classifyPool,ii as default,Rr as discoverCarry,Or as discoverFarms,it as riskHaircut,st as scorePool};
|