@oracle-agent/oracle 0.35.40 → 0.35.42

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